“ pgRouting在docker中进行部署使用,非常便捷,结合arcgis对路网数据的拓扑处理,使用shp2pgsql-gui导入数据,可快速实现最短路径分析的功能。”

主要内容:
1、docker及镜像的部署
2、离线环境部署
3、数据库的初始化
4、路网数据处理
5、数据导入
6、拓扑构建,路径分析
7、相关资料链接
系统环境:
1、centos 7
2、Docker version 18.03.1-ce, build 9ee9f40
3、docker-pgrouting 13-3.1-3.1.3
PostgreSQL 13.2 (Debian 13.2-1.pgdg100+1) on x86_64-pc-linux-gnu
postgis 3.1
pgrouting 3.1.3
4、dpage/pgadmin4版本 5.2
01
—
docker及镜像部署
联网环境下安装比较简单
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
还有更完善的安装方法,以及docker的管理工具,不在赘述。能用就行。
基础的docker 配置
启动systemctl start docker设置开机自启动systemctl enable docker验证是否安装成功docker version新建docker用户组sudo groupadd docker把当前用户添加到docker用户组,使其即使没有sudo权限也能操作docker,方便一些(重进终端生效)sudo gpasswd -a ${USER} docker
docker镜像的话主要是两个,pgrouting和pgadmin。
pgrouting依赖postgresql和postgis,pgadmin是postgresql的数据库管理工具,方便维护数据库。
pgrouting的镜像,推荐docker-pgrouting,官方地址是:
https://github.com/pgRouting/docker-pgrouting
该镜像内已经包含了相应版本的postgresql和postgis,无需额外下载单独的镜像。
把该项目工程直接下载下来,需要使用docker-compose来创建镜像和实例。
wget https://codeload.github.com/pgRouting/docker-pgrouting/zip/refs/heads/master
在操作之前需要先安装docker-compose工具
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uchmod +R 777 usr/local/bin/docker-compose查看版本号,检查安装是否成功docker-compose version
解压后,包含很多版本的镜像包,例如选择当前最新的版本:

进入到指定版本目录:

执行:
$ cd 13-3.1-3.1.3$ docker-compose up
上面的操作首先会去拉去镜像,然后创建实例容器。如果本地已经拉取过镜像,不会重复拉取。创建实例的各项参数都配置在docker-compose.yml中:

docker-compose 在设置实例分卷的时候,位置默认是在 /var/lib/docker/volumes/目录下。
如果想自定义配置信息的话,可以参照执行以下指令,通过上面的一通操作已经将镜像下载了下来,借助镜像创建一个新的容器:
docker run -itd --name pgroutingTest3 \-v /docker/pgroutingTest3/data:/var/lib/postgresql/data \-e POSTGRES_PASSWORD=root -p 5432:5432 \pgrouting/pgrouting:13-3.1-3.1.3
如果想进入实例内部
$ docker exec -it pgroutingTest3 bin/bash
如下,进入内部完成指定数据库的postgis和pgrouting的扩展并退出。

不过关于sql的操作,还是在pgadmin中更方便一些。
安装pdadmin的镜像,推荐dpage/pgadmin4。
docker pull dpage/pgadmin4
创建容器
docker run -p 80:80 -e "PGADMIN_DEFAULT_EMAIL=999@qq.com" \-e "PGADMIN_DEFAULT_PASSWORD=abc@123" -d dpage/pgadmin4
PGADMIN_DEFAULT_EMAIL 和 PGADMIN_DEFAULT_PASSWORD 分别是pgadmin在浏览器中登录的用户名和密码。
接下来就可以在浏览器中访问pgadmin的管理界面,利用上面的用户名密码登录,然后连接数据库。

需要注意的是: 这里的pgadmin和postgresql是分别部署在两个docker容器中的。pgadmin连接的相当于是另一个docker中的数据库,所以在配置Host name/address时,IP地址不是docker主机服务器的IP ,而是docker分配给postgresql实例的内部IP地址。
查看docker内的IP地址:

