前言:之前在博问求助过这个问题。经过几天的思考,算是解决了(但仍有不足),另一方面对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直接用直线距离算的,但是有的道路是弯的,这是我能想到最好的方法了。

    一家之言,望大佬指正!

Geotools求shapefile路网中任意两点之间最短路径的距离的更多相关文章

  1. Floyd-Warshall求图中任意两点的最短路径

    原创 除了DFS和BFS求图中最短路径的方法,算法Floyd-Warshall也可以求图中任意两点的最短路径. 从图中任取两点A.B,A到B的最短路径无非只有两种情况: 1:A直接到B这条路径即是最短 ...

  2. Floyd算法——计算图中任意两点之间的最短路径

    百度百科定义:传送门 一.floyd算法 说实话这个算法是用来求多源最短路径的算法. 算法原理: 1,从任意一条单边路径开始.所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大. 2,对 ...

  3. dfs+记忆化搜索,求任意两点之间的最长路径

    C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...

  4. 2D和3D空间中计算两点之间的距离

    自己在做游戏的忘记了Unity帮我们提供计算两点之间的距离,在百度搜索了下. 原来有一个公式自己就写了一个方法O(∩_∩)O~,到僵尸到达某一个点之后就向另一个奔跑过去 /// <summary ...

  5. POJ 3660 Cow Contest 任意两点之间的关系 Floyd

    题意:牛之间有绝对的强弱,给出一些胜负关系,问有多少头牛可以确定其绝对排名. #include <iostream> #include <cstdio> #include &l ...

  6. javascript实现有向无环图中任意两点最短路径的dijistra算法

    有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...

  7. poj2762 判断一个图中任意两点是否存在可达路径 也可看成DAG的最小覆盖点是否为1

      Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 179 ...

  8. HDU2586(LCA应用:在带权树中求任意两点之间的距离)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. Geotools在shapefile路网数据中建立缓冲区,并获取缓冲区内的要素

    记录一下如何创建创建缓冲区并获取缓冲区内的要素,便于以后查找使用 static SimpleFeatureSource featureSource = null; static CoordinateR ...

随机推荐

  1. 记录JS如何使用广度遍历找到节点的所有父节点

    我们在实际的工作业务场景中经常遇到这样的场景,求取树数据中某个节点的父亲节点以及所有的父亲节点,这样的场景下不建议使用深度遍历,使用广度遍历可以更快找到. 1.案例解说 比如树的长相是这样的: 树的数 ...

  2. Ubuntu安装exfat工具

    sudo apt-get undate sudo apt-get install exfat-utils

  3. shell变量(二)

    变量名的命名规范: 1.命名只能使用英文字母.数字和下划线,且不能以数字开头: 2.不能存在空格‘: 3.不能使用标点符号: 4.不能使用bash里的关键字(可使用help命令查看保留关键字) 变量的 ...

  4. 如何把应用程序移植到k8s

    程序部署环境的容器化已经是大势所趋,微服务为容器化提供了广阔的应用舞台,k8s已经把Docker纳入为它的底层支撑容器引擎,一统江湖,成为了容器技术事实上的标准.一般的应用程序是不能直接拿来部署到容器 ...

  5. LeetCode刷题总结-递归篇

    递归是算法学习中很基本也很常用的一种方法,但是对于初学者来说比较难以理解(PS:难点在于不断调用自身,产生多个返回值,理不清其返回值的具体顺序,以及最终的返回值到底是哪一个?).因此,本文将选择Lee ...

  6. 后缀数组(SA)

    学习了LRJ神犇的代码.orz. 首先真心建议了解下基数排序!!且要有一定的c++程序经验,否则程序很难看懂. 然后对着下面的程序调试(假装你已经会了算法思想) 弄个一个礼拜一下午就能学会了. 该算法 ...

  7. 谢宝友: 手把手教你给Linux内核发patch

    本文系转载,著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 谢宝友 来源: 微信公众号 linux阅码场 (id: linuxdev) 本文简介       本文一步一 ...

  8. Object 对象方法学习之(1)—— 使用 Object.assign 复制对象、合并对象

    作用 Object.assign() 方法用于把一个或多个源对象的可枚举属性值复制到目标对象中,返回值为目标对象. 语法 Object.assign(target, ...sources) 参数 ta ...

  9. PowerBI开发 第十五篇:Power BI的行级安全

    Power BI支持行级安全(Row-Level Security,RLS)的权限控制,用于限制用户对Dashboard.报表和DataSet的访问.用户浏览的报表是相同的,但是看到的数据却是不同的. ...

  10. unityweb Request请求

    UnityWebRequest是新的网络请求Api,分为LLApi和HLApi,其中LLApi为低级api,所谓低级api是指只是提供最基本的api接口,然后需要通过不同的参数来确定请求方式.为此un ...