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的离线路网文件,本地处理。
步骤与示例代码
- 从Geofabrik下载目标城市的OSM离线数据(格式为
.osm.pbf) - 用
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
相关产品推荐
相关产品推荐

