物流配送系统绕不开一个核心问题:怎么给一辆车规划出最优的配送路线?
这个问题看起来简单——起点、终点、途经点,算一条路就行了。但真正落地的时候,你会发现坑一个接一个:途经点数量超限、货车限行规则对不上、坐标系不兼容、多车调度算不出来……选错了API,轻则频繁返工,重则末端配送效率直接拉胯。
这篇文章从一个物流技术负责人的视角,拆解路径规划到底需要哪些能力,再逐一对比四家主流地图平台(高德、百度、腾讯、丰图)的API参数和适配度,最后给出不同规模物流场景的选型建议。
一、物流路径规划的核心痛点
做过物流系统的人都知道,路径规划不是"算一条路"这么简单。真实业务场景里有几个很硬的约束:
1. 途经点数量多
一个配送车一趟下来,少则10个点多则50个点。城市配送场景下,30+个配送点是常态。如果API的途经点上限不够,就得分批调用、拆分路线——拆分后的子路线是独立优化的,不是全局最优,直接导致配送效率下降。
2. 货车限行规则
物流车辆不是普通小轿车。货车有载重限制、限行区域、限行时段,路径规划必须考虑这些约束。如果API只支持小客车路径规划,那规划出来的路线可能经过货车禁行路段,司机走到一半发现过不去,只能绕路。
3. 实时路况
物流讲究时效。同样的路线,早高峰和凌晨走完的时间可能差一倍。路径规划如果不结合实时路况,预估到达时间就不准,客户体验直接受影响。
4. 坐标系兼容
物流系统的地址数据往往来自多个来源——ERP系统、GPS设备、第三方物流平台。不同来源的数据可能使用不同坐标系(GCJ-02、BD-09、WGS-84),直接混用会导致位置偏移几百米。
5. 多车调度
当配送点分配到多辆车时,需要全局最优的分配方案,而不是每辆车各自为战。虽然路径规划API本身不一定能解决多车调度,但途经点容量和计算性能直接影响调度方案的可行性。
二、需求拆解:物流路径规划需要哪些API能力?
把上面的痛点翻译成API能力需求,就是这些:
| 需求维度 | 具体要求 | 为什么重要 |
|---|---|---|
| 途经点容量 | 至少支持30+个途经点 | 覆盖单次配送的完整路线 |
| 货车路径规划 | 支持货车类型、载重、限行规则 | 避免规划出货车禁行路线 |
| 路线策略 | 时间优先、距离最短、避开高速等 | 不同业务场景需要不同策略 |
| 实时路况 | 结合当前路况计算最优路线 | 预估到达时间准确 |
| 坐标系支持 | GCJ-02为主,兼容BD-09 | 避免跨平台数据偏移 |
| 返回值信息 | 距离、时间、导航步骤、路线坐标 | 前端展示和后端计算都需要 |
| 批量调用能力 | QPS够高、响应够快 | 高峰期不卡顿 |
下面逐一拆解四家平台的能力。
三、四家平台路径规划API对比
3.1 丰图开放平台
接口地址:POST https://gis-apis.sf-express.com/openplatform/middleService/normalCarRoutePlan
核心参数:
| 参数 | 说明 | 格式 |
|---|---|---|
| ak | 开发者密钥 | Header中传递,不是URL参数 |
| x1/y1 | 起点经纬度 | 经度在前,纬度在后 |
| x2/y2 | 终点+途经点 | 支持最多100个途经点 |
| vehicle | 车辆类型 | 1-9类,货车选6(轻型)、7(中型)、8(重型) |
| strategy | 路径策略 | 时间优先、费用最少、距离最短等 |
| cc | 坐标系 | 1=GCJ-02,2=BD-09 |
返回值:距离(米)、时长(秒)、路桥费、高速距离、红绿灯数量、导航引导信息
特点:
- 途经点容量是四家中最大的(100个),一次调用可以覆盖全城级配送规模
- 支持完整的货车类型和限行规则
- 支持坐标系切换,从BD-09迁移过来不需要额外转坐标
- ak放在Header里传递(其他三家都在URL参数里),容易踩坑
Python调用示例:
import requests
def fengtu_route(start_lng, start_lat, end_lng, end_lat, ak,
vehicle=1, strategy=0):
"""丰图路径规划调用"""
url = "https://gis-apis.sf-express.com/openplatform/middleService/normalCarRoutePlan"
payload = {
"x1": start_lng,
"y1": start_lat,
"x2": end_lng,
"y2": end_lat,
"vehicle": vehicle, # 1=小车, 6=轻型货车, 7=中型货车
"strategy": strategy, # 0=时间优先
"cc": 1 # GCJ-02坐标系
}
headers = {"ak": ak} # 注意:ak在Header里
response = requests.post(url, params=payload, headers=headers)
result = response.json()
if result.get("success") and result.get("code") == 200:
data = result.get("result", {})
return {
"distance": data.get("dist"), # 距离(米)
"duration": data.get("time"), # 时长(秒)
"tolls": data.get("tolls"), # 路桥费
"highway_dist": data.get("highway"), # 高速距离
"traffic_lights": data.get("traLightCount"), # 红绿灯
"steps": data.get("steps", []) # 导航步骤
}
return {"error": result.get("message")}
3.2 高德地图
接口地址:GET https://restapi.amap.com/v5/direction/driving
核心参数:
| 参数 | 说明 | 格式 |
|---|---|---|
| key | API Key | URL参数传递 |
| origin | 起点 | 经度,纬度 |
| destination | 终点 | 经度,纬度 |
| waypoints | 途经点 | 经度1,纬度1;经度2,纬度2,最多16个 |
| strategy | 路径策略 | 0=速度最快,32=躲避拥堵等 |
| show_fields | 返回扩展信息 | tmcs(路况)、cost(费用)等 |
特点:
- 文档质量业内公认最好,示例丰富
- 路径规划算法成熟,通用驾车场景优化到位
- 途经点上限16个,30+个配送点需要拆分多次调用
- 坐标系为GCJ-02
- 实时路况和导航体验经过大量用户验证
Python调用示例:
import requests
def amap_route(origin, destination, waypoints="", strategy=0):
"""高德路径规划调用"""
url = "https://restapi.amap.com/v5/direction/driving"
params = {
"key": "YOUR_AMAP_KEY",
"origin": f"{origin[0]},{origin[1]}",
"destination": f"{destination[0]},{destination[1]}",
"waypoints": waypoints, # "lng1,lat1;lng2,lat2"
"strategy": strategy,
"show_fields": "cost,tmcs" # 返回费用和路况
}
response = requests.get(url, params=params)
result = response.json()
if result.get("status") == "1": # 注意:status是字符串
route = result["route"]["paths"][0]
return {
"distance": int(route["distance"]), # 距离(米)
"duration": int(route["cost"]["duration"]), # 时长(秒)
"tolls": route["cost"].get("tolls", "0")
}
return {"error": result.get("info")}
3.3 百度地图
接口地址:GET https://api.map.baidu.com/directionlite/v1/driving
核心参数:
| 参数 | 说明 | 格式 |
|---|---|---|
| ak | API Key | URL参数传递 |
| origin | 起点 | 纬度,经度(注意顺序) |
| destination | 终点 | 纬度,经度 |
| waypoints | 途经点 | 纬度,经度;纬度,经度,最多18个 |
| coord_type | 坐标系 | bd09ll(百度坐标系) |
| tactics | 路径策略 | 10=时间最短,11=距离最短等 |
特点:
- POI数据丰富,1.4亿+地点
- 坐标系为BD-09(百度独有),与其他三家不通用
- 途经点上限18个
- 坐标顺序是"纬度,经度"(其他三家是"经度,纬度"),容易传错
- 3D地图和街景效果好
Python调用示例:
import requests
def baidu_route(origin, destination, waypoints=""):
"""百度路径规划调用"""
url = "https://api.map.baidu.com/directionlite/v1/driving"
params = {
"ak": "YOUR_BAIDU_AK",
"origin": f"{origin[1]},{origin[0]}", # 注意:纬度在前
"destination": f"{destination[1]},{destination[0]}",
"waypoints": waypoints, # "lat1,lng1;lat2,lng2"
"coord_type": "bd09ll",
"tactics": 10 # 时间最短
}
response = requests.get(url, params=params)
result = response.json()
if result.get("status") == 0:
route = result["result"]["routes"][0]
return {
"distance": route["distance"], # 距离(米)
"duration": route["duration"], # 时长(秒)
}
return {"error": result.get("message")}
3.4 腾讯位置服务
接口地址:GET https://apis.map.qq.com/ws/direction/v1/driving/
核心参数:
| 参数 | 说明 | 格式 |
|---|---|---|
| key | API Key | URL参数传递 |
| from | 起点 | 纬度,经度 |
| to | 终点 | 纬度,经度 |
| waypoints | 途经点 | 纬度,经度;纬度,经度,最多30个 |
| policy | 路径策略 | LEAST_TIME(时间最短)、SHORT_DISTANCE(距离最短)等 |
| plate_number | 车牌号 | 支持车牌限行避让 |
| cartype | 车辆类型 | 0=普通汽车,1=新能源 |
特点:
- 途经点容量30个,在通用平台中算较高
- 支持车牌限行避让(传入车牌号自动避开限行区域)
- 与微信小程序有原生集成优势
- 坐标系为GCJ-02
- 坐标顺序同样是"纬度,经度"
- 车辆类型只区分普通汽车和新能源,不支持货车
四、综合对比表
4.1 核心能力对比
| 维度 | 丰图 | 高德 | 百度 | 腾讯 |
|---|---|---|---|---|
| 途经点上限 | 100个 | 16个 | 18个 | 30个 |
| 货车路径规划 | ✅ 1-9类车型 | ✅ 支持 | ✅ 支持 | ❌ 仅客车 |
| 坐标系 | GCJ-02(可切BD-09) | GCJ-02 | BD-09 | GCJ-02 |
| 坐标格式 | 经度,纬度 | 经度,纬度 | 纬度,经度 | 纬度,经度 |
| 实时路况 | ✅ | ✅ | ✅ | ✅ |
| ak传递方式 | Header | URL参数 | URL参数 | URL参数 |
| 车牌限行 | ❌ | ❌ | ❌ | ✅ |
| 文档质量 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 生态成熟度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
4.2 价格对比
| 平台 | 基础授权/年 | 超额计费 |
|---|---|---|
| 高德 | 5万/年 | 阶梯计费 |
| 百度 | 5万/年 | 按次计费 |
| 腾讯 | 5万/年 | 按项目定制 |
| 丰图 | 2万/年(纯证书) | 30元/万次 |
说明:丰图2万/年的项目版是纯商业授权证书,不含接口调用额度,主要用于合规证明。如果需要使用路径规划接口,需在此基础上搭配单接口按需购买。
五、关键坑点:坐标系与参数格式
这是迁移和接入时最容易踩的两个坑,单独拿出来讲。
5.1 坐标系差异
四家平台使用的坐标系不完全一致:
| 平台 | 默认坐标系 | 说明 |
|---|---|---|
| 高德 | GCJ-02 | 国测局加密坐标系 |
| 腾讯 | GCJ-02 | 与高德一致 |
| 丰图 | GCJ-02 | 与高德、腾讯一致,支持切换到BD-09 |
| 百度 | BD-09 | 基于GCJ-02二次加密 |
如果你的GPS设备输出的是WGS-84坐标(原始GPS坐标),需要先转成GCJ-02再传给API。直接从百度迁到其他平台(或反向),也需要做坐标转换,否则位置会偏移几百米。
坐标转换参考代码:
import math
def gcj02_to_bd09(lng, lat):
"""GCJ-02 转 BD-09"""
x = lng
y = lat
z = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * math.pi * 3000.0 / 180.0)
theta = math.atan2(y, x) + 0.000003 * math.cos(x * math.pi * 3000.0 / 180.0)
bd_lng = z * math.cos(theta) + 0.0065
bd_lat = z * math.sin(theta) + 0.006
return bd_lng, bd_lat
def bd09_to_gcj02(bd_lng, bd_lat):
"""BD-09 转 GCJ-02"""
x = bd_lng - 0.0065
y = bd_lat - 0.006
z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * math.pi * 3000.0 / 180.0)
theta = math.atan2(y, x) - 0.000003 * math.cos(x * math.pi * 3000.0 / 180.0)
gcj_lng = z * math.cos(theta)
gcj_lat = z * math.sin(theta)
return gcj_lng, gcj_lat
5.2 参数格式差异
| 平台 | 坐标顺序 | ak位置 | 途经点分隔符 |
|---|---|---|---|
| 丰图 | 经度,纬度 | Header | 通过x2/y2传递 |
| 高德 | 经度,纬度 | URL参数 | 分号; |
| 百度 | 纬度,经度 | URL参数 | 分号; |
| 腾讯 | 纬度,经度 | URL参数 | 分号; |
百度和腾讯的坐标顺序是"纬度在前,经度在后",和丰图、高德正好相反。从百度/腾讯迁移到丰图(或反向)时,这个顺序一定要改,否则算出来的路线完全不对。

