Skip to content
This repository was archived by the owner on Jun 10, 2025. It is now read-only.

Commit ca2d57e

Browse files
committed
merge main into #140
1 parent 72a45ad commit ca2d57e

File tree

8 files changed

+758
-842
lines changed

8 files changed

+758
-842
lines changed

Pipfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
[[source]]
2-
url = "https://pypi.python.org/simple"
2+
url = "https://pypi.org/simple"
33
verify_ssl = true
44
name = "pypi"
55

66
[packages]
7-
geojson = ">=3.0.1"
8-
pytest = "7.4.0"
7+
osm2geojson = ">=0.1.30"
98
requests = ">=2.31.0"
10-
shapely = ">=2.0.1"
119

1210
[dev-packages]
11+
geojson = ">=1.3.1"
12+
pytest = "6.0.0"
13+
requests-mock = "*"
1314

1415
[requires]

overpass/api.py

Lines changed: 13 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@
1212
from math import ceil
1313
from typing import Optional
1414

15-
import geojson
1615
import requests
17-
from shapely.geometry import Point, Polygon
16+
from osm2geojson import json2geojson
1817

1918
from .errors import (
2019
MultipleRequestsError,
@@ -131,7 +130,7 @@ def get(self, query, responseformat="geojson", verbosity="body", build=True, dat
131130
return response
132131

133132
# construct geojson
134-
return self._as_geojson(response["elements"])
133+
return json2geojson(response)
135134

136135
@staticmethod
137136
def _api_status() -> dict:
@@ -275,94 +274,16 @@ def _get_from_overpass(self, query):
275274

276275
self._status = r.status_code
277276

278-
if self._status == 200:
279-
r.encoding = "utf-8"
280-
return r
281-
elif self._status == 400:
282-
raise OverpassSyntaxError(query)
283-
elif self._status == 429:
284-
raise MultipleRequestsError()
285-
elif self._status == 504:
286-
raise ServerLoadError(self._timeout)
287-
else:
277+
if self._status != 200:
278+
if self._status == 400:
279+
raise OverpassSyntaxError(query)
280+
elif self._status == 429:
281+
raise MultipleRequestsError()
282+
elif self._status == 504:
283+
raise ServerLoadError(self._timeout)
288284
raise UnknownOverpassError(
289-
f"The request returned status code {self._status}"
285+
"The request returned status code {code}".format(code=self._status)
290286
)
291-
292-
def _as_geojson(self, elements):
293-
ids_already_seen = set()
294-
features = []
295-
geometry = None
296-
for elem in elements:
297-
try:
298-
if elem["id"] in ids_already_seen:
299-
continue
300-
ids_already_seen.add(elem["id"])
301-
except KeyError:
302-
raise UnknownOverpassError("Received corrupt data from Overpass (no id).")
303-
elem_type = elem.get("type")
304-
elem_tags = elem.get("tags", {})
305-
elem_nodes = elem.get("nodes", None)
306-
elem_timestamp = elem.get("timestamp", None)
307-
elem_user = elem.get("user", None)
308-
elem_uid = elem.get("uid", None)
309-
elem_version = elem.get("version", None)
310-
if elem_nodes:
311-
elem_tags["nodes"] = elem_nodes
312-
if elem_user:
313-
elem_tags["user"] = elem_user
314-
if elem_uid:
315-
elem_tags["uid"] = elem_uid
316-
if elem_version:
317-
elem_tags["version"] = elem_version
318-
elem_geom = elem.get("geometry", [])
319-
if elem_type == "node":
320-
# Create Point geometry
321-
geometry = geojson.Point((elem.get("lon"), elem.get("lat")))
322-
elif elem_type == "way":
323-
# Create LineString geometry
324-
geometry = geojson.LineString([(coords["lon"], coords["lat"]) for coords in elem_geom])
325-
elif elem_type == "relation":
326-
# Initialize polygon list
327-
polygons = []
328-
# First obtain the outer polygons
329-
for member in elem.get("members", []):
330-
if member["role"] == "outer":
331-
points = [(coords["lon"], coords["lat"]) for coords in member.get("geometry", [])]
332-
# Check that the outer polygon is complete
333-
if points and points[-1] == points[0]:
334-
polygons.append([points])
335-
else:
336-
raise UnknownOverpassError("Received corrupt data from Overpass (incomplete polygon).")
337-
# Then get the inner polygons
338-
for member in elem.get("members", []):
339-
if member["role"] == "inner":
340-
points = [(coords["lon"], coords["lat"]) for coords in member.get("geometry", [])]
341-
# Check that the inner polygon is complete
342-
if not points or points[-1] != points[0]:
343-
raise UnknownOverpassError("Received corrupt data from Overpass (incomplete polygon).")
344-
# We need to check to which outer polygon the inner polygon belongs
345-
point = Point(points[0])
346-
for poly in polygons:
347-
polygon = Polygon(poly[0])
348-
if polygon.contains(point):
349-
poly.append(points)
350-
break
351-
else:
352-
raise UnknownOverpassError("Received corrupt data from Overpass (inner polygon cannot "
353-
"be matched to outer polygon).")
354-
# Finally create MultiPolygon geometry
355-
if polygons:
356-
geometry = geojson.MultiPolygon(polygons)
357-
else:
358-
raise UnknownOverpassError("Received corrupt data from Overpass (invalid element).")
359-
360-
if geometry:
361-
feature = geojson.Feature(
362-
id=elem["id"],
363-
geometry=geometry,
364-
properties=elem_tags
365-
)
366-
features.append(feature)
367-
368-
return geojson.FeatureCollection(features)
287+
else:
288+
r.encoding = "utf-8"
289+
return r

requirements-dev.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pytest>=7.4.0
22
requests-mock[fixture]
33
tox>=4.6.3
4+
geojson>=1.3.1

requirements.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
1-
geojson>=3.0.1
2-
pytest
1+
osm2geojson>=0.1.30
32
requests>=2.31.0
4-
shapely>=2.0.1

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@
2020
"Topic :: Scientific/Engineering :: GIS",
2121
"Topic :: Utilities",
2222
],
23-
install_requires=["requests>=2.3.0", "geojson>=1.0.9", "shapely>=1.6.4"],
24-
extras_require={"test": ["pytest", "requests-mock[fixture]"]},
23+
install_requires=["requests>=2.3.0", "osm2geojson"],
24+
extras_require={"test": ["pytest", "requests-mock[fixture]", "geojson>=1.0.9"]},
2525
)

0 commit comments

Comments
 (0)