Exemple #1
0
def _make_eval2_conform(evaluations_2):
    """Maps the AvalancheEvaluation2 to the conformity of a common AvalancheDanger object.

    :param evaluations_2:   [list of AvalancheEvaluation2] These are the classes used on getobservations.py
    :return:                [list of AvalancheDanger]
    """

    dangers = []

    for e in evaluations_2:
        region_id = e.ForecastRegionTID
        region_name = e.ForecastRegionName
        data_table = 'AvalancheEvaluation2'
        date = e.DtObsTime
        danger_level = e.AvalancheDangerTID
        danger_level_name = e.AvalancheDangerName

        danger = vc.AvalancheDanger(region_id, region_name, data_table, date,
                                    danger_level, danger_level_name)

        danger.set_avalanche_nowcast(e.AvalancheEvaluation)
        danger.set_avalanche_forecast(e.AvalancheDevelopment)

        danger.set_regid(e.RegID)
        danger.set_source('Observation')
        danger.set_url('{0}{1}'.format(env.registration_basestring, e.RegID))
        danger.set_registration_time(e.DtRegTime)
        danger.set_municipal(e.MunicipalName)
        danger.set_nick(e.NickName)
        danger.set_competence_level(e.CompetenceLevelName)
        danger.add_metadata('Original data', e)

        dangers.append(danger)

    return dangers
Exemple #2
0
def _make_warning_conform(warning):
    """Maps the AvalancheWarning to the conformity of a common AvalancheDanger object.

    :param warning:   [list of AvalancheWarning] These are the classes used on getforecastapi.py
    :return:          [list of AvalancheDanger]
    """

    dangers = []

    for w in warning:
        region_id = w.region_id
        region_name = w.region_name
        data_table = 'AvalancheWarning??'
        date = w.date_valid
        danger_level = w.danger_level
        danger_level_name = w.danger_level_name

        danger = vc.AvalancheDanger(region_id, region_name, data_table, date,
                                    danger_level, danger_level_name)

        danger.set_avalanche_nowcast('{} {} {} {}'.format(
            w.snow_surface, w.current_weak_layers, w.latest_avalanche_activity,
            w.latest_observations))
        danger.set_avalanche_forecast(w.avalanche_danger)

        danger.set_regid(w.reg_id)
        danger.set_source('Forecast')
        danger.set_url('{0}{1}/{2}'.format(env.forecast_basestring,
                                           w.region_name, w.date_valid))
        danger.set_registration_time(w.publish_time)
        danger.set_nick(w.author)
        danger.add_metadata('Original data', w)

        dangers.append(danger)

    return dangers
