You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何获取符合误差要求的出租车上下车点驾驶距离?

免费获取驾驶距离的Python教学解决方案

针对你的出租车行程数据集需求,haversine和geopy只能计算直线距离,无法满足驾驶路径距离的要求。以下是几个完全免费、适合教学场景的解决方案:


1. OSMnx + OpenStreetMap 在线路网计算

OSMnx可以直接调用免费的OpenStreetMap路网数据,计算两点间的最短驾驶路径距离,是教学场景下最易用的方案。

步骤与示例代码

  • 先安装依赖:pip install osmnx geopandas
  • 核心代码:
import osmnx as ox

# 假设你从Multipolygon中提取的随机点是(lat, lon)格式的元组
start_point = (40.7128, -74.0060)  # 示例起点坐标
end_point = (40.7308, -73.9973)    # 示例终点坐标
trip_miles = 1.5                   # 数据集中的行程英里数

# 获取起点周边5公里范围内的可驾驶路网(缩小范围提升计算速度)
G = ox.graph_from_point(start_point, dist=5000, network_type='drive')

# 匹配路网中离起点、终点最近的节点
start_node = ox.distance.nearest_nodes(G, start_point[1], start_point[0])
end_node = ox.distance.nearest_nodes(G, end_point[1], end_point[0])

# 计算最短路径距离(单位:米),转换为英里(1英里≈1609.34米)
route_length_m = ox.distance.shortest_path_length(G, start_node, end_node, weight='length')
route_length_miles = route_length_m / 1609.34

# 验证你需要的差值条件
diff = abs(trip_miles - route_length_miles)
diff_ratio = diff / trip_miles

注意事项

  • 若数据集覆盖多个城市,可以提前按区域批量下载路网,避免重复请求
  • 计算结果是路网最短距离,和实际出租车行驶路径可能有细微偏差,但完全满足教学需求

2. 离线路网数据 + NetworkX 批量处理

如果需要处理大量数据,不想依赖在线请求,可以下载OpenStreetMap的离线路网文件,本地处理。

步骤与示例代码

  1. 从Geofabrik下载目标城市的OSM离线数据(格式为.osm.pbf)
  2. 用pyrosm加载并转换为NetworkX图结构:
from pyrosm import OSM
import networkx as nx

# 加载离线OSM数据
osm = OSM("new-york-latest.osm.pbf")
# 提取可驾驶路网
drive_network = osm.get_network(network_type="driving")
# 转换为NetworkX图
G = drive_network.to_graph()

# 后续节点匹配、距离计算步骤和OSMnx示例一致

3. 免费开源路由API(小批量数据)

OpenRouteService提供免费的路由API(免费版每日限2000次请求),适合小批量数据的教学演示。

示例代码

import requests

# 先去OpenRouteService官网注册免费账号,获取API密钥
api_key = "你的免费API密钥"
start_lon, start_lat = start_point[1], start_point[0]
end_lon, end_lat = end_point[1], end_point[0]

# 发送驾驶路径请求
url = f"https://api.openrouteservice.org/v2/directions/driving-car?api_key={api_key}&start={start_lon},{start_lat}&end={end_lon},{end_lat}"
response = requests.get(url)
data = response.json()

# 提取距离并转换为英里
route_length_m = data['features'][0]['properties']['segments'][0]['distance']
route_length_miles = route_length_m / 1609.34

通用优化建议

  • 统一单位:确保所有距离计算都转换成英里,和trip miles字段匹配
  • 点约束:从Multipolygon提取随机点时,可先筛选出道路附近的点,避免节点匹配偏差
  • 批量处理:提前按区域划分数据集,复用同一路网数据,提升计算效率

内容的提问来源于stack exchange,提问作者abs8090

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:31:20