Description

当使用OSMnx计算两个位置之间的最短路径时,ox.shortest_path()未能获得任何路由并返回None

origin_lat=42.482, origin_lon=-70.910, dest_lat=42.472, dest_lon=-70.957

我查询的点很正常,即彼此之间不是超远/近,并且之间有清晰的道路网络.

以下是我使用OSM网页时的结果: Routing Results with OSM Webpage

My Questions:

  1. 这个问题的根本原因是什么?
  2. 我可以做些什么来防止这个问题?
  3. 如果在某些情况下这是无法预防的,那么建议我使用哪些备份/替代方案来保持我的代码在合理的路由/距离上运行?

Minimal reproducible example

from shapely.geometry import Polygon
import osmnx as ox

region_bounds = [
    [42.49897315546415, -70.97752844338558],
    [42.497310679689555, -70.89216747227316],
    [42.45989329011355, -70.90617955621047],
    [42.457041524105065, -70.97768950182164],
]
region_bounds.append(region_bounds[-1])

region_polygon = Polygon([bounds[::-1] for bounds in region_bounds])

mode = "drive"

G = ox.graph_from_polygon(polygon=region_polygon, network_type=mode)
G = ox.add_edge_speeds(G)
G = ox.add_edge_travel_times(G)

origin_lat = 42.482
origin_lon = -70.910

dest_lat = 42.472
dest_lon = -70.957

origin_nodes = ox.distance.nearest_nodes(G, origin_lon, origin_lat)
dest_nodes = ox.distance.nearest_nodes(G, dest_lon, dest_lat)

routes = ox.shortest_path(G, origin_nodes, dest_nodes)

print(origin_nodes, dest_nodes, routes)

输出为68758830 65236189 None,这意味着ox.distance.nearest_nodes找到了有效的源 node 和目的地 node ,但ox.shortest_path失败了.

Expected behavior

当我将查询稍微更改为

origin_lat = 42.452
origin_lon = -70.910

dest_lat = 42.472
dest_lon = -70.957

上面的代码可以查找有效路由

68754328 65236189 [68754328, 68752028, 68757205, 68766524, 68769796, 68777219, 68761577, 68759405, 68766786, 68747897, 68755811, 68764727, 68765868, 68755029, 2041487395, 2041487385, 68758705, 68771074, 68751303, 68770735, 68747441, 65186124, 65232064, 65258971, 65258184, 65198797, 65243553, 2041154812, 65261211, 65218821, 65210373, 65208978, 65255290, 65231546, 65190866, 65226679, 65193542, 65239462, 65225225, 2041270157, 65257919, 65186045, 2041270160, 65262590, 2041270186, 65252676, 65232296, 65242158, 65261501, 65221801, 65251183, 65190759, 65218681, 65222417, 2043144587, 65250858, 2043144592, 65247406, 65224701, 65231219, 65202428, 65242218, 65235268, 65197313, 65240735, 65207550, 2045575158, 65227845, 65229809, 65190291, 65217006, 2045610191, 9966458026, 65195913, 65214016, 65241686, 65240704, 65202519, 65201239, 65242936, 65233288, 65186829, 65199167, 65239099, 65242030, 65237992, 65236189]

推荐答案

这个问题的根本原因是什么?

原因是这种OSM方式:https://www.openstreetmap.org/way/1243001416

它被数字化为进入这个社区的单向街道.没有数字化的出境方式.因此,您可以解决进入社区的路由,但由于单向,您无法解决从社区的路由.

我可以做些什么来防止这个问题?

据推测,这是一次错误的数字化,因为没有其他路由进出这个社区.它不可能是单向的,也不可能没有从这个社区出go .如果是这样,防止此问题的最佳方法是对OpenStreetMap本身进行更正.

替代方案是编辑您的OSMnx模型以添加相互单向边缘以允许双向访问.

如果在某些情况下这是无法预防的,那么建议我使用哪些备份/替代方案来保持我的代码在合理的路由/距离上运行?

这并非不可预防.如果模型出现这样不可能的情况,上述解决方案之一将解决它.要么修复OpenStreetMap上的潜在数字化错误,要么在OSMnx模型中修复它(例如,添加边缘).

Python相关问答推荐

如果条件为真,则Groupby.mean()

替换字符串中的多个重叠子字符串

试图找到Python方法来部分填充numpy数组

需要计算60,000个坐标之间的距离

海运图:调整行和列标签

scikit-learn导入无法导入名称METRIC_MAPPING64'

无法通过python-jira访问jira工作日志(log)中的 comments

为什么默认情况下所有Python类都是可调用的?

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

在pandas中使用group_by,但有条件

在Python中使用yaml渲染(多行字符串)

导入错误:无法导入名称';操作';

将一个双框爆炸到另一个双框的范围内

如何将一组组合框重置回无 Select tkinter?

如何在PythonPandas 中对同一个浮动列进行逐行划分?

来自Airflow Connection的额外参数

Polars表达式无法访问中间列创建表达式

Matplotlib中的曲线箭头样式

如何让PYTHON上的Selify连接到现有的Firefox实例-我无法连接到Marionette端口

如何在Python中画一个只能在对角线内裁剪的圆?