PgRouting是基于开源空间数据库PostGIS用于网络分析的扩展模块,最初它被称作pgDijkstra,因为它只是利用Dijkstra算法实现最短路径搜索,之后慢慢添加了其他的路径分析算法,如A算法,双向A算法,Dijkstra算法,双向Dijkstra算法,tsp货郎担算法等,然后被更名为pgRouting。该扩展库依托PostGIS自身的gist索引,丰富的坐标系与图形类型,强大的几何处理能力,如空间查询,空间处理,线性参考等优势,能保障在较大数据级别下的网络分析效果更快更好。
最新源码见:
1、环境搭建
需要先安装PostgreSQL9.6,再安装PostGIS,注意版本号PostGIS2.4后已经集成了pgRouting,无需单独安装
PostGIS 官网 http://www.postgis.org/
pgRouting官网http://pgrouting.org/documentation.html
2、启用pgRouting功能,连接到对应postgres数据库后执行下面的sql语句
CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
3、路网数据处理
由于路网分析的特殊性,只支持LineString类型,不支持MultiLineString类型,如果路网数据为MultiLineString类型导入前需加工处理,可使用arcgis在交叉点处使用打断相交线来分割线,参见
http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//01m8,最终可用的数据必须为路网不自相交,导入时选择简单的线类型,否则网络拓扑计算数据会错误
 
4、路网拓扑数据计算处理,执行成功后,执行成功后会生产一个**_vertices_pgr的表,里面包含路网相交点的空间数据
 alter table road add column source int;

alter table road add column target int;

create index road_source_idx on road("source");
create index road_target_idx on road("target"); ALTER TABLE road ADD COLUMN length double precision; SELECT pgr_createTopology('road',0.00001, 'geom', 'gid'); update road set length =st_length(geom);

5、查询最短路径sql语句

SELECT seq, id1 AS node, id2 AS edge, cost,geom  FROM pgr_dijkstra('
SELECT gid AS id,
source::integer,
target::integer,
length::double precision AS cost
FROM xmpark_road',
1, 10, false, false) as di
join xmpark_road pt
on di.id2 = pt.gid

6、参数化的查询sql语句,可以用下面的语句,在geoserver中使用发布sql视图图层来显示导航搜索图层,见下图

SELECT seq, id1 AS node, id2 AS edge, cost,geom  FROM pgr_dijkstra('
SELECT gid AS id,
source::integer,
target::integer,
length::double precision AS cost
FROM xmpark_road',
%a%, %b%, false, false) as di
join xmpark_road pt
on di.id2 = pt.gid

 7、在ol中使用上面发布的搜索图层使用起止交叉点来显示导航路径,源码如下
 <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no" />
<link rel="stylesheet" href="ol/ol.css" type="text/css">
<script src="ol/ol-debug.js"></script>
<script src="ol/proj4.js"></script>
<script src="js/jquery-1.8.0.min.js"></script>
<meta charset="utf-8" />
</head>
<body>
<div id="map" style="width: 100%;height:800px;border:solid 1px red" class="map">
<div>
id1: <input id="id1" value="30" />
id2: <input id="id2" value="66" />
<input type="button" value="query" onclick="queryRoute()" />
</div>
</div>
</body>
</html> <script type="text/javascript">
var format = 'image/png';
var bounds = [501369.9375, 2494100.25,
502073, 2495256.25];
var mousePositionControl = new ol.control.MousePosition({
className: 'custom-mouse-position',
target: document.getElementById('location'),
coordinateFormat: ol.coordinate.createStringXY(5),
undefinedHTML: '&nbsp;'
});
var tiled = new ol.layer.Tile({
visible: true,
source: new ol.source.TileWMS({
url: 'http://localhost:8080/geoserver/pg_ws/wms',
params: {
'FORMAT': format,
'VERSION': '1.1.1',
tiled: true,
STYLES: '',
LAYERS: 'pg_ws:xmpark_road',
}
})
}); var cross_tiled = new ol.layer.Tile({
//visible: true,
source: new ol.source.TileWMS({
url: 'http://localhost:8080/geoserver/pg_ws/wms',
params: {
'FORMAT': format,
'VERSION': '1.1.1',
tiled: true,
STYLES: '',
LAYERS: 'pg_ws:xmpark_road_vertices_pgr',
}
})
}); var projection = new ol.proj.Projection({
code: 'EPSG:3857',
units: 'm',
axisOrientation: 'neu',
global: true
});
var map = new ol.Map({
controls: ol.control.defaults({
attribution: false
}).extend([mousePositionControl]),
target: 'map',
layers: [
tiled, cross_tiled
],
view: new ol.View({
projection: projection
})
}); map.getView().fit(bounds, map.getSize()); var routeLayer = null; function queryRoute() {
if (routeLayer != null) {
map.removeLayer(routeLayer);
} var val1 = $("#id1").val();
var val2 = $("#id2").val();
routeLayer = new ol.layer.Tile({
visible: true,
source: new ol.source.TileWMS({
url: 'http://localhost:8080/geoserver/pg_ws/wms',
params: {
'FORMAT': format,
'VERSION': '1.1.1',
tiled: true,
STYLES: '',
LAYERS: 'pg_ws:xmpark_road_route',
'viewparams': 'a:' + val1 + ';b:' + val2
}
})
}); map.addLayer(routeLayer);
}
</script>

