11import sys
22import requests
33import json
4- from shapely .geometry import Point
5-
4+ import geojson
65
76class API (object ):
87 """A simple Python wrapper for the OpenStreetMap Overpass API"""
@@ -15,6 +14,7 @@ class API(object):
1514 _bbox = [- 180.0 , - 90.0 , 180.0 , 90.0 ]
1615
1716 _QUERY_TEMPLATE = "[out:{responseformat}];{query}out body;"
17+ _GEOJSON_QUERY_TEMPLATE = "[out:json];{query}out body geom;"
1818
1919 def __init__ (self , * args , ** kwargs ):
2020 self .endpoint = kwargs .get ("endpoint" , self ._endpoint )
@@ -42,7 +42,7 @@ def Get(self, query, asGeoJSON=False):
4242
4343 try :
4444 response = json .loads (self ._GetFromOverpass (
45- self ._ConstructQLQuery (query )))
45+ self ._ConstructQLQuery (query , asGeoJSON = asGeoJSON )))
4646 except OverpassException as oe :
4747 print (oe )
4848 sys .exit (1 )
@@ -60,12 +60,18 @@ def Search(self, feature_type, regex=False):
6060 """Search for something."""
6161 pass
6262
63- def _ConstructQLQuery (self , userquery ):
63+ def _ConstructQLQuery (self , userquery , asGeoJSON = False ):
6464 raw_query = str (userquery )
6565 if not raw_query .endswith (";" ):
6666 raw_query += ";"
6767
68- 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+
6975 if self .debug :
7076 print (complete_query )
7177 return complete_query
@@ -96,20 +102,28 @@ def _GetFromOverpass(self, query):
96102 return r .text
97103
98104 def _asGeoJSON (self , elements ):
99- """construct geoJSON from elements"""
100- nodes = [{
101- "id" : elem .get ("id" ),
102- "tags" : elem .get ("tags" ),
103- "geom" : Point (elem ["lon" ], elem ["lat" ])}
104- for elem in elements if elem ["type" ] == "node" ]
105- ways = [{
106- "id" : elem .get ("id" ),
107- "tags" : elem .get ("tags" ),
108- "nodes" : elem .get ("nodes" )}
109- for elem in elements if elem ["type" ] == "way" ]
110- print (nodes )
111- print (ways )
105+ #print 'DEB _asGeoJson elements:', elements
106+
107+ features = []
108+ for elem in elements :
109+ elem_type = elem ["type" ]
110+ if elem ["type" ] == "node" :
111+ geometry = geojson .Point ((elem ["lon" ], elem ["lat" ]))
112+ elif elem ["type" ] == "way" :
113+ points = []
114+ for coords in elem ["geometry" ]:
115+ points .append ((coords ["lon" ], coords ["lat" ]))
116+ geometry = geojson .LineString (points )
117+ else :
118+ continue
119+
120+ feature = geojson .Feature (
121+ id = elem ["id" ],
122+ geometry = geometry ,
123+ properties = elem .get ("tags" ))
124+ features .append (feature )
112125
126+ return geojson .FeatureCollection (features )
113127
114128class OverpassException (Exception ):
115129 def __init__ (self , status_code , message ):
0 commit comments