def get_weather(): dcid = request.args.get('dcid') prop = request.args.get('prop') if not dcid: flask.abort('Missing url parameter "dcid"', 400) if not prop: flask.abort('Missing url parameter "prop"', 400) query_string = ('SELECT ?date ?mean ?unit ' 'WHERE {{' ' ?o typeOf WeatherObservation .' ' ?o observedNode {dcid} .' ' ?o measuredProperty {prop} .' ' ?o observationDate ?date .' ' ?o unit ?unit .' ' ?o meanValue ?mean .}}').format(dcid=dcid, prop=prop) _, rows = dc.query(query_string) observations = [] for row in rows: date = row['cells'][0]['value'] if date < '2000': continue text = 'mean {}: {} {}'.format(prop, row['cells'][1]['value'], row['cells'][2]['value']) observations.append({ 'measuredProperty': prop, 'observationDate': date, 'meanValue': row['cells'][1]['value'], 'unit': row['cells'][2]['value'], 'text': text, }) return json.dumps(observations)
def get_observation_id(): """Returns the observation node dcid for a combination of predicates: observedNodeLocation, statisticalVariable, date, measurementMethod optional), observationPeriod (optional)""" place_id = request.args.get("place") if not place_id: return Response(json.dumps("error: must provide a place field"), 400, mimetype='application/json') stat_var_id = request.args.get("statVar") if not stat_var_id: return Response(json.dumps("error: must provide a statVar field"), 400, mimetype='application/json') date = request.args.get("date", "") if not date: return Response(json.dumps("error: must provide a date field"), 400, mimetype='application/json') request_mmethod = request.args.get("measurementMethod", NO_MMETHOD_KEY) request_obsPeriod = request.args.get("obsPeriod", NO_OBSPERIOD_KEY) sparql_query = get_sparql_query(place_id, stat_var_id, date) result = "" (_, rows) = dc.query(sparql_query) for row in rows: cells = row.get('cells', []) if len(cells) != 3: continue dcid = cells[0].get('value', '') mmethod = cells[1].get('value', NO_MMETHOD_KEY) obsPeriod = cells[2].get('value', NO_OBSPERIOD_KEY) if mmethod == request_mmethod and obsPeriod == request_obsPeriod: result = dcid break return Response(json.dumps(result), 200, mimetype='application/json')
def get_observation_ids(): """Returns a mapping of date to observation node dcid for a combination of predicates: observedNodeLocation, statisticalVariable, measurementMethod (optional), observationPeriod (optional)""" place_id = request.args.get("place") if not place_id: return Response(json.dumps("error: must provide a place field"), 400, mimetype='application/json') stat_var_id = request.args.get("statVar") if not stat_var_id: return Response(json.dumps("error: must provide a statVar field"), 400, mimetype='application/json') measurement_method = request.args.get("measurementMethod", "") observation_period = request.args.get("obsPeriod", "") measurement_method_triple = "" if measurement_method: measurement_method_triple = f"""?svObservation measurementMethod {measurement_method} .""" observation_period_triple = "" if observation_period: observation_period_triple = f"""?svObservation observationPeriod {observation_period} .""" sparql_query = ''' SELECT ?dcid ?obsDate WHERE {{ ?svObservation typeOf StatVarObservation . ?svObservation variableMeasured {} . ?svObservation observationAbout {} . ?svObservation dcid ?dcid . ?svObservation observationDate ?obsDate . {} {} }} '''.format(stat_var_id, place_id, measurement_method_triple, observation_period_triple) result = "" (_, rows) = dc.query(sparql_query) result = {} for row in rows: cells = row.get('cells', []) if len(cells) != 2: continue obsDate = cells[1].get('value', '') dcid = cells[0].get('value', '') result[obsDate] = dcid return Response(json.dumps(result), 200, mimetype='application/json')