問題:做爲一個新手,我並無發現Geotools中可以計算路網上任意兩點之間最短路徑的函數(雖然到如今我仍然不相信,可是我就是沒有找到)。Geotools中有用迪傑斯特拉算法求最短路徑的函數,可是這個函數須要的起點和終點參數都是Node類型(這個node類型是道路的首尾節點)node
DijkstraShortestPathFinder pf = new DijkstraShortestPathFinder(graph, start, weighter);算法
pf.calculate();函數
Path path = pf.getPath(end);spa
其中start和end都是Node類型。get
那問題就在於,路網上任意兩點之間的距離,只能經過道路的節點來計算,而咱們的起點和終點是任意的(基本都不在道路節點上)。若是找距離起點和終點最近的道路節點,來計算最短路徑的長度(那path中全是整段路),而起點和終點通常都在路上的某一位置,那就有起點和終點對應的兩段長度,可能被多加了,也可能被少加了。在兩點之間距離特別長的條件下是可行的;可是兩點離得很近的狀況下就會產生致命的偏差。另外,讀取的shapefile路網中的要素,轉換成Edge類型,它有A、B兩個節點。而路網中一條路的起始節點與A、B節點是沒法對應的。這就爲咱們肯定起點和終點對應兩段長的正負形成困難。test
問題1:如何計算最短路徑的長度?file
問題2:怎麼肯定最短路徑兩端的不足一條路長度的距離的正負?方法
爲方便表述,用a表示起點對應不足一條路的長度;新手
用b表示終點對應不足一條路的長度;tools
用path表示整條最短路徑對應的道路集合;
用pathlength表示path對應的長度;
用Length表示最短路徑對應的距離;
個人想法:我把整條最短路徑分爲三部分求,即爲上述的a、b、path;首先調用函數計算path時,起點和和終點所對應的節點,對應其所在的Edge能夠,能夠任取A、B(每一個edge都有A、B兩個節點)節點,那其實就四種狀況,我這裏統一塊兒點取A、終點取B。那就能夠求出a和b的長度;根據path中所含的道路來判斷a、b的正負,這樣就免去肯定所選節點究竟是不是道路的起始節點仍是終點節點的困難。
若是path[0]=起點對應的道路,path[最後一個]=終點對應的道路則,Length=pathlength-a-b;
若是path[0]=起點對應的道路,path[最後一個]!=終點對應的道路則,Length=pathlength-a+b;
若是path[0]!=起點對應的道路,path[最後一個]=終點對應的道路則,Length=pathlength+a-b;
若是path[0]!=起點對應的道路,path[最後一個]!終點對應的道路則,Length=pathlength+a+b;
不足:我這塊a、b直接用直線距離算的,可是有的道路是彎的,這是我能想到最好的方法了。
一家之言,望大佬指正!