一 路径分析—QGIS+PostgreSQL+PostGIS+pgRouting

前言因业务需求,需要做最短路径分析 。最近几天查询资料,并自己动手,实现了简单的路径分析 。
下面就介绍具体的实现过程 。
本篇文章最终结果是在 PostgreSQL 数据库中实现的,后续的可视化展示会继续跟进 。
一、道路数据处理如果你已经有了道路数据,那就直接使用 。
由于当前并没有较好的道路数据,这里我自己用 QGIS 造了些数据以供使用 。
为了效果较好,在创建道路数据时是叠加了影像图的 。并且要开启“捕捉工具”,这样在后续的拓扑分析中更好 。

一 路径分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插图
在完成道路数据的创建后,我直接进行了后续的工作,但是最终发现有问题,经过分析发现:道路的数据在每个相交的点处要进行打断,否则无法进行路径分析 。
线打断用的工具是—“线相交”,输入、相交图层选当前道路图层:
一 路径分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插图
如下图:
这三段本是一条道路,但是为了拓扑分析,需要进行在和别的道路相交点进行打断 。
一 路径分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插图
此处部分要注意:
1、编辑时开启“捕捉工具”
2、完成道路后进行线的打断
二、数据入库数据库这一块,因为 PostgreSQL  有强大的空间数据处理扩展插件(PostGIS),并且也有路径分析的插件(pgRouting),所以选用该数据库 。
PostgreSQL 数据安装:
1、windows 下,直接在官网下载安装包即可,安装完成数据库后,会有 stackbuilder 安装向导,可以安装对应的一些插件等,比较方便;
2、Ubuntu下(我用的服务器),在 18.04 及以上,可以使用 PostgreSQL Apt Repository,这样可以安装需要的版本;
【一 路径分析—QGIS+PostgreSQL+PostGIS+pgRouting】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下名字比较长,如下图:
一 路径分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插图

一 路径分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插图
到这里就完成了空间数据的导入,在这个过程中会遇到一些问题,可以参考:PostgreSQL 与 PostGIS 安装使用注意坑
三、构建拓扑这一块主要是在数据库中使用 SQL 完成,创建对应的 source、target、length、reverse_cost 字段并赋值 。
创建拓扑函数的使用
-- 添加起点idALTER TABLE public.roads ADD COLUMN source integer;-- 添加终点idALTER 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;

经验总结扩展阅读