基于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,打開就能看見地圖界面了:
隨便尋個路,效果還可以,國內路線看起來和高德地圖差不多 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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: executing an update/
- 下一篇: 微信小游戏 Egret开发数据域官方De