catch empty response instead of failing

If a street is present in the layers with a custom filter that does not
exist in the specified area, osmnx throws an exception and the whole
plotting fails. I suggest catching the exception and just returning an
empty `MultiLineString`. Maybe a warning could also be added, to inform
that the requested street is not present in the result.
This commit is contained in:
Sandro Covo
2021-09-07 09:03:43 +02:00
parent 560ecf95ca
commit ca33f516b9

View File

@@ -2,6 +2,7 @@ from functools import reduce
import osmnx as ox import osmnx as ox
from osmnx import utils_geo from osmnx import utils_geo
from osmnx._errors import EmptyOverpassResponse
import numpy as np import numpy as np
from shapely.geometry import Point, Polygon, MultiPolygon, MultiLineString from shapely.geometry import Point, Polygon, MultiPolygon, MultiLineString
from shapely.ops import unary_union from shapely.ops import unary_union
@@ -166,32 +167,38 @@ def get_streets(
# Boundary defined by polygon (perimeter) # Boundary defined by polygon (perimeter)
if perimeter is not None: if perimeter is not None:
# Fetch streets data, project & convert to GDF # Fetch streets data, project & convert to GDF
streets = ox.graph_from_polygon( try:
unary_union(perimeter.geometry).buffer(buffer) streets = ox.graph_from_polygon(
if buffer > 0 unary_union(perimeter.geometry).buffer(buffer)
else unary_union(perimeter.geometry), if buffer > 0
custom_filter=custom_filter, else unary_union(perimeter.geometry),
) custom_filter=custom_filter,
streets = ox.project_graph(streets) )
streets = ox.graph_to_gdfs(streets, nodes=False) streets = ox.project_graph(streets)
streets = ox.graph_to_gdfs(streets, nodes=False)
except EmptyOverpassResponse:
return MultiLineString()
# Boundary defined by polygon (perimeter) # Boundary defined by polygon (perimeter)
elif (point is not None) and (radius is not None): elif (point is not None) and (radius is not None):
# Fetch streets data, save CRS & project # Fetch streets data, save CRS & project
streets = ox.graph_from_point( try:
point, streets = ox.graph_from_point(
dist=radius + dilate + buffer, point,
retain_all=retain_all, dist=radius + dilate + buffer,
custom_filter=custom_filter, retain_all=retain_all,
) custom_filter=custom_filter,
crs = ox.graph_to_gdfs(streets, nodes=False).crs )
streets = ox.project_graph(streets) crs = ox.graph_to_gdfs(streets, nodes=False).crs
# Compute perimeter from point & CRS streets = ox.project_graph(streets)
perimeter = get_boundary(point, radius, crs, circle=circle, dilate=dilate) # Compute perimeter from point & CRS
# Convert to GDF perimeter = get_boundary(point, radius, crs, circle=circle, dilate=dilate)
streets = ox.graph_to_gdfs(streets, nodes=False) # Convert to GDF
# Intersect with perimeter & filter empty elements streets = ox.graph_to_gdfs(streets, nodes=False)
streets.geometry = streets.geometry.intersection(perimeter) # Intersect with perimeter & filter empty elements
streets = streets[~streets.geometry.is_empty] streets.geometry = streets.geometry.intersection(perimeter)
streets = streets[~streets.geometry.is_empty]
except EmptyOverpassResponse:
return MultiLineString()
if type(width) == dict: if type(width) == dict:
streets = unary_union( streets = unary_union(