使用Python+OSM数据计算步行距离始终返回0的问题求助
步行距离计算始终返回0的问题排查与解决
原因分析
- 节点匹配异常:对于Haversine距离非0的记录,若步行距离返回0,大概率是
nearest_nodes将起终点坐标匹配到了同一个节点。可能是路网数据过滤过度,导致目标区域无有效步行节点。 - 过滤规则冲突:同时指定
network_type='walk'和custom_filter会导致重复过滤,network_type='walk'已内置步行道路的筛选逻辑,自定义过滤可能误删必要的连通道路,引发节点匹配或路径计算异常。 - 路网数据损坏:荷兰全国步行路网数据量极大,获取或保存为pickle文件的过程中,可能出现数据丢失或属性错误(比如边的
length被设为0)。
解决建议
1. 验证节点匹配结果
在循环中添加打印语句,确认非重合坐标是否匹配到不同节点:
for index, row in df.iterrows(): origin = ox.distance.nearest_nodes(G_pedestrian, row['LongitudeDeparture'], row['LatitudeDeparture']) destination = ox.distance.nearest_nodes(G_pedestrian, row['LongitudeArrival'], row['LatitudeArrival']) print(f"行{index}: 起点节点={origin}, 终点节点={destination}") walking_distance = calculate_walking_distance(G_pedestrian, origin, destination) walking_distances.append(walking_distance)
若非重合坐标匹配到同一节点,说明路网数据未覆盖该区域,需调整路网获取规则。
2. 调整路网过滤规则
移除custom_filter参数,仅使用network_type='walk',避免过滤过度:
G_pedestrian = ox.graph_from_place('Netherlands', network_type='walk')
3. 检查路网边属性
随机抽取部分边,确认length属性是否正常:
# 查看前10条边的长度属性 for u, v, data in list(G_pedestrian.edges(data=True))[:10]: print(f"边{u}-{v}: 长度={data.get('length', '缺失')}")
若大量边的length为0或缺失,说明路网数据损坏,需重新获取。
4. 测试小规模路网
先尝试获取某城市(如阿姆斯特丹)的步行路网,验证计算逻辑是否正常:
G_test = ox.graph_from_place('Amsterdam, Netherlands', network_type='walk') # 用阿姆斯特丹的两个坐标测试 origin_test = ox.distance.nearest_nodes(G_test, 4.8952, 52.3702) dest_test = ox.distance.nearest_nodes(G_test, 4.9031, 52.3667) print(nx.shortest_path_length(G_test, origin_test, dest_test, weight='length'))
若小规模路网计算正常,说明全国路网数据量过大导致异常,可考虑分区域获取后合并。
5. 重新生成路网文件
删除原pickle文件,重新获取并保存路网,避免数据损坏:
G_pedestrian = ox.graph_from_place('Netherlands', network_type='walk') with open('G_pedestrian.pkl', 'wb') as f: pickle.dump(G_pedestrian, f) # 重新加载测试 with open('G_pedestrian.pkl', 'rb') as f: G_loaded = pickle.load(f)
内容的提问来源于stack exchange,提问作者Wafa Dhool
相关产品推荐
相关产品推荐

