日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

基于OpenStreetMap计算驾车距离(Java)

發(fā)布時間:2025/7/25 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于OpenStreetMap计算驾车距离(Java) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近公司有個項目需要計算6000個點之間的駕車距離,第一時間想到的是利用Google的Distance Matrix API,但是免費Key每天只能計算2500個元素(元素 = 起點數(shù)量 * 終點數(shù)量),收費的話每1000個元素需要0.5刀,6000個點(接近3600w條邊)基本就是1.8w刀。。。而且限制頗多,數(shù)據(jù)只允許本地緩存一個月,QPS限定100,每天查詢元素上限10w,計算完客戶早走了,基本不可用。

然后就想到了開(免)源(費)的OpenStreetMap(簡稱OSM),OSM是一個開源的地圖庫,可以在http://download.geofabrik.de/下載各國家地圖包,數(shù)據(jù)還是比較全的。

有了地圖數(shù)據(jù),還需要一個尋路計算框架,找到了一個免費的庫osm2po(http://osm2po.de/)

下載osm2po以后修改demo.sh或demo.bat的地圖路徑為你自己的pbf文件地址:

執(zhí)行以后會啟動一個Http服務(wù)器,默認(rèn)地址http://localhost:8888/Osm2poService,打開就能看見地圖界面了:

隨便尋個路,效果還可以,國內(nèi)路線看起來和高德地圖差不多 Http訪問方式只提供了這么些參數(shù)可以使用,并不是很完善,沒有distance的選項,而且http的訪問方式效率也不高,最好還是用Java API 計算兩點間距離可以直接用官網(wǎng)示例的DefaultRouter,很簡單。 多點距離在gis.stackexchange.com發(fā)現(xiàn)作者說有提供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; }

算出來的結(jié)果21.01734公里,和高德地圖完全吻合

公司項目第一個使用的地方是一個鳥不拉屎的非洲小國家,除了主干道基本都是人踩出來的小路,固定地點尋路成功率也達到了83%以上,失敗的情況一般谷歌地圖也沒路。國內(nèi)道路好太多,估計95%成功率是OK的。

實際測試1700個點,地圖大小30M,生成有效數(shù)據(jù)240w條,堆內(nèi)存使用6.5g,只用了60秒。 ps:距離相近的點,得到的地圖塊id可能相同,傳入TspDefaultMatrix會error,要做一個去重的映射處理。

轉(zhuǎn)載于:https://www.cnblogs.com/kosho/p/9191602.html

總結(jié)

以上是生活随笔為你收集整理的基于OpenStreetMap计算驾车距离(Java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。