路网计算逻辑
页面上的「参考里程」不是直线距离乘系数,是在真实路网上按最短路径算出来的。这一页讲清它怎么算、算得准不准、哪里算不准。数据本身见数据参考。
打开就有数,不用等
里程不是在页面打开时现算的。全国的道路网已经提前算成一张表,查线路时只是把那个数读出来—— 所以不会转圈、不会排队,也不会因为别人家的服务挂了就查不到。
代价是这张表一个月才更新一次:新开通的高速要等下个版本才进得来。 对运费估算来说,一条新高速影响的是几公里到几十公里,落在参考价的浮动区间里; 换来的是每次查询都立刻出结果。
里程是这么算出来的
- 01 用哪套道路:OpenStreetMap 的公开道路数据,涵盖高速、国道、省道、县乡道和轮渡。 只取到县乡道这一档——再细一级,里程只差 1.3%,打开速度却慢不少。
- 02 落到路上:把 3237 个城市、区县的中心点和 40,982 个乡镇,各自对应到离它最近的一条路。40 公里内都找不到路的,按「不通公路」处理。
- 03 两两先算好:任意两地之间的最短公路里程都提前算完,打开页面直接读数。 这就是上面说的「打开就有数」。
- 04 乡镇怎么算:4 万个乡镇两两配对算不过来。改成「先到最近的城市,再接城市之间的距离」—— 这样算出来的数只会略高一点,不会偏低。
算出来的精度
拿 37 条公开的高速公路营运里程做对照,平均绝对偏差 4.9%, 其中 24 条在 ±5% 以内,最大 17.4%。
| 线路 | 公开里程 | 旧模型 | 本站 | 偏差 |
|---|---|---|---|---|
| 北京 → 上海京沪高速 | 1220 km | 1242 km | 1172 km | -3.9% |
| 成都 → 拉萨318 国道,旧模型偏短 22% | 2070 km | 1610 km | 1970 km | -4.8% |
| 上海 → 崇明同城跨海,旧模型只按直线算 | 95 km | 51 km | 93 km | -2.1% |
| 杭州 → 宁波少数偏长的一条 | 150 km | 171 km | 152 km | +1.3% |
| 广州 → 南宁旧模型偏长 11% | 560 km | 622 km | 563 km | +0.5% |
| 重庆 → 贵阳最大偏差,走 G75 但借道了更短的国省道 | 460 km | 414 km | 380 km | -17.4% |
偏差多数为负(37 条里 31 条偏短),原因不是算漏了,而是目标不同: 导航给的是「最快路线」,宁可绕远也走高速;本站算的是「最短路线」,会借道更短的国省道。 差的这 3–5% 就是这个区别。个别偏长的(如杭州—宁波 +1.3%)反而是路网更贴近实际营运里程。
三处修过的偏差
有些点对到了不通的路上
早期有 62 个城市和区县,中心点被对到了地图上一条孤立的小路——杭州只能算出到 2 个地方, 常州一个都算不出来。现在只认主路网(占全部道路的 96%),对不上的往外重新找。
但不能一刀切:像岱山这种真岛屿,硬接到大陆上等于凭空造一座桥。所以只往外找 20 公里, 海南与台湾因此保持原样、退回估算。
香港到深圳算出 196 公里
深圳与香港之间的陆路口岸,在公开地图上没有连成可通行的道路,最短路径只能绕港珠澳大桥—— 实际 30 公里,算出 196 公里。同一类问题还有横断山区:德钦到得荣直线 44 公里, 路网给出 854 公里(跨江的公路缺一段)。
现在有一道安全阀:里程超过「直线 × 3 + 50 公里」就判定不可信,退回估算。 修完香港→深圳 196 → 32 公里。这种兜底不精确,但比一个错得离谱的精确数字诚实。
往返两个方向差几公里
单行道和单向匝道会让 A→B 与 B→A 差几公里。为了不让运费被低估, 两个方向里取较大的那个。实测这个差的中位数只有 2.4 公里。
还保留的人工校正
有 7 条跨海线路不走路网,用人工核定的里程:渤海海峡、琼州海峡、舟山群岛与杭州湾。 路网里这些轮渡是通的,但货车受班次、车型与滚装船限制,实际多数绕行或单独走船。 只按地图算出来的距离,不符合货车的实际跑法。
水路里程单独算:公路绕 1400 公里不代表海运也绕,海上的航距只有 165 公里。 这几个值固定不调,因为它们是可以被单独引用、被逐条核对的里程。