Exemple #3
0
def get_avalanche_warnings(region_ids,
                           from_date,
                           to_date,
                           lang_key=1,
                           as_dict=False):
    """Selects warnings and returns a list of AvalancheDanger Objects. This method adds the
    avalanche problems to the warning.

    :param region_ids:  [int or list of ints]       RegionID as given in the forecast api [1-99] or in regObs [101-199]
    :param from_date:   [date or string as yyyy-mm-dd]
    :param to_date:     [date or string as yyyy-mm-dd]
    :param lang_key:    [int]                       Language setting. 1 is norwegian and 2 is english.
    :param as_dict:     [bool]                      when True, it returns a list of dictionaries instead of AvalancheDanger objects

    :return avalanche_danger_list: List of AvalancheDanger objects or AvalancheDanger dictionaries (see as_dict)
    """

    warnings_as_json = get_avalanche_warnings_as_json(region_ids,
                                                      from_date,
                                                      to_date,
                                                      lang_key=lang_key)
    avalanche_warning_list = []
    avalanche_danger_list = []
    exception_counter = 0

    for w in warnings_as_json:
        #try:
        region_id = int(w['RegionId'])
        region_name = w['RegionName']
        date = dt.datetime.strptime(w['ValidFrom'][0:10], '%Y-%m-%d').date()
        danger_level = int(w['DangerLevel'])
        danger_level_name = w['DangerLevelName']
        author = w['Author']
        avalanche_forecast = w['AvalancheDanger']

        try:
            avalanche_nowcast = w['AvalancheWarning']
        except:
            avalanche_nowcast = ''
            # ml.log_and_print('No nowcast available.')

        warning = vc.AvalancheDanger(region_id, region_name, 'Forecast API',
                                     date, danger_level, danger_level_name)
        warning.set_source('Forecast')
        warning.set_nick(author)
        warning.set_avalanche_nowcast(avalanche_nowcast)
        warning.set_avalanche_forecast(avalanche_forecast)

        try:
            warning.set_mountain_weather(w['MountainWeather'])
        except:
            # ml.log_and_print('No MountainWeather tag found in json-string - set forecast_api_version to 4.0.1 or higher')
            pass

        # http://www.varsom.no/Snoskred/Senja/?date=18.03.2015
        # http://www.varsom.no/snoskredvarsling/varsel/Indre%20Sogn/2017-01-19
        varsom_name = region_name  # .replace(u'æ', u'a').replace(u'ø', u'o').replace(u'å', u'a')
        varsom_date = date.strftime("%Y-%m-%d")
        url = "http://www.varsom.no/snoskredvarsling/varsel/{0}/{1}".format(
            varsom_name, varsom_date)
        warning.set_url(url)

        if lang_key == 1:
            warning.set_main_message_no(w['MainText'])
        if lang_key == 2:
            warning.set_main_message_en(w['MainText'])

        if w['AvalancheProblems'] is not None:
            for p in w['AvalancheProblems']:

                order = p[
                    'AvalancheProblemId']  # sort order of the avalanche problems in this forecast
                problem_tid = p['AvalancheProblemTypeId']
                problem_name = p['AvalancheProblemTypeName']
                cause_tid = p['AvalCauseId']  # weak layer
                cause_name = p['AvalCauseName']

                aval_main_type_tid = p['AvalancheTypeId']  # used on varsom
                aval_main_type_name = p['AvalancheTypeName']
                aval_type_tid = p['AvalancheExtId']  # used in regObs
                aval_type_name = p['AvalancheExtName']

                destructive_size_tid = p['DestructiveSizeExtId']
                destructive_size_name = p['DestructiveSizeExtName']

                trigger_tid = p['AvalTriggerSimpleId']
                trigger_name = p['AvalTriggerSimpleName']
                distribution_tid = p['AvalPropagationId']
                distribution_name = p['AvalPropagationName']
                probability_tid = p['AvalProbabilityId']
                probability_name = p['AvalProbabilityName']

                exposed_height_1 = p['ExposedHeight1']
                exposed_height_2 = p['ExposedHeight2']
                exposed_height_fill = p[
                    'ExposedHeightFill']  # based on values in exp heigt 1 and 2 this colores the mountain
                valid_expositions = p[
                    'ValidExpositions']  # north is first cahr and it goes clockwize

                problem = vc.AvalancheProblem(region_id,
                                              region_name,
                                              date,
                                              order,
                                              cause_name,
                                              'Forecast',
                                              problem_inn=problem_name)

                problem.set_cause_tid(cause_tid)
                problem.set_problem(problem_name, problem_tid)
                problem.set_aval_type(aval_type_name, aval_type_tid)
                problem.set_aval_size(destructive_size_name,
                                      destructive_size_tid)
                problem.set_aval_trigger(trigger_name, trigger_tid)
                problem.set_aval_distribution(distribution_name)
                problem.set_aval_probability(probability_name)

                problem.set_danger_level(danger_level_name, danger_level)
                problem.set_url(url)

                problem.set_regobs_table('AvalancheWarnProblem')
                problem.set_nick_name(author)
                problem.set_lang_key(lang_key)

                warning.add_problem(problem)

        if as_dict:
            avalanche_warning_list.append(warning.to_dict())
            avalanche_danger_list = sorted(
                avalanche_warning_list,
                key=lambda AvalancheDanger: AvalancheDanger['date'])
        else:
            avalanche_warning_list.append(warning)
            # Sort by date
            avalanche_danger_list = sorted(
                avalanche_warning_list,
                key=lambda AvalancheDanger: AvalancheDanger.date)
        '''
        except:
            ml.log_and_print('[error] getForecastApi -> get_avalanche_warnings: Exception at {0} of {1}'.format(len(avalanche_warning_list) + exception_counter, len(warnings_as_json)))
            exception_counter += 1
        '''

    return avalanche_danger_list