前言:之前在博问求助过这个问题。经过几天的思考,算是解决了(但仍有不足),另一方面对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. C语言-查找一个元素在数组中的位置

    #include<stdio.h> #include <stdlib.h> #include <time.h> int search(int key, int a[ ...

  2. Failure to transfer org.springframework:spring-jcl:jar:5.0.7.RELEASE from

    错误信息: Failure to transfer org.springframework.boot:spring-boot-maven-plugin:pom:1.5.4.RELEASE from h ...

  3. session与cookie,django中间件

    0819自我总结 一.session与cookie 1.django设置session request.session['name'] = username request.session['age' ...

  4. Qt5教程: (3) 自定义信号与槽

    1. 自定义槽 槽可以是任何成员函数.普通全局函数.静态函数 槽函数和信号的参数和返回值要一致 由于信号是没有返回值的, 槽函数也一定没有返回值 首先在mainwidget.h中添加槽函数: publ ...

  5. Python3之多线程学习

    这里做一个自己复习多线程的笔记 Python中使用线程有两种方式:函数或者用类来包装线程对象. 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程.语法如下: ...

  6. 深入了解一下HTTP缓存机制

    HTTP 缓存机制作为 web 性能优化的重要手段,是Web 开发知识体系库中的一个基础环节,但是对于很多学习者来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的, ...

  7. std::weak_ptr

    weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象. 进行该对象的内存管理的是那个强引用的 shared_ptr. weak_ptr只是提供了对管理对 ...

  8. 使PC端网页宽度自适应手机屏幕大小

    有时候我们会纠结PC页面在手机页面上无法正常显示,超出屏幕,有些内容看不到,现在又了下面的代码,可以做到自适应手机端的屏幕宽度: 在html的<head>中增加一个meta标签: < ...

  9. 百万年薪python之路 -- 并发编程之 多进程 一

    并发编程之 多进程 一. multiprocessing模块介绍 ​ python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...

  10. linux 基本操作--笔记

    linux 基本操作: pwd 显示当前目录 ll 用于查看文件和目录,即list,其参数比较多 -l 列出数据串,包含文件的属性和权限数据等 -a 列出全部文件,包含隐藏文件 -d 仅列出目录本身, ...