基于OpenStreetMap计算驾车距离(Java)
最近公司有个项目需要计算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,打开就能看见地图界面了:





public static void main(String[] args) throws Exception {
File graphFile = new File(args[0]);
Graph graph = new Graph(graphFile);
// Somewhere in Graph
LatLon source = new LatLon(32.0452460989,118.8318873038);
LatLon target = new LatLon(31.8870800000,118.8300200000);
// additional params for DefaultRouter
Properties 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 -1
vertexIds[i] = graph.findClosestVertexId(
(float) latLons[i].getLat(), (float) latLons[i].getLon());
}
return vertexIds;
}
算出来的结果21.01734公里,和高德地图完全吻合
公司项目第一个使用的地方是一个鸟不拉屎的非洲小国家,除了主干道基本都是人踩出来的小路,固定地点寻路成功率也达到了83%以上,失败的情况一般谷歌地图也没路。国内道路好太多,估计95%成功率是OK的。
基于OpenStreetMap计算驾车距离(Java)的更多相关文章
- 【小o地图Excel插件版】计算两点间驾车路径,获取途径道路、驾车距离、耗时等信息
小o地图Excel插件版:一款基于Excel软件开发的地图软件,提供基于Excel表格进行地理数据挖掘.地理数据分析.地图绘制.地图图表等功能的工具类软件.具有易用.高效.稳定的特点,能够满足地理数据 ...
- Spark Java API 计算 Levenshtein 距离
Spark Java API 计算 Levenshtein 距离 在上一篇文章中,完成了Spark开发环境的搭建,最终的目标是对用户昵称信息做聚类分析,找出违规的昵称.聚类分析需要一个距离,用来衡量两 ...
- Spark 介绍(基于内存计算的大数据并行计算框架)
Spark 介绍(基于内存计算的大数据并行计算框架) Hadoop与Spark 行业广泛使用Hadoop来分析他们的数据集.原因是Hadoop框架基于一个简单的编程模型(MapReduce),它支持 ...
- SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...
- android中使用百度定位sdk实时的计算移动距离
; //5秒刷新一次 private Handler refreshHandler = new Handler(){ //刷新界面的Handler public void handleMessag ...
- 一元建站-基于函数计算 + wordpress 构建 serverless 网站
前言 本文旨在通过 快速部署一个 wordpress 网站到阿里云函数计算平台 这个示例来展示 serverless web 新的开发模式, 包括 FUN 工具一键初始化 NAS, 同步网站到 NAS ...
- PyTorch 实战:计算 Wasserstein 距离
PyTorch 实战:计算 Wasserstein 距离 2019-09-23 18:42:56 This blog is copied from: https://mp.weixin.qq.com/ ...
- geolocation获取当前位置显示及计算两地距离
获取当前经纬度 利用HTML5(以及基于JavaScript的地理定位API),可以很容易地在页面中访问位置信息,下面代码,就可以简单的获取当前位置信息: <!DOCTYPE html> ...
- 百度地图 获取两点坐标之间的驾车距离(非直线距离) c#
百度接口了解: http://lbsyun.baidu.com/index.php?title=webapi/route-matrix-api-v2 起点与终点为多对多关系,如果你只想取两个坐标,那就 ...
随机推荐
- 关于html以及js相关格式验证的记录
关于html中禁止输入的一些写法主要是实现实时监听值: 下面的例子实现的事只运行输入数字切小数位数不能超过两位的示例. 1. onkeyup事件是在输的时候在键盘松开的时候进行触发 ...
- 语音识别中的CTC算法的基本原理解释
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文作者:罗冬日 目前主流的语音识别都大致分为特征提取,声学模型,语音模型几个部分.目前结合神经网络的端到端的声学模型训练方法主要CTC和基 ...
- nginx常用配置系列-虚拟主机
本来准备详尽的出一份nginx配置讲解,但nginx功能配置繁多,平常使用中使用最多的一般有: 1. 虚拟主机配置 2. HTTPS配置 3. 静态资源处理 4. 反向代理 ============= ...
- PAT1106:Lowest Price in Supply Chain
1106. Lowest Price in Supply Chain (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CH ...
- POI处理Excel中各种日期格式问题
前不久写过一篇随笔<EXCEL解析之终极方法WorkbookFactory>,提到使用WorkbookFactory来处理Excel文件数据,最近发现一个问题就是这个办法不能很好的处理各种 ...
- div布局之面向对象
栗子之导航条(navbar) http://www.runoob.com/try/try2.php?filename=bootstrap-using-glyphicons-navbar <!DO ...
- (一)linux定时任务的设置 crontab 基础实践
为当前用户创建cron服务 1. 键入 crontab -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...
- SpringMVC接口测试异常:Can not deserialize instance of int out of START_OBJECT token
之前使用springmvc搭建了restful风格的接口服务,在使用mockmvc进行集成测试的时候出现了异常:Can not deserialize instance of int out of S ...
- vue2.0组件通信小总结
1.父组件->子组件 父组件 <parent> <child :child-msg="msg"></child>//这里必须要用 - 代替 ...
- 用 150 行 Python 代码写的量子计算模拟器
简评:让你更轻松地明白,量子计算机如何遵循线性代数计算的. 这是个 GItHub 项目,可以简单了解一下. qusim.py 是一个多量子位的量子计算机模拟器(玩具?),用 150 行的 python ...