基于 PostGIS 的路径规划 PG-Routing

利用docker 部署 pgrouting,并针对使用方法进行简单介绍

安装

新建 dockerfile 文件

1
2
3
4
from postgis/postgis:latest

# 此处 pgrouting 版本号需要根据 pg 的版本修改
apt-get update && apt-get install -y postgresql-16-pgrouting

构建 pgrouting 镜像

1
docker build .

初始化

1
2
3
# 默认已经安装 PostGIS 并启用了 postgis 拓展
# 初始化 pgrouting 拓展
CREATE EXTENSION pgrouting;

导入数据

从 OSM 下载路网数据:https://download.geofabrik.de/asia/china/hubei-latest-free.shp.zip

解压后用 QGIS 打开,新建 PostGIS 的数据库连接,拖动数据图层到 PostGIS 数据库。

更新字段

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
-- 添加起点id
ALTER TABLE 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;

-- 规划路径
SELECT * from  public.pgr_dijkstra(
    'SELECT
    id,
    source::integer,
    target::integer,
    length::double precision AS cost,
    reverse_cost
    FROM roads', 
    100941, 
    100942, 
    false
);

-- 在缓冲区范围内规划路径,并将规划结果组合成矢量线
SELECT st_union(geom) 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
where st_intersects(geom, (select st_setsrid(st_buffer(st_extent(a.the_geom),0.001),4326) from roads_vertices_pgr a where a.id in (264810, 264809)))
', 
        264810, 
        264809, 
        false
    ) 
);
Gear(夕照)的博客。记录开发、生活,以及一些不足为道的思考……