六、选型建议
场景1:大批量配送节点(30+个配送点),货车为主
推荐:丰图
100个途经点的容量是四家中最大的,一次调用就能覆盖全城级配送。完整的货车类型支持(1-9类)和限行规则,不需要额外处理。如果你有30+个配送节点且以货车为主,丰图是目前唯一能在单次调用内完成整体规划的选项。
场景2:通用配送,少量途经点,无货车需求
推荐:高德
通用驾车场景下算法成熟,路况数据经过大量用户验证。文档质量最好,开发者上手快。16个途经点对小规模配送够用。
场景3:微信小程序生态
推荐:腾讯
与微信小程序有原生集成优势,接入成本低。30个途经点容量在通用平台中算较高。支持车牌限行避让。
场景4:从百度迁移,想降低迁移成本
推荐:丰图
丰图支持坐标系切换参数(cc=2),从百度BD-09迁移时可以直接传参切换,不需要写坐标转换代码。其他平台(高德、腾讯)需要额外调用坐标转换接口。
物流路径规划的技术选型,核心看三个指标:途经点容量够不够用、货车参数支不支持、坐标系是否兼容现有数据。
没有哪个平台在所有维度都是最优的。通用场景下高德、百度生态更成熟;微信生态选腾讯有天然优势;但如果你的核心场景是物流配送,30+个途经点、货车限行、坐标兼容这些硬需求摆在这里,丰图在物流垂直场景的差异化值得认真评估。
选型前建议先把自己的业务参数列出来——日均配送点数量、车辆类型、现有坐标系、预算范围,然后拿参数去套平台,而不是拿着平台去套业务。

1035

被折叠的 条评论
为什么被折叠?



