Skip to content

Commit ebedee0

Browse files
committed
First crack at geoJSON output
TODO: retrieve missing nodes referenced in ways to get their coords.
1 parent 98e731f commit ebedee0

File tree

5 files changed

+73
-13
lines changed

5 files changed

+73
-13
lines changed

.gitignore

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
*~
2+
*.swp
3+
.DS_Store
14
*.pyc
2-
build
3-
dist
4-
overpass.egg-info
5+
6+
/build/
7+
/dist/
8+
/*.egg-info

overpass/api.py

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import sys
22
import requests
33
import json
4-
from shapely.geometry import mapping, Point
4+
import geojson
5+
#from shapely.geometry import mapping, Point
56

67

78
class API(object):
@@ -96,23 +97,62 @@ def _GetFromOverpass(self, query):
9697
return r.text
9798

9899
def _asGeoJSON(self, elements):
99-
"""construct geoJSON from 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
110+
111+
features = []
112+
for elem in elements:
113+
elem_type = elem["type"]
114+
if elem["type"] == "node":
115+
geometry=geojson.Point((elem["lon"], elem["lat"]))
116+
elif elem["type"] == "way":
117+
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
125+
geometry = geojson.LineString(points)
126+
else:
127+
continue
128+
129+
feature = geojson.Feature(
130+
id=elem["id"],
131+
geometry=geometry,
132+
properties=elem.get("tags"))
133+
features.append(feature)
134+
135+
return geojson.FeatureCollection(features)
136+
137+
'''
100138
nodes = [{
101139
"id": elem.get("id"),
102-
"tags": elem.get("tags"),
140+
"tags": elem.get("tags")
103141
"geom": Point(elem["lon"], elem["lat"])}
104142
for elem in elements if elem["type"] == "node"]
105143
ways = [{
106144
"id": elem.get("id"),
107145
"tags": elem.get("tags"),
108146
"nodes": elem.get("nodes")}
109147
for elem in elements if elem["type"] == "way"]
110-
print nodes
111-
print ways
148+
'''
149+
150+
151+
112152

113153
class OverpassException(Exception):
114154
def __init__(self, status_code, message):
115155
self.status_code = status_code
116156
self.message = message
117157
def __str__(self):
118-
return json.dumps({'status': self.status_code, 'message': self.message})
158+
return json.dumps({'status': self.status_code, 'message': self.message})

requirements.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
download_url='https://github.com/mvexel/overpass-api-python-wrapper/tarball/0.0.1',
1212
keywords=['openstreetmap', 'overpass', 'wrapper'],
1313
classifiers=[],
14-
install_requires=['requests>=2.3.0', 'shapely>=1.4.3'],
14+
install_requires=['requests>=2.3.0', 'geojson>=1.0.9'],
1515
)

test_api.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
1+
import geojson
12
import overpass
23

3-
44
class TestAPI:
55

66
def test_initialize_api(self):
77
api = overpass.API()
88
assert isinstance(api, overpass.API)
9-
assert api.debug == False
9+
assert api.debug == False
10+
11+
def test_geojson(self):
12+
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)
15+
#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)
18+
19+
def run_tests():
20+
self.test_initialize_api()
21+
self.test_geojson()
22+
23+
if __name__ == '__main__':
24+
tapi = TestAPI()
25+
tapi.test_geojson()
26+
print "overpass PASS"

0 commit comments

Comments
 (0)