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
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
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