前言

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

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

本篇文章最终结果是在 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. linux服务器监控脚本

    #!/bin/bash #获取cpu使用率 cpuUsage=`top -n 1 | awk -F '[ %]+' 'NR==3 {print $2}'` #获取磁盘使用率 data_name=&qu ...

  2. 手把手教你定位线上MySQL慢查询问题,包教包会

    1. 慢查询日志的作用 慢查询日志默认不开启,建议手动开启,方便我们定位线上问题. 执行时间超过阈值的SQL会被写入到慢查询日志当中,这样可以帮助我们记录执行时间过长的SQL语句,定位线上慢SQL问题 ...

  3. postgresql逻辑备份工具pg_dump和pg_resotre学习

    (一)pg_dump备份 pg提供了pg_dump和pg_dumpall命令进行数据库的备份,pg_dumpall是将整个pg集群转储到一个脚本文件中,而pg_dump命令可以选择一个数据库或者部分表 ...

  4. 利用 SonarScanner 静态扫描 Rainbond 上的 Maven 项目

    对代码进行静态扫描是一种非常常见的代码质量保证手段,这种扫描不仅仅可以检查到代码中的缺陷,应用各种业界最佳实践,也可以检查出安全方面的漏洞,给予项目代码全方位的提升.在各种代码扫描方案之中,Sonar ...

  5. 集成 Spring Doc 接口文档和 knife4j-SpringBoot 2.7.2 实战基础

    优雅哥 SpringBoot 2.7.2 实战基础 - 04 -集成 Spring Doc 接口文档和 knife4j 前面已经集成 MyBatis Plus.Druid 数据源,开发了 5 个接口. ...

  6. AtCoder Educational DP Contest 总结

    前言 感觉都初一升初二了,再做这个题是不是有点太菜了啊-- 里面大概都是些 DP 板子题(确信,题目质量还挺高的,不过不涉及太难的优化(实际上只有最后一题是斜率优化). 不管了,还是写个 blog 来 ...

  7. React报错之Expected an assignment or function call and instead saw an expression

    正文从这开始~ 总览 当我们忘记从函数中返回值时,会产生"Expected an assignment or function call and instead saw an express ...

  8. 简单概述因特网(Internet)

    学习目的 了解 Internet 的概念,区别因特网与互联网. 了解 Internet 的基本结构. 了解 Internet 的发展历史. Internet 概念 因特网(Internet)是全球性的 ...

  9. Python自动化测试之文件操作

    1.读.写.追加文件 读:打开文件  r    读写:r+ 写:w 可写不可读  清空原文件   写读:w+ 清空文件 追加:a+  可以读写,文件不存在自动创建 练习读txt文件类容: #-*- c ...

  10. VS2019 Community社区版登录提示:我们无法刷新此账户的凭证 解决方法

    最正确的方式: 1.点击 帮助-->发送反馈-->报告问题 2.点击 检查新的许可证 ,即可登陆成功 3.如果提示:无法下载或者下载失败. 4.那么就需要在左边 账户选项 中将 嵌入式We ...