forked from codeforamerica/US-Census-Area-API
-
Notifications
You must be signed in to change notification settings - Fork 0
/
geo.py
70 lines (51 loc) · 1.91 KB
/
geo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from shapely import wkb
from util import json_encode
class QueryError (RuntimeError):
pass
def features_geojson(features, json_callback):
'''
'''
geojson = dict(type='FeatureCollection', features=features)
body, mime = json_encode(geojson), 'application/json'
if json_callback:
body = '%s(%s);\n' % (json_callback, body)
mime = 'text/javascript'
return body, mime
def layer_features(layer, include_geom, offset=0, count=25):
'''
'''
features = []
defn = layer.GetLayerDefn()
names = [defn.GetFieldDefn(i).name for i in range(defn.GetFieldCount())]
# Skip leading features
for skip in range(offset):
layer.GetNextFeature()
for feature in layer:
# Stop reading features
if len(features) == count:
break
properties = dict()
for (index, name) in enumerate(names):
properties[name] = feature.GetField(index)
if not include_geom:
features.append(dict(type='Feature', properties=properties, geometry=None))
continue
geometry = feature.GetGeometryRef()
shape = wkb.loads(geometry.ExportToWkb())
features.append(dict(type='Feature', properties=properties, geometry=shape.__geo_interface__))
return features
def get_intersecting_features(datasource, geometry, include_geom):
'''
'''
layer = datasource.GetLayer(0)
layer.SetSpatialFilter(geometry)
return layer_features(layer, include_geom)
def get_matching_features(datasource, where_clause, page_number, include_geom):
'''
'''
layer, offset, count = datasource.GetLayer(0), (page_number - 1) * 25, 25
try:
layer.SetAttributeFilter(where_clause)
except RuntimeError, e:
raise QueryError('Bad where clause: ' + str(e))
return layer_features(layer, include_geom, offset, count)