问题:做为一个新手,我并无发现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直接用直线距离算的,可是有的道路是弯的,这是我能想到最好的方法了。
一家之言,望大佬指正!