Example #1
0
 def is_valid_aggregation(self, **kwargs):
     agg_set = set()
     session = Session()
     agg = session.query(CmaqExposuresList.aggregation).filter(
         CmaqExposuresList.exposure_type == kwargs.get(
             'exposureType')).one()
     session.close()
     for item in agg:
         agg_set.update(item.split(';'))
     if kwargs.get('aggregation') in agg_set:
         return True
     else:
         return False
Example #2
0
 def is_valid_resolution(self, **kwargs):
     res_set = set()
     session = Session()
     res = session.query(CmaqExposuresList.resolution).filter(
         CmaqExposuresList.exposure_type == kwargs.get(
             'exposureType')).one()
     session.close()
     for item in res:
         res_set.update(item.split(';'))
     if kwargs.get('resolution') in res_set:
         return True
     else:
         return False
Example #3
0
def cmaq_get() -> str:
    session = Session()
    results = session.query(CmaqExposuresList).all()
    data = jsonify({
        "cmaq": [
            dict(exposureType=o.exposure_type,
                 exposureUnit=o.exposure_unit,
                 startDate=o.start_date,
                 endDate=o.end_date,
                 resolution=o.resolution.split(';'),
                 aggregation=o.aggregation.split(';')) for o in results
        ]
    })
    return data
Example #4
0
def cmaq_get_values_get(exposureType,
                        startDate,
                        endDate,
                        latLon,
                        resolution=None,
                        aggregation=None,
                        utcOffset=None) -> str:
    session = Session()
    if not session.query(exists().where(
            CmaqExposuresList.exposure_type == exposureType)).scalar():
        return 'Invalid parameter', 400, {
            'x-error': 'Invalid parameter: exposureType'
        }
    session.close()
    from cmaq import CmaqExposures
    cmaq = CmaqExposures()
    kwargs = locals()
    data = cmaq.get_values(**kwargs)

    return data
Example #5
0
 def is_valid_date_range(self, **kwargs):
     session = Session()
     min_date = session.query(CmaqExposuresList.start_date).filter(
         CmaqExposuresList.exposure_type == kwargs.get(
             'exposureType')).one()
     max_date = session.query(CmaqExposuresList.end_date).filter(
         CmaqExposuresList.exposure_type == kwargs.get(
             'exposureType')).one()
     session.close()
     if min_date[0] > datetime.strptime(kwargs.get('endDate'),
                                        "%Y-%m-%d").date():
         return False
     elif max_date[0] < datetime.strptime(kwargs.get('startDate'),
                                          "%Y-%m-%d").date():
         return False
     elif datetime.strptime(kwargs.get('startDate'), "%Y-%m-%d").date() > \
             datetime.strptime(kwargs.get('endDate'), "%Y-%m-%d").date():
         return False
     else:
         return True
Example #6
0
 def get_values(self, **kwargs):
     # exposureType, startDate, endDate, latLon, resolution = None, aggregation = None, utcOffset = None
     # 'UTC', 'US/Central', 'US/Eastern','US/Mountain', 'US/Pacific'
     tzone_dict = {
         'utc': 'UTC',
         'eastern': 'US/Eastern',
         'central': 'US/Central',
         'mountain': 'US/Mountain',
         'pacific': 'US/Pacific'
     }
     # validate input from user
     is_valid, message = self.validate_parameters(**kwargs)
     if not is_valid:
         return message
     # determine exposure type to query
     if kwargs.get('exposureType') == 'pm25':
         exposure = 'pmij'
     else:
         exposure = 'o3'
     # set resolution and aggregate to query
     if kwargs.get('resolution') == 'day':
         exposure += '_' + kwargs.get('aggregation') + '_24'
     elif kwargs.get('resolution') == '7day':
         exposure += '_' + kwargs.get('aggregation') + '_7day'
     elif kwargs.get('resolution') == '14day':
         exposure += '_' + kwargs.get('aggregation') + '_14day'
     # create data object
     data = {}
     data['values'] = []
     # set UTC offset as time zone parameter for query
     dt = datetime.now()
     utc_offset = int(
         str(
             pytz.timezone(tzone_dict.get(kwargs.get(
                 'utcOffset'))).localize(dt) -
             pytz.utc.localize(dt)).split(':')[0])
     # datetime objects for query and output adjustment
     start_time = datetime.strptime(kwargs.get('startDate'), "%Y-%m-%d")
     end_time = datetime.strptime(kwargs.get('endDate'),
                                  "%Y-%m-%d") + timedelta(hours=23)
     # retrieve query result for each lat,lon pair and add to data object
     lat_lon_set = kwargs.get('latLon').split(';')
     for lat_lon in lat_lon_set:
         coords = lat_lon.split(',')
         row, col = latlon2rowcol(coords[0], coords[1],
                                  str(start_time.year))
         session = Session()
         if kwargs.get('resolution') == 'hour':
             # hourly resolution of data - return all hours for date range
             query = session.query(CmaqExposuresDatum.id,
                                   CmaqExposuresDatum.utc_date_time,
                                   getattr(CmaqExposuresDatum, exposure)). \
                 filter(CmaqExposuresDatum.utc_date_time >= start_time + timedelta(hours=utc_offset)). \
                 filter(CmaqExposuresDatum.utc_date_time <= end_time + timedelta(hours=utc_offset)). \
                 filter(CmaqExposuresDatum.row == row). \
                 filter(CmaqExposuresDatum.col == col)
         else:
             # daily resolution of data - return only matched hours for date range
             query = session.query(CmaqExposuresDatum.id,
                                   CmaqExposuresDatum.utc_date_time,
                                   getattr(CmaqExposuresDatum, exposure)).\
                 filter(CmaqExposuresDatum.utc_date_time >= start_time + timedelta(hours=utc_offset)).\
                 filter(CmaqExposuresDatum.utc_date_time <= end_time + timedelta(hours=utc_offset)).\
                 filter(CmaqExposuresDatum.row == row).\
                 filter(CmaqExposuresDatum.col == col).\
                 filter(extract('hour', CmaqExposuresDatum.utc_date_time) == utc_offset)
         session.close()
         # add query output to data object in JSON structured format
         for cmaq_id, cmaq_date_time, cmaq_exp in query:
             # print(cmaq_id, cmaq_date_time, cmaq_exp)
             data['values'].append({
                 'dateTime': cmaq_date_time,
                 'latLon': lat_lon,
                 'value': str(cmaq_exp)
             })
     return jsonify(data)