问题:
一个骑手需要从取货点(中转站仓库)取5件货物送到A/B/C/D/E5个目的地,五个地点之间相互距离在1-3KM左右,使用HERE地图开发导航应用,该如何实现最优路线呢?
HERE解决方案参考:
一、场景建模与方案选型
针对"单一取货点 + 5件货物 + 5个近距离送达点(1-3km)"的同城轻量配送场景,核心是先求解最优访问顺序,再生成可导航的路段。HERE 地图有两个 API 可以组合使用,也有一个 API 可以一站式解决:
| 方案 | 适用 API | 优势 | 推荐度 |
| 轻量级(单车单人) | Waypoints Sequence API v8 + Routing API v8 | 调用简单,专为"给定途经点求最优顺序"设计 | ⭐⭐⭐⭐⭐ |
| 重量级(带容量/时间窗/多趟) | Tour Planning API v3 | 一次性返回优化序列、时间窗、车辆调度 | ⭐⭐⭐⭐ |
小提示:场景是 1 个骑手、5 件货物、5 个目的地,且距离很近(1-3km),首选 Waypoints Sequence API v8——它明确支持"基于道路网限制和交通模式,计算最小化总行程时间或总距离的最佳途经点顺序"。
如果骑手是两轮/电动配送车,Routing API 的 transportMode=scooter是城内短途配送的最佳模式:默认限速 60km/h、自动规避高速公路、仅使用摩托车可通行道路。
二、方案架构
中转站(取货) ──► [Waypoints Sequence API 求最优顺序] ──► A→C→B→E→D (示意)
│
▼
[Routing API v8 逐段导航]
│
▼
中转站 ──► A ──► C ──► B ──► E ──► D ──► (可选返程中转站)
两步调用策略:
第一步:调用 Waypoints Sequence API,输入中转站 + A/B/C/D/E 五个点,获得优化后的访问顺序。
第二步:用优化后的顺序,调用 Routing API v8(transportMode=scooter),获取每段可导航路线(含转向指令、距离、耗时)。
三、API 调用详解
API ①:Waypoints Sequence API v8 —— 求解最优送货顺序
端点
POST https://wps.hereapi.com/v8/waypointssequence
请求体示例(坐标用占位符,实际接入时替换为真实经纬度)
{
"substitutions": {
"start": "12.96844,77.59620"
},
"jobs": [
{ "id": "A", "location": "12.97190,77.59320" },
{ "id": "B", "location": "12.97544,77.60100" },
{ "id": "C", "location": "12.96670,77.58890" },
{ "id": "D", "location": "12.96230,77.60510" },
{ "id": "E", "location": "12.96980,77.59780" }
],
"mode": "fastest;scooter;traffic:enabled",
"return": "polyline,travelSummary"
}
关键参数说明
| 参数 | 取值 | 说明 |
| substitutions.start | 中转站坐标 | 骑手出发地 |
| jobs[].id | A/B/C/D/E | 货物目的地标识 |
| jobs[].location | lat,lng | 各目的地坐标 |
| mode | fastest; scooter; traffic:enabled | 最快路线 + 滑板车/摩托车模式 + 启用实时交通 |
| return | polyline,travelSummary | 返回路线几何与行程摘要 |
典型返回值
{
"routes": [{
"waypointsSequence": ["start", "C", "A", "E", "B", "D"],
"distance": 8420,
"travelTime": 1860,
"trafficTime": 1860,
"polyline": "…"
}]
}
小提示:核心输出 waypointsSequence即为优化后的送货优先级顺序。基于 HERE 的道路网络与实时交通,该顺序使总行程时间或总距离最小。
API ②:Routing API v8 —— 生成逐段导航路线
拿到顺序后(假设为 中转站→C→A→E→B→D),调用 Routing API 获取每段的可导航路线。
端点
GET https://router.hereapi.com/v8/routes
请求示例(以"中转站→C→A"第一段为例)
https://router.hereapi.com/v8/routes
?origin=12.96844,77.59620
&destination=12.96670,77.58890
&transportMode=scooter
&vehicle[speedCap]=16.66
&avoid[features]=controlledAccessHighway
&return=polyline,travelSummary,actions,instructions
&apikey=YOUR_API_KEY
关键参数说明
| 参数 | 取值 | 说明 |
| transportMode | scooter | 两轮机踏车/摩托车模式,适合同城配送 |
| vehicle[speedCap] | 16.66 | 限速 60km/h(默认值,可按实际调整) |
| avoid[features] | controlledAccessHighway | 规避高速公路(scooter 模式默认已规避) |
| return | polyline,travelSummary,actions,instructions | 返回路线几何、行程摘要、转向动作、文字指令 |
典型返回值片段
{
"routes": [{
"sections": [{
"travelSummary": {
"duration": 320,
"length": 1450
},
"actions": [
{ "type": "depart", "instruction": "向西北方向出发", "length": 120 },
{ "type": "turn", "direction": "left", "instruction": "左转进入X路", "length": 380 },
{ "type": "arrive", "instruction": "到达目的地C" }
]
}]
}]
}
小提示:通过遍历优化后的顺序,对相邻两点逐段调用该 API,即可获得骑手全程的转向导航指令。
API ③(可选):Tour Planning API v3 —— 一站式优化
如果未来业务扩展到多骑手、车辆容量限制、时间窗约束、需从中转站多次取货,则直接使用 Tour Planning API。HERE 官方博客中有一个几乎完全匹配你场景的案例:1 辆 scooter、容量 3、从 Cafe 取出 5 件货物配送到 5 个客户,API 自动规划出"送 3 单→回 Cafe 重新装载→送剩余 2 单"的序列。
端点
POST https://tourplanning.hereapi.com/v3/problems?apiKey=YOUR_API_KEY
请求体核心结构
{
"plan": {
"jobs": [
{ "id": "A", "location": {"lat": 12.97190, "lng": 77.59320}, "demand": [1], "serviceTime": 120 },
{ "id": "B", "location": {"lat": 12.97544, "lng": 77.60100}, "demand": [1], "serviceTime": 120 },
{ "id": "C", "location": {"lat": 12.96670, "lng": 77.58890}, "demand": [1], "serviceTime": 120 },
{ "id": "D", "location": {"lat": 12.96230, "lng": 77.60510}, "demand": [1], "serviceTime": 120 },
{ "id": "E", "location": {"lat": 12.96980, "lng": 77.59780}, "demand": [1], "serviceTime": 120 }
]
},
"fleet": {
"types": [{
"profile": "vehicle",
"amount": 1,
"capacity": [5],
"costs": { "distance": 0.004, "time": 0.0024, "fixed": 22 },
"id": "rider_1",
"shifts": [{
"start": { "location": {"lat": 12.96844, "lng": 77.59620}, "time": "2026-07-22T08:00:00+08:00" },
"end": { "location": {"lat": 12.96844, "lng": 77.59620}, "time": "2026-07-22T18:00:00+08:00" }
}]
}],
"profiles": [{ "name": "vehicle", "type": "scooter" }]
}
}
返回值核心结构(摘取自 HERE 官方动态重排示例)
{
"statistic": {
"cost": 46.27,
"distance": 30374,
"duration": 4672,
"times": { "driving": 3172, "serving": 1500, "waiting": 0, "break": 0 }
},
"tours": [{
"vehicleId": "rider_1_1",
"stops": [
{ "location": {"lat": 12.96844, "lng": 77.59620}, "time": { "departure": "…" } },
{ "location": {"lat": "…", "lng": "…"}, "time": { "arrival": "…", "departure": "…" },
"load": [4], "activities": [{ "jobId": "A", "type": "delivery" }] },
{ "location": {"lat": "…", "lng": "…"}, "time": { "arrival": "…", "departure": "…" },
"activities": [{ "jobId": "C", "type": "delivery" }] },
"… 其余停靠点 …",
{ "location": {"lat": 12.96844, "lng": 77.59620}, "time": { "arrival": "…" } }
]
}]
}
返回值关键字段解读
| 字段 | 含义 |
| tours[].stops[].activities[].jobId | 该停靠点对应的送货任务(即 A/B/C/D/E 的顺序) |
| tours[].stops[].time.arrival/ departure | 到达/离开该点的时间 |
| statistic.distance | 总行程距离(米) |
| statistic.duration | 总时长(秒) |
| statistic.times.driving/ serving | 驾驶时间 / 服务(交付)时间 |
四、完整业务流程
1. 从中转站系统读取 5 件货物的目的地坐标 A/B/C/D/E
2. 调用 Waypoints Sequence API → 获得最优顺序 (如 C→A→E→B→D)
3. 按优化顺序逐段调用 Routing API (transportMode=scooter)
→ 获得每段的转向导航指令、距离、预计耗时
4. 拼接为完整导航路线,推送给骑手 APP
5. (可选)调用 Routing API 计算返程路线回到中转站
五、方案要点总结
为什么这样设计?
Waypoints Sequence API 是 HERE 专门用于"求解途经点最优顺序"的服务,基于道路网和交通模式最小化总时间/距离——完美匹配"5 个点求访问优先级"的需求
Routing API v8 的 scooter 模式针对城内两轮机踏车优化,默认 60km/h 限速、自动避高速,契合同城短途配送
坐标获取:A/B/C/D/E 及中转站的坐标可通过 HERE Geocoding & Search API 从地址反查得到,或直接从业务系统读取已有经纬度
生产环境建议:
若送货时间窗严格(如"10:00-11:00 前送达 A"),直接升级到 Tour Planning API v3,它原生支持时间窗、优先级、车辆容量
若骑手在配送途中需动态插入新订单,Tour Planning API 支持基于当前位置重规划
中转站与 5 个点的距离虽近,但直线距离 ≠ 实际骑行距离,务必以 API 返回的道路距离为准来排序。
大概方案如上所示,具体效果需要根据实测结果调整优化。
如果使用Google或者其他地图,上述需求的方案又该怎么做呢?欢迎大家一起讨论一下。





