Hello I\'m trying to find the distance to the nearest edge, in meters, using the OSMNx (OpenStreetMap + NetworkX) package. This is my code:
def m
OSMnx's get_nearest_edge
does return the distance. See the docs, which say "Optionally return the distance in graph’s coordinates’ units between the point and the nearest edge." If you don't want to work in degrees as your units, just project your graph:
import osmnx as ox
from shapely.geometry import Point
ox.config(use_cache=True, log_console=True)
# lat-long point
point = 34.081076, -118.351811
G = ox.graph_from_point(point, network_type='drive')
# project the graph (and point) to a meter projection
Gp = ox.project_graph(G)
point_geom_proj, crs = ox.projection.project_geometry(Point(reversed(point)), to_crs=Gp.graph['crs'])
x, y = point_geom_proj.x, point_geom_proj.y
# find nearest edge as (u, v, key) and distance to it
u, v, key, dist = ox.get_nearest_edge(Gp, (y, x), return_dist=True)
dist # 40.2 meters
I was able to solve this by changing the Ox.Point function. I wrote a new function to calculate the haversine distance to each coordinate in the LineString object.
from haversine import haversine, Unit
def closest_point_on_haversine(point,edge):
closest_point = None
for c in edge[0].coords:
if closest_point == None:
closest_point = haversine(tuple(reversed(point)), c, unit='m')
else:
if haversine(tuple(reversed(point)), c, unit='m') < closest_point:
closest_point = haversine(tuple(reversed(point)), c, unit='m')
return closest_point
def get_nearest_edge_with_dist(G, point):
start_time = time.time()
gdf = graph_to_gdfs(G, nodes=False, fill_edge_geometry=True)
graph_edges = gdf[["geometry", "u", "v"]].values.tolist()
edges_with_distances = [
(
graph_edge,
# Point(tuple(reversed(point))).distance(graph_edge[0])
closest_point_on_haversine(point,graph_edge)
)
for graph_edge in graph_edges
]
edges_with_distances = sorted(edges_with_distances, key=lambda x: x[1])
closest_edge_to_point, distance = edges_with_distances[0]
geometry, u, v = closest_edge_to_point
return geometry, u, v, distance