Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions GrowBikeMVP.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
"city_name = \"Bath\"\n",
"seed_point_spacing = 1707 # distance between seed points, in meters\n",
"crs_projected = \"3857\"\n",
"seed_point_delta = (\n",
"seed_point_snap_distance = (\n",
" 500 # maximal distance between seed point and actual point in OSM data, in meters\n",
")\n",
"method = \"betweenness_centrality\" # specify method via user input/config file later. Each method will need meta-information whether it is a node or an edge method."
Expand Down Expand Up @@ -170,7 +170,7 @@
"outputs": [],
"source": [
"seed_points_snapped = snap_seed_points(seed_points, nodes)\n",
"seed_points_snapped = filter_seed_points(seed_points_snapped, seed_point_delta)"
"seed_points_snapped = filter_seed_points(seed_points_snapped, seed_point_snap_distance)"
]
},
{
Expand Down
26 changes: 13 additions & 13 deletions growbikenet/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def validate_parameters(
ranking,
seed_point_type,
seed_point_grid_spacing,
seed_point_delta,
seed_point_snap_distance,
seed_point_linking,
existing_network_spacing,
export_data,
Expand Down Expand Up @@ -69,10 +69,10 @@ def validate_parameters(
raise ValueError("With seed_point_type 'file', a seed_point_file must be provided")
if seed_point_type == 'tags' and type(seed_point_file) is None:
raise ValueError("With seed_point_type 'tags', seed_point_tags must be provided")
if type(seed_point_delta) is not int and seed_point_delta != 'auto':
raise TypeError("seed_point_delta must be 'auto' or an integer")
if type(seed_point_delta) is int and seed_point_delta <= 0:
raise ValueError("seed_point_delta must be a positive integer")
if type(seed_point_snap_distance) is not int and seed_point_snap_distance != 'auto':
raise TypeError("seed_point_snap_distance must be 'auto' or an integer")
if type(seed_point_snap_distance) is int and seed_point_snap_distance <= 0:
raise ValueError("seed_point_snap_distance must be a positive integer")
if seed_point_linking not in ['auto', 'triangulate_delaunay', 'quadrangulate']:
raise ValueError("seed_point_linking must be 'auto' or 'triangulate_delaunay' or 'quadrangulate'")
if seed_point_linking == 'quadrangulate' and (seed_point_type != 'grid_square' or existing_network_spacing is not None):
Expand Down Expand Up @@ -141,7 +141,7 @@ def slugify(s):
def resolve_auto_parameters(
seed_point_type,
seed_point_grid_spacing,
seed_point_delta,
seed_point_snap_distance,
seed_point_linking,
existing_network_spacing,
phi,
Expand Down Expand Up @@ -208,13 +208,13 @@ def resolve_auto_parameters(
else:
seed_point_grid_spacing = 1707

if seed_point_delta == 'auto':
seed_point_delta = int(np.ceil(seed_point_grid_spacing/4))
if seed_point_snap_distance == 'auto':
seed_point_snap_distance = int(np.ceil(seed_point_grid_spacing/4))

if existing_network_spacing == 'auto':
existing_network_spacing = int(np.ceil(seed_point_grid_spacing/2))

return seed_point_type, seed_point_grid_spacing, seed_point_delta, seed_point_linking, existing_network_spacing
return seed_point_type, seed_point_grid_spacing, seed_point_snap_distance, seed_point_linking, existing_network_spacing

def import_network(street_network_file, crs_projected):
"""Import and project a street network from gpkg file
Expand Down Expand Up @@ -252,7 +252,7 @@ def import_network(street_network_file, crs_projected):
g_undir = g.to_undirected().copy() # convert to undirected (dropping OSMnx keys!)

city_boundary_gdf = gpd.GeoDataFrame(gpd.GeoSeries(nodes.union_all().convex_hull), geometry=0, crs=nodes.crs) # We do this before the projection of nodes below
# To do: To be super-correct, the hull should be buffered by seed_point_delta (in degrees due to being unprojected)
# To do: To be super-correct, the hull should be buffered by seed_point_snap_distance (in degrees due to being unprojected)

nodes, edges = prepare_nodes_edges(nodes, edges, crs_projected)

Expand Down Expand Up @@ -842,14 +842,14 @@ def snap_seed_points(seed_points, nodes):
return seed_points_snapped


def filter_seed_points(seed_points_snapped, seed_point_delta):
def filter_seed_points(seed_points_snapped, seed_point_snap_distance):
"""Remove seed_points that are further than delta away from an actual osm node

Parameters
----------
seed_points_snapped: geopandas.geodataframe.GeoDataFrame
seed_points with additional information about geometries of osm nodes that seed nodes were snapped to
seed_point_delta: int
seed_point_snap_distance: int
maximum distance a seed_point may be removed from an actual osm node

Returns
Expand All @@ -863,7 +863,7 @@ def filter_seed_points(seed_points_snapped, seed_point_delta):
gdf["snap_dist"] = gdf.geometry_generated.distance(gdf.geometry_osm)

# Filter by threshold
gdf = gdf[gdf["snap_dist"] <= seed_point_delta].copy()
gdf = gdf[gdf["snap_dist"] <= seed_point_snap_distance].copy()

# Drop duplicates: one row per osmid
gdf = gdf.sort_values("snap_dist").drop_duplicates("osmid")
Expand Down
14 changes: 7 additions & 7 deletions growbikenet/growbikenet.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def growbikenet(
ranking='betweenness_centrality',
seed_point_type='auto',
seed_point_grid_spacing='auto',
seed_point_delta='auto',
seed_point_snap_distance='auto',
seed_point_linking='auto',
existing_network_spacing=None,
export_data=True,
Expand Down Expand Up @@ -82,9 +82,9 @@ def growbikenet(
Auto-value for seed_point_type 'grid_triangle': 1154
Auto-value otherwise: 1707
These values ensure that any point in the city is always within 500m of the network (under perfect conditions). For case 1707, see [1]_.
seed_point_delta : 'auto' | int, default 'auto'
seed_point_snap_distance : 'auto' | int, default 'auto'
Maximum distance between raw seed points and osm nodes for snapping, in meters.
Auto-value is round(seed_point_grid_spacing/4).
Auto-value is round(seed_point_grid_spacing/4). If integer, must be positive.
seed_point_linking : str ('auto' | 'triangulate_delaunay' | 'quadrangulate'), default 'auto'
The algorithm for linking up the seed points into an unrouted, abstract network.
If set to 'auto', selects 'triangulate_delaunay' or 'quadrangulate' automatically depending on the street network's orientation entropy, see [3]_.
Expand Down Expand Up @@ -167,7 +167,7 @@ def growbikenet(
ranking,
seed_point_type,
seed_point_grid_spacing,
seed_point_delta,
seed_point_snap_distance,
seed_point_linking,
existing_network_spacing,
export_data,
Expand Down Expand Up @@ -231,10 +231,10 @@ def growbikenet(
# Now that the graph is ready, decide auto values
ox.bearing.add_edge_bearings(g_undir)
phi = orientation_order(g_undir)
seed_point_type, seed_point_grid_spacing, seed_point_delta, seed_point_linking, existing_network_spacing = resolve_auto_parameters(
seed_point_type, seed_point_grid_spacing, seed_point_snap_distance, seed_point_linking, existing_network_spacing = resolve_auto_parameters(
seed_point_type,
seed_point_grid_spacing,
seed_point_delta,
seed_point_snap_distance,
seed_point_linking,
existing_network_spacing,
phi,
Expand Down Expand Up @@ -275,7 +275,7 @@ def growbikenet(
mapping = {row.geometry_generated: row.osmid for row in seed_points_snapped.itertuples()}
nx.relabel_nodes(seed_network, mapping, copy=False)
progress_bar.update(1)
seed_points_snapped_filtered = filter_seed_points(seed_points_snapped, seed_point_delta)
seed_points_snapped_filtered = filter_seed_points(seed_points_snapped, seed_point_snap_distance)
if seed_point_linking == "quadrangulate": # Remove all filtered out nodes
filtered_nodes = set(seed_points_snapped.osmid) - set(seed_points_snapped_filtered.osmid)
seed_network.remove_nodes_from(filtered_nodes)
Expand Down
6 changes: 3 additions & 3 deletions tests/test_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ def test_rank_df(test_data_rank, method, validation_data_rank):


@pytest.fixture
def seed_point_delta():
def seed_point_snap_distance():
return 500


Expand Down Expand Up @@ -86,10 +86,10 @@ def filtered_seed_points():


def test_filter_seed_points(
snapped_seed_points, filtered_seed_points, seed_point_delta
snapped_seed_points, filtered_seed_points, seed_point_snap_distance
):
assert_frame_equal(
filter_seed_points(snapped_seed_points, seed_point_delta),
filter_seed_points(snapped_seed_points, seed_point_snap_distance),
filtered_seed_points,
check_dtype=False,
)
Expand Down