Factorize rows_to_collection
This commit is contained in:
parent
8b5107e6c1
commit
a9af21418b
1 changed files with 19 additions and 19 deletions
38
backend.py
38
backend.py
|
|
@ -46,6 +46,8 @@ class BaseEvent:
|
||||||
'createdate': str(row['createdate']),
|
'createdate': str(row['createdate']),
|
||||||
'last_updated': str(row['lastupdate'])
|
'last_updated': str(row['lastupdate'])
|
||||||
})
|
})
|
||||||
|
if "distance" in row:
|
||||||
|
properties['distance'] = row['distance']
|
||||||
return {
|
return {
|
||||||
"type": "Feature",
|
"type": "Feature",
|
||||||
"geometry": json.loads(row['geometry']),
|
"geometry": json.loads(row['geometry']),
|
||||||
|
|
@ -53,6 +55,12 @@ class BaseEvent:
|
||||||
"properties": properties
|
"properties": properties
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def rows_to_collection(self, rows):
|
||||||
|
return {
|
||||||
|
"type": "FeatureCollection",
|
||||||
|
"features": [self.row_to_feature(r) for r in rows]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class EventsResource(BaseEvent):
|
class EventsResource(BaseEvent):
|
||||||
|
|
||||||
|
|
@ -60,10 +68,7 @@ class EventsResource(BaseEvent):
|
||||||
db = db_connect()
|
db = db_connect()
|
||||||
cur = db.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
cur = db.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
cur.execute("SELECT events_id, events_tags, createdate, lastupdate, st_asgeojson(geom) as geometry FROM events JOIN geo ON (hash=events_geo)")
|
cur.execute("SELECT events_id, events_tags, createdate, lastupdate, st_asgeojson(geom) as geometry FROM events JOIN geo ON (hash=events_geo)")
|
||||||
resp.body = json.dumps({
|
resp.body = json.dumps(self.rows_to_collection(cur.fetchall()))
|
||||||
"type": "FeatureCollection",
|
|
||||||
"features": [self.row_to_feature(r) for r in cur.fetchall()]
|
|
||||||
})
|
|
||||||
resp.status = falcon.HTTP_200
|
resp.status = falcon.HTTP_200
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -95,8 +100,8 @@ class EventResource(BaseEvent):
|
||||||
dist = 1
|
dist = 1
|
||||||
else:
|
else:
|
||||||
dist = req.params['near'][2]
|
dist = req.params['near'][2]
|
||||||
event_bbox = cur.mogrify(" AND ST_Intersects(geom, ST_Buffer(st_setsrid(st_makepoint(%s,%s),4326)::geography,%s)::geometry) ",(req.params['near'][0], req.params['near'][1], dist)).decode("utf-8")
|
event_bbox = cur.mogrify(" AND ST_Intersects(geom, ST_Buffer(st_setsrid(st_makepoint(%s,%s),4326)::geography,%s)::geometry) ", (req.params['near'][0], req.params['near'][1], dist)).decode("utf-8")
|
||||||
event_dist = cur.mogrify(", 'distance', ST_Length(ST_ShortestLine(geom, st_setsrid(st_makepoint(%s,%s),4326))::geography) ",(req.params['near'][0], req.params['near'][1])).decode("utf-8")
|
event_dist = cur.mogrify("ST_Length(ST_ShortestLine(geom, st_setsrid(st_makepoint(%s,%s),4326))::geography) as distance,", (req.params['near'][0], req.params['near'][1])).decode("utf-8")
|
||||||
else:
|
else:
|
||||||
event_bbox = ""
|
event_bbox = ""
|
||||||
event_dist = ""
|
event_dist = ""
|
||||||
|
|
@ -114,7 +119,7 @@ class EventResource(BaseEvent):
|
||||||
# limit search with fixed time (now to stop)
|
# limit search with fixed time (now to stop)
|
||||||
event_when = cur.mogrify("tstzrange(now(),%s,'[]')", (req.params['stop'],)).decode("utf-8")
|
event_when = cur.mogrify("tstzrange(now(),%s,'[]')", (req.params['stop'],)).decode("utf-8")
|
||||||
else:
|
else:
|
||||||
event_when = """tstzrange(now(),now(),'[]')"""
|
event_when = "tstzrange(now(),now(),'[]')"
|
||||||
|
|
||||||
if 'what' in req.params:
|
if 'what' in req.params:
|
||||||
# limit search based on "what"
|
# limit search based on "what"
|
||||||
|
|
@ -134,18 +139,13 @@ class EventResource(BaseEvent):
|
||||||
event_geom = "geom"
|
event_geom = "geom"
|
||||||
|
|
||||||
# Search recent active events.
|
# Search recent active events.
|
||||||
cur.execute("""
|
sql = """SELECT events_id, events_tags, createdate, lastupdate, {event_dist} st_asgeojson({event_geom}) as geometry FROM events JOIN geo ON (hash=events_geo) {event_bbox} WHERE events_when && {event_when} {event_what} {event_type} ORDER BY createdate DESC LIMIT 200"""
|
||||||
SELECT '{"type":"Feature", "properties": '|| (events_tags::jsonb || jsonb_build_object('id',events_id,'createdate',createdate,'lastupdate',lastupdate """+event_dist+"""))::text ||', "geometry":'|| st_asgeojson("""+event_geom+""") ||' }' as feature
|
# No user generated content here, so format is safe.
|
||||||
FROM events
|
sql = sql.format(event_dist=event_dist, event_geom=event_geom,
|
||||||
JOIN geo ON (hash=events_geo) """ + event_bbox +"""
|
event_bbox=event_bbox, event_what=event_what,
|
||||||
WHERE events_when && """+ event_when + event_what + event_type +"""
|
event_when=event_when, event_type=event_type)
|
||||||
ORDER BY createdate DESC
|
cur.execute(sql)
|
||||||
LIMIT 200;
|
resp.body = json.dumps(self.rows_to_collection(cur.fetchall()))
|
||||||
""")
|
|
||||||
resp.body = """{"type":"FeatureCollection", "features": [
|
|
||||||
"""+""",
|
|
||||||
""".join([x[0] for x in cur.fetchall()])+"""
|
|
||||||
]}"""
|
|
||||||
resp.status = falcon.HTTP_200
|
resp.status = falcon.HTTP_200
|
||||||
else:
|
else:
|
||||||
# Get single event geojson Feature by id.
|
# Get single event geojson Feature by id.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue