postgreSQL:通过pgrouting扩展,进行连通性分析

文章详细介绍了如何在PostgreSQL数据库中添加PostGIS和pgRouting扩展,然后导入线数据,如Shapefile,进行类型转换。接着创建网络拓扑,包括添加源和目标字段,计算线段长度。最后,通过pgr_dijkstra函数计算了最短路径,展示了查询结果的关键字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.添加postgres扩展

CREATE EXTENSION PostGIS
CREATE EXTENSION pgRouting

2.导入线数据至pg数据库

将shp数据,通过PostGIS Bundle导入至数据库,shp数据尽量为LineString类型,避免MultiLineString类型(多部件无法进行网络分析),以线的表名称“linetest”为例。

若导入为MultiLineString类型,则可在数据库表中新建geometry类型字段(字段名为“the_geom”,空间参考srid为4490),将MultiLineString类型转换为LineString类型。

(1)LineString类型字段创建方法:

select addgeometrycolumn('linetest', 'the_geom', 4490, 'LINESTRING', 2, FALSE)

(2)MultiLineString类型转换为LineString类型:

update linetest
set the_geom = st_linemerge(geom)

3.创建网络拓扑

根据linetest表,创建网络拓扑,作为分析的基础。shp导入后,linetest表会自动包含gid字段,可作为线段的唯一标识。

(1)创建必要的字段:

source integer类型 ##起点id,空值即可

target integer类型 ##终点id,空值即可

cost double类型 ##线段长度,赋值

创建字段:

ALTER TABLE linetest ADD COLUMN "source" INTEGER  default null;
ALTER TABLE linetest ADD COLUMN "target" INTEGER  default null;
ALTER TABLE linetest ADD COLUMN "cost" DOUBLE PRECISION  default null;

其中:

source、target字段可通过创建拓扑,自动添加线段节点的id。

计算线段长度:

UPDATE roads SET cost =st_length(ST_Transform(the_geom,4551));

其中:

4551为平面坐标系srid,可根据实际情况设置。

(2)创建拓扑

通过pgr_createtopology函数自动创建拓扑关系,其中:

linetest ##线段表名称

0.000001 ##计算容差

the_geom LineString类型 ##线段几何字段

gid integer类型 ##线段唯一id

source integer类型 ##起点id

target integer类型 ##终点id

select pgr_createtopology('linetest',0.000001,the_geom:='the_geom',id:='gid',source:='source',target:='target',rows_where:='true', clean:=false)

执行后,结果为ok,则成功。

(3)拓扑创建结果

执行成功后,自动创建节点表linetest_vertices_pgr,并为linetest表的source、target字段添加对应节点id。

节点表linetest_vertices_pgr:

线段表linetest字段赋值结果:

4.计算最短路径

通过pgr_dijkstra函数,计算最短路径。其中:

1、9为两个节点id,directed为是否考虑方向

select * from pgr_dijkstra('select gid as id,source,target,cost::double precision from linetest',1,9,directed:=true)

查询结果如下:

其中:

  1、seq:查询结果排序值

  2、path_seq:一个路径下的排序值,新的路径重新从1开始

  3、node:路径中各节点的标识(上一个边的 end,下一个边的 start)

  4、edge:路径中边的标识

  5、cost:当前边的成本(长度)

  6、agg_cost:总成本(总长度)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值