前言

因业务需求,需要做最短路径分析。最近几天查询资料,并自己动手,实现了简单的路径分析。

下面就介绍具体的实现过程。

本篇文章最终结果是在 PostgreSQL 数据库中实现的,后续的可视化展示会继续跟进。

一、道路数据处理

如果你已经有了道路数据,那就直接使用。

由于当前并没有较好的道路数据,这里我自己用 QGIS 造了些数据以供使用。

为了效果较好,在创建道路数据时是叠加了影像图的。并且要开启“捕捉工具”,这样在后续的拓扑分析中更好。

在完成道路数据的创建后,我直接进行了后续的工作,但是最终发现有问题,经过分析发现:道路的数据在每个相交的点处要进行打断,否则无法进行路径分析。

线打断用的工具是—“线相交”,输入、相交图层选当前道路图层:

如下图:

这三段本是一条道路,但是为了拓扑分析,需要进行在和别的道路相交点进行打断。

此处部分要注意:

  1、编辑时开启“捕捉工具”

  2、完成道路后进行线的打断

二、数据入库

数据库这一块,因为 PostgreSQL  有强大的空间数据处理扩展插件(PostGIS),并且也有路径分析的插件(pgRouting),所以选用该数据库。

PostgreSQL 数据安装:

  1、windows 下,直接在官网下载安装包即可,安装完成数据库后,会有 stackbuilder 安装向导,可以安装对应的一些插件等,比较方便;

  2、Ubuntu下(我用的服务器),在 18.04 及以上,可以使用 PostgreSQL Apt Repository ,这样可以安装需要的版本;

    2.1、PostgreSQL Apt Repository 使用

  3、安装及配置参考

PostGIS:

  这部分有两块,一个是 PostgreSQL 的扩展,一个是 PostGIS的GUI(需要单独安装,主要用于导入空间数据)。

以上这些安装完成后,可以进行数据导入了,

  1、创新新的数据库,创建完成后需要进行对数据库添加空间扩展

-- 提供如下空间信息服务功能:空间对象、空间索引、空间操作函数和空间操作符
CREATE EXTENSION postgis;
-- 用于网络分析的扩展模块
CREATE EXTENSION pgrouting;
-- gis 拓扑
CREATE EXTENSION postgis_topology;
-- 提供了几个函数来确定字符串之间的相似性和距离
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION address_standardizer;

  2、使用工具导入空间数据,最新版本在Windows下名字比较长,如下图:

到这里就完成了空间数据的导入,在这个过程中会遇到一些问题,可以参考:PostgreSQL 与 PostGIS 安装使用注意坑

三、构建拓扑

这一块主要是在数据库中使用 SQL 完成,创建对应的 source、target、length、reverse_cost 字段并赋值。

创建拓扑函数的使用

-- 添加起点id
ALTER TABLE public.roads ADD COLUMN source integer; -- 添加终点id
ALTER TABLE public.roads ADD COLUMN target integer; -- 添加道路权重值
ALTER TABLE public.roads ADD COLUMN length double precision; -- 创建拓扑结构                  
-- 为roads表创建拓扑布局,即为source和target字段赋值
SELECT pgr_createTopology('roads',0.00001, 'geom','id'); -- 创建索引
-- 为source和target字段创建索引
CREATE INDEX source_idx ON roads ("source");
CREATE INDEX target_idx ON roads ("target"); -- 为length赋值,这里在计算的时候用 ST_Transform 进行了转换
UPDATE roads SET length =st_length(ST_Transform(geom,3857)); -- 为 roads 表添加 reverse_cost 字段并用length的值赋值
ALTER TABLE roads ADD COLUMN reverse_cost double precision;
UPDATE roads SET reverse_cost =length;

四、路径分析

pgRouting 提供的最佳路径算法比较多,具体可以参考:pgRouting 最短路径算法查询

这里用 Shortest Path Dijkstra(狄克斯特拉)算法进行计算。

最新的 pgr_dijkstra 算法,支持多种方式,一对一、一对多、多对一、多对多等。

用例:

pgr_dijkstra(Edges SQL, start vid, end vid , [directed])
pgr_dijkstra(Edges SQL, start vid, end vids , [directed])
pgr_dijkstra(Edges SQL, start vids, end vid , [directed])
pgr_dijkstra(Edges SQL, start vids, end vids , [directed])
pgr_dijkstra(Edges SQL, Combinations SQL , [directed])
RETURNS SET OF (seq, path_seq, [start_vid], [end_vid], node, edge, cost, agg_cost)
OR EMPTY SET

传入的参数:

  1、Edges SQL

    a、id,创建拓扑的标识,名称不同用 as

    b、source,边起点标识符,拓扑后添加的字段

    c、target,边终点标识符,拓扑后添加的字段

    d、cost,边权重(长度)

    e、reverse_cost,回程权重

  2、start vid:路径起始点标识

  3、end vid:路径终点标识

  4、directed:ture 时,图被认为是有向的

返回参数:

  1、seq:查询结果排序值

  2、path_seq:一个路径下的排序值,新的路径重新从1开始

  3、start_vid:多对一、多对,有这个字段,路径的起始点标识

  4、end_vid:一对多、多对多,有这个字段,路径的终点标识

  5、node:路径中个个边连接点的标识(上一个边的 end,下一个边的 start)

  6、edge:路径中边的标识

  7、cost:当前边的成本(长度)

  8、reverse_cost:总成本(总长度)

根据上面的具体使用:

-- 最短路径分析
-- 直接使用,返回的是算法默认数据
SELECT * from public.pgr_dijkstra(
'SELECT
id,
source::integer,
target::integer,
length::double precision AS cost,
reverse_cost
FROM roads',
1,
20,
false
); -- edge 是创建拓扑时的 id 标识字段,所以可以通过这个在 roads 中筛选,并通过数据库自带的可视化查看结果
SELECT * from roads where "id" in
(
SELECT edge from public.pgr_dijkstra(
'SELECT
id,
source::integer,
target::integer,
length::double precision AS cost,
reverse_cost
FROM roads',
1,
20,
false
)
);

第二个SQL效果如下:

路径分析—QGIS+PostgreSQL+PostGIS+pgRouting(一)的更多相关文章

  1. GeoServer+PostgreSQL+PostGIS+pgRouting实现最短路径查询

    一.软件安装 GeoServer下载地址: http://geoserver.org/download/ PostgreSQL下载地址: https://www.postgresql.org/down ...

  2. postgresql+postgis+pgrouting安装步骤图解

    1.在此(https://www.bigsql.org/postgresql/installers.jsp/)下载postgresql(开源数据库,gis行业推荐使用); 2.在此(http://wi ...

  3. postgresql+postgis+pgrouting实现最短路径查询(1)---线数据的处理和建立拓扑

    准备一个线shp数据,并将其导入postgres里面,postgres安装postgis和pgrouting两个插件(方法见http://www.cnblogs.com/nidaye/p/455352 ...

  4. postgresql+postgis+pgrouting实现最短路径查询(2)---openlayers+geoserver实现最短路径

    自己的最短路径实现基本上是按照参考博文的1.2和3进行的,实现的时候也是问题不断,只能是一个一个解决. 问题1:自己发布的geoserver服务无法和OSM底图叠加到一起. 解决:参考博文2提到发布服 ...

  5. postgresql+postgis+pgrouting实现最短路径查询(3)--流程图

    项目结束,做一个项目的总结汇报,就把最短路径查询的实现流程图画了一下,现在补出来:

  6. GIS on CentOS 7 之 PostgreSQL & PostGIS

    PostgreSQL & PostGIS 安装postgresql 配置好yum源之后,使用yum info postgresql可发现 postgresql的版本为9.2.23,若想安装最新 ...

  7. 搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3

    Web GIS系列: 搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 使用GeoServer+QGIS发布WMTS服务 使用GeoSe ...

  8. PostgreSql+PostGIS和uDig的安装

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 总体来说,这两款开源软件均是很好安装的,一般按照提示一步一步 ...

  9. PostgreSQL+PostGIS

    PostGIS简介 PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象.空间索引.空间操作函数和空间操作符.同时,PostGIS遵循O ...

随机推荐

  1. Minimax 社论

    目录 题面 题解 代码 Reference 题面 LOJ #2537 / 洛谷 P5298 「PKUWC2018」Minimax 一棵有根二叉树 \(\mathcal T\) . 定义结点 \(x\) ...

  2. 调和级数为什么是 O(logn) 的

    目录 调和级数 正片 调和级数 调和级数(Harmonic series)定义为 \[H(n)=\sum_{i=1}^n\dfrac 1i \] \(H\) 发散,证明看百度 . 正片 首先我们把 \ ...

  3. fiddler抓包手机请求(转)

    http://ju.outofmemory.cn/entry/22854 从事前端开发的同学一定对Fiddler不陌生,它是一个非常强大的http(s)协议分析工具,如果你不知道它是什么,可以自行go ...

  4. Python logging日志管理

    import logging logger = logging.getLogger("simple_example") logger.setLevel(logging.DEBUG) ...

  5. 十分钟教会你如何使用VitePress搭建及部署个人博客站点

    使用VitePress可以让我们快速搭建一个静态博客网站,这篇文章将带领大家搭建一个基于VitePress的静态博客网站并且部署到GitHub Pages(github提供的静态网页服务) 快速上手 ...

  6. 【原创】Python 懂车帝口碑爬虫

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 懂车帝综合口碑 需求 操作环境 win1 ...

  7. 技术分享 | Prometheus+Grafana监控MySQL浅析

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 简介 Prometheus 一套开源的监控&报警&时间序列数据库的组合,通常 Kubernetes 中都会 ...

  8. 完整代码:AgileFontSet迅捷字体设置程序

    AgileFontSet用于快捷设置Windows系统字体和桌面图标间距,介绍参见:https://www.cnblogs.com/ybmj/p/11340105.html .这里提供AgileFon ...

  9. luogu1419 寻找段落 (二分,单调队列)

    单调队列存坐标 #include <iostream> #include <cstdio> #include <cstring> #include <algo ...

  10. Python自学笔记6-列表有哪些常用操作

    列表是Python中最重要的数据类型,它使用的频率非常非常的高,最大程度的发挥Python的灵活性. 和字符串一样,列表的操作方法也有很多.如果说一头钻进去,可能会导致学习没有重点.在这篇文章当中,首 ...