暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pgrouting的快速部署及基本使用

地图宝宝 2021-05-21
3875

 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`-`u
          chmod +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



                                文章转载自地图宝宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                评论