获取实际地图地址各个节点间距离4种方式比较实用的方式:
- 半正矢公式;
- 百度-批量算路;
- 高德-距离测算;
- Graphhopper-Routing API(开源代码);
百度和高德
半正矢公式 | 百度-批量算路 | 高德-距离测算 | Graphhopper-Routing API | |
---|---|---|---|---|
支持模式 | 1、直线 | 1、驾车2、骑行3、步行 | 1、直线2、驾车3、步行 | 1、car2、bike3、foot4、hike5、mtb6、racingbike7、scooter8、truck9、small_truck |
驾车策略 | 1、不走高速(考虑路况)2、常规路线(考虑路况)3、距离较短 | 1、考虑路况避拥堵 | 1、不考虑路况 | |
坐标系 | bd09ll | amap | WGS84 | |
资源使用 | 1、公式简单,可毫秒级别生成距离矩阵;2、和现实场景相当不匹配 | 1、每日配额有限;2、非企业级用户单次请求最大路线数50;3、有并发;4、较准确5、慢 | 1、每日配额有限;2、单次请求最大路线数100;3、有并发;4、较准确5、慢 | 1、开源代码,可离线部署不受资源限制, 需要改造接口;2、离线地图包对国内实际路况不全导致部分距离离谱,耗时很短 |
1. 半正矢公式
网上有很多关于公式的介绍,这里一袋而过了,公式如下所示:
其中,
和
分别是纬度和经度的弧度;
代表地球半径。
2. 百度-批量算路
- 网址:Web服务API | 百度地图API SDK
- 入口:搜索-百度地图API → 开发文档 → Web服务API → 批量算路
- 推荐:服务文档中介绍了接口文档,ak字段需要在控制台中新建应用获得,具体的内容文档中描述比较详细。对接口请求较陌生的话可以先用postman试一试,其次推荐使用python相比java的http请求的包装工具更简单。
- 特色:提供是否考虑路况的选择,仿真的时候推荐使用不考虑路况,考虑路况每隔一段时间距离和耗时都会变。
3. 高德-距离测算
- 网址:路径规划-API文档-开发指南-Web服务 API | 高德地图API
- 入口:搜索-高德地图API → 开发支持 → Web服务API → 路径规划 → 距离测算
- 推荐:同百度地图一样
- 特色:高德地图的接口比较人性化,页面自带请求工具,可视化数据结构。自带origin_id和dest_id不用苦恼被阉割后的距离矩阵怎么拼接了。
4. Graphhopper-Routing API(开源代码)
网址:https://github.com/graphhopper/graphhopper
Matrix API是专门用于TSP/VRP拼接距离邻接矩阵,虽说是收费,但是注册的时候国家没找到国内,体验不了试用版了。没关系Graphhopper提供了部分java的开源代码,其中就包含了Routing API,它能计算两个节点间的距离和耗时,这样就通过多次请求就可以拼装出距离矩阵了。假如我们有M个节点,请求该接口M*(M-1)次就可以了,但是考虑通信的耗时,建议在源码中提供的custom上做批量的二次开发(关于接口路径在下面图中)。速度嘛是比高德、百度快很多,不考虑网络的影响平均20ms处理一条线路,当然也可以开启加速模式开启turn_cost。