最近公司有个项目需要计算6000个点之间的驾车距离,第一时间想到的是利用Google的Distance Matrix API,但是免费Key每天只能计算2500个元素(元素 = 起点数量 * 终点数量),收费的话每1000个元素需要0.5刀,6000个点(接近3600w条边)基本就是1.8w刀。。。而且限制颇多,数据只允许本地缓存一个月,QPS限定100,每天查询元素上限10w,计算完客户早走了,基本不可用。

然后就想到了开(免)源(费)的OpenStreetMap(简称OSM),OSM是一个开源的地图库,可以在http://download.geofabrik.de/下载各国家地图包,数据还是比较全的。

有了地图数据,还需要一个寻路计算框架,找到了一个免费的库osm2po(http://osm2po.de/)

下载osm2po以后修改demo.sh或demo.bat的地图路径为你自己的pbf文件地址:

执行以后会启动一个Http服务器,默认地址http://localhost:8888/Osm2poService,打开就能看见地图界面了:

随便寻个路,效果还可以,国内路线看起来和高德地图差不多
Http访问方式只提供了这么些参数可以使用,并不是很完善,没有distance的选项,而且http的访问方式效率也不高,最好还是用Java API
计算两点间距离可以直接用官网示例的DefaultRouter,很简单。
多点距离在gis.stackexchange.com发现作者说有提供Distance Matrix API,emmm不错,看了下jar包的确是有一个TspDefaultMatrix的类,直接上代码:
public static void main(String[] args) throws Exception {File graphFile = new File(args[0]);Graph graph = new Graph(graphFile);// Somewhere in GraphLatLon source = new LatLon(32.0452460989,118.8318873038);LatLon target = new LatLon(31.8870800000,118.8300200000);// additional params for DefaultRouterProperties params = new Properties();params.setProperty("findShortestPath", "true");params.setProperty("ignoreRestrictions", "false");params.setProperty("ignoreOneWays", "false");params.setProperty("heuristicFactor", "0.0"); // 0.0 Dijkstra, 1.0 good A*int[] vertexIds = findClosestVertexIds(graph, source, target);Log log = new Log(Log.LEVEL_DEBUG).addLogWriter(new LogConsoleWriter());TspDefaultMatrix matrix = new TspDefaultMatrix(graph, vertexIds, Float.MAX_VALUE, log, params);float[][] distances = matrix.getCosts();for (int i = 0; i < distances.length; i++) {for (int j = 0; j < distances.length; j++) {System.out.println(distances[i][j]);}}graph.close();
}public static int[] findClosestVertexIds(Graph graph, LatLon... latLons) {int[] vertexIds = new int[latLons.length];for (int i = 0; i < latLons.length; i++) {// if failed, return -1vertexIds[i] = graph.findClosestVertexId((float) latLons[i].getLat(), (float) latLons[i].getLon());}return vertexIds;
}

算出来的结果21.01734公里,和高德地图完全吻合

公司项目第一个使用的地方是一个鸟不拉屎的非洲小国家,除了主干道基本都是人踩出来的小路,固定地点寻路成功率也达到了83%以上,失败的情况一般谷歌地图也没路。国内道路好太多,估计95%成功率是OK的。

实际测试1700个点,地图大小30M,生成有效数据240w条,堆内存使用6.5g,只用了60秒。
ps:距离相近的点,得到的地图块id可能相同,传入TspDefaultMatrix会error,要做一个去重的映射处理。

转载于:https://www.cnblogs.com/kosho/p/9191602.html

基于OpenStreetMap计算驾车距离(Java)相关推荐

  1. Android高德地图计算驾车距离及时间

    在Android开发过程中大家可能会遇到这样的需求,根据两个位置的坐标计算行驶距离和时间,如下图 那这里改怎么实现呢?小编也是各种百度,最后发现高德地图自带了计算的API 引用高德搜索包,在app目录 ...

  2. java获得百度地图驾车距离_如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)...

    以下是使用js代码实现百度地图计算两地距离,代码如下所示: 出发城市 name="Area"> -省份- -城市- -县- setup(document.getElement ...

  3. 计算起点地址和终点地址的最短驾车距离和驾车时间

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 需求: 在一个excel的xlsx表格中有很多起点的地址和终点的地址,要批量计算两个地址之间的距离和驾车时间, ...

  4. JS计算起点坐标到终点坐标的驾车距离和驾车时间

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 先上计算距离的简单demo: <!DOCTYPE html> <html>&l ...

  5. oracle 经纬度算距离,根据经纬度诀别用java和Oracle存储过程计算两点距离

    根据经纬度分别用java和Oracle存储过程计算两点距离 create or replace procedure SP_GET_DISTANCE (cx in number,cy in number ...

  6. 基于GPS与经纬度距离计算

    基于GPS与经纬度距离计算 # -*- coding:utf-8 -*- # /usr/bin/pythonimport warnings warnings.filterwarnings(" ...

  7. levenshtein java_Spark Java API 计算 Levenshtein 距离

    Spark Java API 计算 Levenshtein 距离 在上一篇文章中,完成了Spark开发环境的搭建,最终的目标是对用户昵称信息做聚类分析,找出违规的昵称.聚类分析需要一个距离,用来衡量两 ...

  8. 基于ROS与C++,只利用IMU实现里程计和计步器,精确计算行走距离

    老规矩,开门见山,先说说本篇文章实现了什么: 1.只使用IMU模块,实现了对于人行走距离的检测(精度在0.5m左右) 2.只使用IMU模块,通过峰值检测\机器学习两个方法,实现了一个精确的计步器 背景 ...

  9. Java计算当前日期距离生日还有多少天

    1.键盘录入你的生日字符串 (如:"1998年08月08日")2.计算当前日期距离生日那天有多少天? public static void main(String[] args) ...

最新文章

  1. 将unicode编码的txt文件转为utf-8编码
  2. python语言入门p-python入门基础教程04 Python程序基本组成
  3. Python列表元素操作相关的2个函数和匿名函数
  4. 插件压敏电阻,有哪些?
  5. Bootstrap4+MySQL前后端综合实训-Day04-AM【新闻管理手机端页面+数据库操作(PowerDesigner 图形化数据库设计软件、SQLyog软件)】
  6. linux lynx 源码,Linux移植浏览器 Lynx字符浏览器移植
  7. 【linux】kill命令信号总结
  8. 解决Mac安装软件的“已损坏,无法打开。 您应该将它移到废纸篓”问题
  9. Java常用性能分析工具 jconsole、jvisualvm、 jstat、jinfo、jmap、jhat、jstack
  10. java 获取数据源_J2EE java 获取数据源
  11. Android 相对布局常用属性
  12. Clojure 学习入门(1) - 学习资料
  13. CSS color设置与调色板
  14. MAC 电脑里面的“其他”文件是什么占用了
  15. 桌面在计算机的路径,电脑桌面文件存放路径
  16. 王慧文清华产品课(四)
  17. WPS设置图表名自动编号及图表目录页生成(详细实用)
  18. CUBA:如何准备上线
  19. 把字符串中的全角数字替换成半角数字 0123456789 转换成 0123456789
  20. iCloud云上贵州,2018数博会连接2亿多用户

热门文章

  1. MOCTF-火眼金睛
  2. [知识复习] 结构体以及结构体指针
  3. activiti 表——介绍
  4. JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画...
  5. poj 3254 Corn Fields 状态压缩dp
  6. 三亚之旅 海景--美得让你尖叫
  7. 《ASCE1885的网络编程》---Winsock APIのIP地址转换函数
  8. android 怎么加链接地址,Android TextView添加超链接的方法示例
  9. java 自己抛空指针异常_java Timetask 访问service 抛空指针异常解决方案
  10. linux bridge搭建虚拟机全过程