Skip to content

Commit 20c1582

Browse files
committed
Setting 'out geometry;' on asGeoJSON=True queries - geoJSON output
generation is now straight forward, and results look good.
1 parent ebedee0 commit 20c1582

File tree

2 files changed

+20
-44
lines changed

2 files changed

+20
-44
lines changed

overpass/api.py

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
import requests
33
import json
44
import geojson
5-
#from shapely.geometry import mapping, Point
6-
75

86
class API(object):
97
"""A simple Python wrapper for the OpenStreetMap Overpass API"""
@@ -16,6 +14,7 @@ class API(object):
1614
_bbox = [-180.0, -90.0, 180.0, 90.0]
1715

1816
_QUERY_TEMPLATE = "[out:{responseformat}];{query}out body;"
17+
_GEOJSON_QUERY_TEMPLATE = "[out:json];{query}out body geom;"
1918

2019
def __init__(self, *args, **kwargs):
2120
self.endpoint = kwargs.get("endpoint", self._endpoint)
@@ -43,7 +42,7 @@ def Get(self, query, asGeoJSON=False):
4342

4443
try:
4544
response = json.loads(self._GetFromOverpass(
46-
self._ConstructQLQuery(query)))
45+
self._ConstructQLQuery(query, asGeoJSON=asGeoJSON)))
4746
except OverpassException as oe:
4847
print oe
4948
sys.exit(1)
@@ -61,12 +60,18 @@ def Search(self, feature_type, regex=False):
6160
"""Search for something."""
6261
pass
6362

64-
def _ConstructQLQuery(self, userquery):
63+
def _ConstructQLQuery(self, userquery, asGeoJSON=False):
6564
raw_query = str(userquery)
6665
if not raw_query.endswith(";"):
6766
raw_query += ";"
6867

69-
complete_query = self._QUERY_TEMPLATE.format(responseformat=self.responseformat, query=raw_query)
68+
if asGeoJSON:
69+
template = self._GEOJSON_QUERY_TEMPLATE
70+
else:
71+
template = self._QUERY_TEMPLATE
72+
73+
complete_query = template.format(responseformat=self.responseformat, query=raw_query)
74+
7075
if self.debug:
7176
print complete_query
7277
return complete_query
@@ -97,16 +102,7 @@ def _GetFromOverpass(self, query):
97102
return r.text
98103

99104
def _asGeoJSON(self, elements):
100-
"""
101-
Construct geoJSON from elements
102-
TODO: Add secondary overpass call to get coords for ways for nodes not included in elements.
103-
"""
104-
node_elements_by_id = {}
105-
106-
# index node elements by id
107-
for elem in elements:
108-
if elem["type"] == "node":
109-
node_elements_by_id[elem["id"]] = elem
105+
#print 'DEB _asGeoJson elements:', elements
110106

111107
features = []
112108
for elem in elements:
@@ -115,13 +111,8 @@ def _asGeoJSON(self, elements):
115111
geometry=geojson.Point((elem["lon"], elem["lat"]))
116112
elif elem["type"] == "way":
117113
points = []
118-
for node_id in elem["nodes"]:
119-
node_elem = node_elements_by_id.get(node_id)
120-
if node_elem:
121-
point = (node_elem["lon"], node_elem["lat"])
122-
points.append(point)
123-
else
124-
print 'WARNING _asGeoJson skipping missing node ref in way
114+
for coords in elem["geometry"]:
115+
points.append((coords["lon"], coords["lat"]))
125116
geometry = geojson.LineString(points)
126117
else:
127118
continue
@@ -134,22 +125,6 @@ def _asGeoJSON(self, elements):
134125

135126
return geojson.FeatureCollection(features)
136127

137-
'''
138-
nodes = [{
139-
"id": elem.get("id"),
140-
"tags": elem.get("tags")
141-
"geom": Point(elem["lon"], elem["lat"])}
142-
for elem in elements if elem["type"] == "node"]
143-
ways = [{
144-
"id": elem.get("id"),
145-
"tags": elem.get("tags"),
146-
"nodes": elem.get("nodes")}
147-
for elem in elements if elem["type"] == "way"]
148-
'''
149-
150-
151-
152-
153128
class OverpassException(Exception):
154129
def __init__(self, status_code, message):
155130
self.status_code = status_code

test_api.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,18 @@ def test_initialize_api(self):
1010

1111
def test_geojson(self):
1212
api = overpass.API()
13-
osm_elements = api.Get(overpass.MapQuery(37.86517,-122.31851,37.86687,-122.31635))
14-
osm_geo = api.Get(overpass.MapQuery(37.86517,-122.31851,37.86687,-122.31635), asGeoJSON=True)
13+
#osm_elements = api.Get(overpass.MapQuery(37.86517,-122.31851,37.86687,-122.31635))
1514
#print 'DEB osm_elements:', geojson.dumps(osm_elements,sort_keys=True,indent=2)
16-
print 'DEB osm_geo:', geojson.dumps(osm_geo,sort_keys=True,indent=2)
17-
assert len(osm_geo['features']>1)
15+
osm_geo = api.Get(overpass.MapQuery(37.86517,-122.31851,37.86687,-122.31635), asGeoJSON=True)
16+
#with open('test.geojson','w') as f:
17+
# geojson.dump(osm_geo,f,indent=2,sort_keys=True)
18+
assert len(osm_geo['features'])>1
1819

19-
def run_tests():
20+
def run_tests(self):
2021
self.test_initialize_api()
2122
self.test_geojson()
2223

2324
if __name__ == '__main__':
2425
tapi = TestAPI()
25-
tapi.test_geojson()
26+
tapi.run_tests()
2627
print "overpass PASS"

0 commit comments

Comments
 (0)