diff --git a/.vscode/settings.json b/.vscode/settings.json index 4af5cab9..23a759d2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -36,4 +36,8 @@ ], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, + "files.readonlyInclude": { + "**/.cargo/registry/src/**/*.rs": true, + "**/lib/rustlib/src/rust/library/**/*.rs": true, + } } diff --git a/pyproject.toml b/pyproject.toml index ea35ca84..9e5ada4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cityseer" -version = '4.17.2' +version = '4.17.3' description = "Computational tools for network-based pedestrian-scale urban analysis" readme = "README.md" requires-python = ">=3.10, <3.14" diff --git a/pysrc/cityseer/tools/io.py b/pysrc/cityseer/tools/io.py index b2d4f9f2..a231e9d0 100644 --- a/pysrc/cityseer/tools/io.py +++ b/pysrc/cityseer/tools/io.py @@ -19,6 +19,7 @@ import osmnx as ox import pandas as pd import requests +from osmnx._errors import InsufficientResponseError from pyproj import CRS, Transformer from shapely import geometry from shapely.strtree import STRtree @@ -259,37 +260,46 @@ def _auto_clean_network( # deduplicate by hierarchy G = graphs.nx_deduplicate_edges(G, dissolve_distance=20, max_ang_diff=20) # parks - parks_gdf = ox.features_from_polygon( - geom_wgs, - tags={ - "landuse": ["cemetery", "forest"], - "leisure": ["park", "garden", "sports_centre"], - }, - ) - park_area_gdf = _extract_gdf(parks_gdf) - park_area_gdf = park_area_gdf.to_crs(to_crs_code) + try: + parks_gdf = ox.features_from_polygon( + geom_wgs, + tags={ + "landuse": ["cemetery", "forest"], + "leisure": ["park", "garden", "sports_centre"], + }, + ) + park_area_gdf = _extract_gdf(parks_gdf) + park_area_gdf = park_area_gdf.to_crs(to_crs_code) + except InsufficientResponseError: + park_area_gdf = gpd.GeoDataFrame(columns=["geometry"], geometry="geometry", crs=to_crs_code) # type: ignore # plazas - plazas_gdf = ox.features_from_polygon( - geom_wgs, - tags={ - "highway": ["pedestrian"], - }, - ) - plaza_area_gdf = _extract_gdf(plazas_gdf) - plaza_area_gdf = plaza_area_gdf.to_crs(to_crs_code) + try: + plazas_gdf = ox.features_from_polygon( + geom_wgs, + tags={ + "highway": ["pedestrian"], + }, + ) + plaza_area_gdf = _extract_gdf(plazas_gdf) + plaza_area_gdf = plaza_area_gdf.to_crs(to_crs_code) + except InsufficientResponseError: + plaza_area_gdf = gpd.GeoDataFrame(columns=["geometry"], geometry="geometry", crs=to_crs_code) # type: ignore # parking - parking_gdf = ox.features_from_polygon( - geom_wgs, - tags={ - "amenity": ["parking"], - }, - ) - parking_area_gdf = _extract_gdf(parking_gdf) - parking_area_gdf = parking_area_gdf.to_crs(to_crs_code) + try: + parking_gdf = ox.features_from_polygon( + geom_wgs, + tags={ + "amenity": ["parking"], + }, + ) + parking_area_gdf = _extract_gdf(parking_gdf) + parking_area_gdf = parking_area_gdf.to_crs(to_crs_code) + except InsufficientResponseError: + parking_area_gdf = gpd.GeoDataFrame(columns=["geometry"], geometry="geometry", crs=to_crs_code) # type: ignore # use STR Tree for performance - parks_buff_str_tree = STRtree(park_area_gdf.buffer(5).geometry.to_list()) - plaza_str_tree = STRtree(plaza_area_gdf.geometry.to_list()) - parking_str_tree = STRtree(parking_area_gdf.geometry.to_list()) + parks_buff_str_tree = STRtree(park_area_gdf.buffer(5).geometry.to_list()) # type: ignore + plaza_str_tree = STRtree(plaza_area_gdf.geometry.to_list()) # type: ignore + parking_str_tree = STRtree(parking_area_gdf.geometry.to_list()) # type: ignore # iter edges to find edges for marking remove_edges = [] for start_node_key, end_node_key, edge_key, edge_data in tqdm( # type: ignore diff --git a/pysrc/cityseer/tools/mock.py b/pysrc/cityseer/tools/mock.py index b0304fd5..4d113265 100644 --- a/pysrc/cityseer/tools/mock.py +++ b/pysrc/cityseer/tools/mock.py @@ -463,4 +463,4 @@ def mock_species_data( counts[idx] = (data == uniq).sum() probs = counts / len(data) - yield counts.tolist(), probs.tolist() + yield counts.tolist(), probs.tolist() # type: ignore diff --git a/pysrc/cityseer/tools/plot.py b/pysrc/cityseer/tools/plot.py index e51b9a18..8945a1ab 100644 --- a/pysrc/cityseer/tools/plot.py +++ b/pysrc/cityseer/tools/plot.py @@ -173,7 +173,8 @@ def _plot_graph( _edge_width: int | float | None, ) -> None: if not len(_graph): - raise ValueError("Graph contains no nodes to plot.") + logger.warning("Graph contains no nodes to plot.") + return if not isinstance(_node_size, int) or _node_size < 1: raise ValueError("Node sizes should be a positive integer.") if _node_colour is not None: