前言:之前在博问求助过这个问题。经过几天的思考,算是解决了(但仍有不足),另一方面对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. 虚拟机桥接模式下将虚拟IP设为静态IP

    一:虚拟机设置桥接模式 1.进入虚拟机设置中将网络适配器设置成桥接模式,如下图 2.编辑--虚拟网络编辑器--选择桥接 3.如上图中桥接模式下的桥接到--将自动改成与本机匹配的虚拟网卡,本机虚拟网卡查 ...

  2. 自学web前端达到什么水平,才能满足求职的标准?

    大多数野生程序员最棘手的问题就是如何依靠技术解决温饱,通俗来讲就是技术折现的问题. 如果是单纯出于兴趣,或者只是为了突击某一阶段或者某一项目技术壁垒,不跟就业挂钩的自学倒也是无关痛痒.但是当上岗成为自 ...

  3. 如何成长为一名合格的web前端开发工程师呢?

    前端开发工程师不仅仅要掌握一些基础的美工设计等还要懂得网页设计类的HTML JavaScript和css,这三种能力缺一不可,虽不要求你特别的精通,但至少要熟练的掌握,能够运用自己所了解的这些技术和知 ...

  4. OD 逆向工具常用快捷键

    F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点. F8:单步步过.每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码. F ...

  5. spring源码系列7:Spring中的InstantiationAwareBeanPostProcessor和BeanPostProcessor的区别

    概念 Bean创建过程中的"实例化"与"初始化"名词 实例化(Instantiation): 要生成对象, 对象还未生成. 初始化(Initialization ...

  6. [LUOGU1122] 最大子树和 - 树形动规

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  7. Topaz ReMask 5抠图神器

    Topaz ReMask 5抠图神器 与Photoshop相比,ReMask不需要繁琐的刷子工作来获得高质量的面膜.您只需粗略勾勒出主题并按"计算"即可. 在Photoshop中制 ...

  8. windows下安装scoop

    scoop是windows下的包管理工具,类似与linux下的yum和python的pip. scoop可以在windows下方便的进行软件的管理,尤其是对开发者提供了很大的遍历. cmd下执行如下红 ...

  9. python问题:IndentationError:expected an indented block

    Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的Python程序员,也可能陷入陷阱当中.最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分 ...

  10. Textbox输入状态提示

    前: <DockPanel Margin="> <TextBox SelectionChanged="TextBox_SelectionChanged" ...