使用pgrouting进行最短路径搜索

转载 https://www.cnblogs.com/weiweictgu/p/8280285.html

   PgRouting是基于开源空间数据库PostGIS用于网络分析的扩展模块,最初它被称作pgDijkstra,因为它只是利用Dijkstra算法实现最短路径搜索,之后慢慢添加了其他的路径分析算法,如A算法,双向A算法,Dijkstra算法,双向Dijkstra算法,tsp货郎担算法等,然后被更名为pgRouting。该扩展库依托PostGIS自身的gist索引,丰富的坐标系与图形类型,强大的几何处理能力,如空间查询,空间处理,线性参考等优势,能保障在较大数据级别下的网络分析效果更快更好。

最新源码见:

https://github.com/wilsonfu88/MapRoutingDemo

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中使用上面发布的搜索图层使用起止交叉点来显示导航路径,源码如下

 导航图层搜索


最终实现效果如下:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值