连接成功,正常操作数据库
02
—
离线环境部署
关于离线环境的部署,考虑到很多用到pgrouting做路径分析的需求是在内网环境,比如2B的一项项目需要在专网中。
实践中,可以考虑在互联网环境将镜像包在docker中进行导出,备份。然后拷贝到内网环境中导入到docker中。
docker本身,可以下载安装包,拷贝到内网进行安装:(安装可能要依赖相关的一些组件包,具体的centos服务器或虚拟机中可能没有,下载安装即可)
docker 的下载地址https://download.docker.com/linux/centos/7/x86_64/stable/Packages/centos7 相关包下载地址http://mirrors.163.com/centos/7/os/x86_64/Packages/container-selinux 安装包http://rpm.pbone.net/index.php3/stat/4/idpl/36266349/dir/scientific_linux_7/com/container-selinux-2.9-4.el7.noarch.rpm.html
03
—
数据库初始化
postgresql安装后,会默认有一个名称为postgres的数据库,可以新建一个,使用pgadmin进行可视化的操作,创建数据库,test。

在该数据库下安装postgis和pgrouting的扩展。
create extension postgis;create extension pgrouting;
验证是否安装成功:
select postgis_full_version();select pgr_version();
04
—
路网数据处理
pgrouting官方文档,有使用osm数据的示例,但实际的使用过程中数据来源不一,主要是要解决数据质量问题。主要考虑数据的合并,去除线的伪节点和假节点。
以小编的数据为例:

(PS 如果需要路网数据,本公众号【地图宝宝】有免费的矢量数据分享,关注公众号即可免费领取一份指定城市的路网数据,关注并查看数据福利。)
数据分很多图层,需要进行合并,像铁路这种就去掉了,做路径规划一般也没有实际意义。
推荐使用arcgis进行数据处理,图层合并工具:geoprocessing->merge。
合并完成后,进行要素转线的处理,可以对道路数据进行优化,去除伪节点。

05
—
数据导入
将处理过的路网shp数据导入postgres数据库中。
比较方便的方法是,在windows环境安装一套postgresql和postgis

postgis 完成后,在安装目录会有一个shp2pgsql-gui.exe的可视化工具。具体路径是在C:\Program Files\PostgreSQL\10\bin\postgisgui\shp2pgsql-gui.exe
该导入工具直接连接到数据库,生成一张路网数据的表。
注意在连接数据库时,这里的IP地址要写入docker主机服务器的IP地址,因为不是docker容器间的访问。
导入时设置SRID,建议 3857

导入后去数据库查看生成的新表是否OK:

创建表的名称默认是与导入的shp文件数据的文件名是一样的,如qingdao_roads。默认路段的几何信息是存放在geom字段。
然后需要进行拓扑节点表的创建,在这之前需要在原始道路表中新增source和target字段,类型是bigint,分别存储对应路段的起始节点和终止节点的id。
拓扑构建:
select pgr_createTopology('qingdao_roads',0.000001,'geom','gid','source','target');
构建成功后会创建 [原表名]_vertices_pgr 的表,存储的是拓扑节点。
06
—
执行最短路径分析
最短路径查询:
select * from pgr_dijkstra('select gid as id,source,target,shape_leng as cost,geom from qingdao_roads',1,10);
pgr_dijkstra方法的第一个参数是sql语句,算法接受指定名称的字段做分析,别名需要一一对应。具体可以查看官方文档的说明。在这里以路段的长度作为消耗cost计算字段。

关联查询出原始路段的几何信息
select * from qingdao_roads where gid in(select edge from pgr_dijkstra('select gid as id,source,target,shape_leng as cost,geom from qingdao_roads',1,10))
pgadmin的geometry viewer中预览路径:

后续可以结合后台业务做更复杂的处理。
07
—
相关资料
docker 简单教程
https://www.runoob.com/docker/centos-docker-install.html
docker的离线安装
https://juejin.cn/post/6844903906460319757
centos 7 内部软件包下载地址
http://mirrors.163.com/centos/7/os/x86_64/Packages/
推荐的pgrouting镜像
https://github.com/pgRouting/docker-pgrouting
pgrouting 官方文档
https://pgrouting.org/documentation.html




