22import requests
33import json
44import geojson
5- #from shapely.geometry import mapping, Point
6-
75
86class 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-
153128class OverpassException (Exception ):
154129 def __init__ (self , status_code , message ):
155130 self .status_code = status_code
0 commit comments