From 354151dd6d684b2517b88d71832e2a532b6c5e1f Mon Sep 17 00:00:00 2001 From: Michael James Date: Thu, 11 Oct 2018 12:00:10 -0600 Subject: [PATCH] Add getMetarObs() and getSynopticObs() to DataAccessLayer --- awips/dataaccess/DataAccessLayer.py | 65 ++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/awips/dataaccess/DataAccessLayer.py b/awips/dataaccess/DataAccessLayer.py index ecfea5a..b519d4a 100644 --- a/awips/dataaccess/DataAccessLayer.py +++ b/awips/dataaccess/DataAccessLayer.py @@ -21,6 +21,7 @@ # getOptionalIdentifiers() # Oct 07, 2016 ---- mjames@ucar Added getForecastRun # Oct 18, 2016 5916 bsteffen Add setLazyLoadGridLatLon +# Oct 11, 2018 mjames@ucar Added getMetarObs() getSynopticObs() # # @@ -32,7 +33,6 @@ THRIFT_HOST = "edex" USING_NATIVE_THRIFT = False - if 'jep' in sys.modules: # intentionally do not catch if this fails to import, we want it to # be obvious that something is configured wrong when running from within @@ -44,6 +44,69 @@ else: router = ThriftClientRouter.ThriftClientRouter(THRIFT_HOST) USING_NATIVE_THRIFT = True + +def getMetarObs(response): + from datetime import datetime + single_val_params = ["timeObs", "stationName", "longitude", "latitude", + "temperature", "dewpoint", "windDir", + "windSpeed", "seaLevelPress"] + multi_val_params = ["presWeather", "skyCover", "skyLayerBase"] + params = single_val_params + multi_val_params + station_names, pres_weather, sky_cov, sky_layer_base = [],[],[],[] + obs = dict({params: [] for params in params}) + for ob in response: + avail_params = ob.getParameters() + if "presWeather" in avail_params: + pres_weather.append(ob.getString("presWeather")) + elif "skyCover" in avail_params and "skyLayerBase" in avail_params: + sky_cov.append(ob.getString("skyCover")) + sky_layer_base.append(ob.getNumber("skyLayerBase")) + else: + # If we already have a record for this stationName, skip + if ob.getString('stationName') not in station_names: + station_names.append(ob.getString('stationName')) + for param in single_val_params: + if param in avail_params: + if param == 'timeObs': + obs[param].append(datetime.fromtimestamp(ob.getNumber(param) / 1000.0)) + else: + try: + obs[param].append(ob.getNumber(param)) + except TypeError: + obs[param].append(ob.getString(param)) + else: + obs[param].append(None) + + obs['presWeather'].append(pres_weather); + obs['skyCover'].append(sky_cov); + obs['skyLayerBase'].append(sky_layer_base); + pres_weather = [] + sky_cov = [] + sky_layer_base = [] + return obs + + +def getSynopticObs(response): + from datetime import datetime + station_names = [] + params = response[0].getParameters() + sfcobs = dict({params: [] for params in params}) + for sfcob in response: + # If we already have a record for this stationId, skip + if sfcob.getString('stationId') not in station_names: + station_names.append(sfcob.getString('stationId')) + for param in params: + if param == 'timeObs': + sfcobs[param].append(datetime.fromtimestamp(sfcob.getNumber(param) / 1000.0)) + else: + try: + sfcobs[param].append(sfcob.getNumber(param)) + except TypeError: + sfcobs[param].append(sfcob.getString(param)) + + return sfcobs + + def getForecastRun(cycle, times): """ :param cycle: Forecast cycle reference time