导航图层搜索

最终实现效果如下:

 
 
 

使用pgrouting进行最短路径搜索的更多相关文章

  1. Java室内最短路径搜索(支持多楼层)

    修改了上次的代码,现在支持室内的多楼层情况下的最短路径搜索,还是使用A*算法,把在GraphAdjList中VNode没有利用起来的data字段作为我们存储楼层属性的位置. 实际上是我偷懒了,正常情况 ...

  2. Python 图_系列之基于<链接表>实现无向图最短路径搜索

    图的常用存储方式有 2 种: 邻接炬阵 链接表 邻接炬阵的优点和缺点都很明显.优点是简单.易理解,对于大部分图结构而言,都是稀疏的,使用炬阵存储空间浪费就较大. 链接表的存储相比较邻接炬阵,使用起来更 ...

  3. t-sql最短路径搜索

    SET STATISTICS IO ON; SET STATISTICS TIME ON; GO IF OBJECT_ID(N'dbo.t1') IS NOT NULL DROP TABLE dbo. ...

  4. A*算法的原理 <转>

    第一部分:A*算法简介    写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里 抛砖引玉,希望大家都来热心的参与.     还是说正题,我先拿A*算法开刀, ...

  5. A*算法详解 BZOJ 1085骑士精神

    转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...

  6. 深入了解A*

    一.前言 在这里我将对A*算法的实际应用进行一定的探讨,并且举一个有关A*算法在最短路径搜索的例子.值得注意的是这里并不对A*的基本的概念作介绍,如果你还对A*算法不清楚的话,请看姊妹篇<初识A ...

  7. 【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1085 囧啊囧,看了题解后写了个程序,但是样例总过不了T+T,调试了不下于1个小时,肉眼对拍看了根本看 ...

  8. 单源最短路径——Dijkstra算法学习

    每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...

  9. PAT 1003

    1003. Emergency (25) As an emergency rescue team leader of a city, you are given a special map of yo ...

随机推荐

  1. java web从入门到精通

    1.Springboot配置 1.1mybatis mapper.xml所在的目录必须为resource的资源文件夹,如果xml文件在java的package里面,需要修改文件夹类型 idea修改方式 ...

  2. c++ complie link error 2019/2001

    1:没有将需要的文件添加到项目中,只是考到项目所在的目录了 2:没有添加 类导出 宏

  3. 角度&弧度转换

    一.角度转换为弧度 问题: 当使用Math类的三角函数的时候,所有的单位都是用弧度表示的.你有一个或多个角是用角度数度量的,并且希望把它们转换为弧度数,从而可以用它们作为Math类的成员. 解决方法: ...

  4. JPA Example 基本使用使用实例

    一.相关接口方法     在继承JpaRepository接口后,自动拥有了按“实例”进行查询的诸多方法.这些方法主要在两个接口中定义,一是QueryByExampleExecutor,一个是JpaR ...

  5. [LeetCode&Python] Problem 27. Remove Element

    Given an array nums and a value val, remove all instances of that value in-placeand return the new l ...

  6. sync.Pool的使用

    一定要搞明白sync.Pool的正确用法,避免出现以下问题: kline := this.pool.Get() defer this.pool.Put(kline) kline.UnMarshal(d ...

  7. Html中video的属性和方法大全

    <video>标签的属性 src :视频的属性 poster:视频封面,没有播放时显示的图片 preload:预加载 autoplay:自动播放 loop:循环播放 controls:浏览 ...

  8. Layer弹出层销毁问题

    Layer弹出层销毁问题 最近开发时有个问题记录一下 点击按钮显示相应的图表信息,当时自己点感觉没问题,谁知到测试手里多次点击就会有后续打开的窗口无法渲染问题,看了半天才发现是调用layer.clos ...

  9. leetcode 刷题(3)--- 无重复字符的最长子串

    给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...

  10. the status bar issue of react-native Modal on Android ( RN v0.57.0)

    Problem: When use Modal in react-native, the status bar is not included if you make a full-screen ma ...