Geotools求shapefile路网中任意两点之间最短路径的距离
前言:之前在博问求助过这个问题。经过几天的思考,算是解决了(但仍有不足),另一方面对Geotools不是很熟,有些描述可能不正确,希望大家批评指正。
问题:作为一个新手,我并没有发现Geotools中能够计算路网上任意两点之间最短路径的函数(虽然到现在我仍然不相信,但是我就是没有找到)。Geotools中有用迪杰斯特拉算法求最短路径的函数,但是这个函数需要的起点和终点参数都是Node类型(这个node类型是道路的首尾节点)
DijkstraShortestPathFinder pf = new DijkstraShortestPathFinder(graph, start, weighter);
pf.calculate();
Path path = pf.getPath(end);
其中start和end都是Node类型。
那问题就在于,路网上任意两点之间的距离,只能通过道路的节点来计算,而我们的起点和终点是任意的(基本都不在道路节点上)。如果找距离起点和终点最近的道路节点,来计算最短路径的长度(那path中全是整段路),而起点和终点一般都在路上的某一位置,那就有起点和终点对应的两段长度,可能被多加了,也可能被少加了。在两点之间距离特别长的条件下是可行的;但是两点离得很近的情况下就会产生致命的误差。另外,读取的shapefile路网中的要素,转换成Edge类型,它有A、B两个节点。而路网中一条路的起始节点与A、B节点是无法对应的。这就为我们确定起点和终点对应两段长的正负造成困难。
问题1:如何计算最短路径的长度?
问题2:怎么确定最短路径两端的不足一条路长度的距离的正负?
为方便表述,用a表示起点对应不足一条路的长度;
用b表示终点对应不足一条路的长度;
用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直接用直线距离算的,但是有的道路是弯的,这是我能想到最好的方法了。
一家之言,望大佬指正!