Postgis实现最短路径查询(Dijkstra算法)

文章介绍了如何在WebGIS系统中实现路径规划,包括GIS数据处理、PostGIS数据库的设置、路径成本和优先级的设定、数据库视图的创建以及通过Geoserver发布接口和OpenLayers进行路径的可视化。重点讨论了OSM数据的转换、路网拓扑的构建以及路径优先级的调整方法。

前言

这篇文章是我的webgis系统中的最后一个功能,也是我花了好长时间才明白一点的。内容借鉴博主:不睡觉的怪叔叔

GIS数据处理

首先获取了osm的shp数据,在Arcgis中将其转化为web墨卡托投影(EPSG:3857),并使用gis工具中的要素转线,可以将相交的折线在交点处打断。
在这里插入图片描述

数据导入

现在pgAdmin中建立一个数据库,并安装postgis和pgrouting插件。
sql:create extension postgis 和 create extension pgrouting
测试是否安装成功:select postgis_full_version(),pg_version()
最后将数据导入对应的数据库,可以通过postgis自带的用来导入shp数据的工具。
注意设置SRID:3857

设置路径成本

首先为shenzhen_roads表(右键点击查询工具)添加四个字段(后面涉及到对应字段时再详细解释):

source —— 用于保存路径起始顶点的id
target —— 用于保存路径终止顶点的id
cost —— 用于保存路径正向的成本(或者代价)
reverse_cost —— 用于保存路径反向的成本(或者代价)
SQL语句:

ALTER TABLE shenzhen_roads
ADD COLUMN source INTEGER,
ADD COLUMN target INTEGER,
ADD COLUMN cost DOUBLE PRECISION,
ADD COLUMN reverse_cost DOUBLE PRECISION;

OSM数据包含一个oneway列,它的值可能是以下三个值之一:

‘F’ —— 表示该路径是单向的,且路径方向是正向的。
‘T’ —— 表示该路径是单向的,且路径方向是反向的。
‘B’ —— 表示该路径是双向的。
在这里插入图片描述
后续是根据路径方向计算路径成本以及创建路网拓:将路径的长度作为成本,如果路径是正向的,则cost值为路径的长度,reverse_cost值为-1;如果路径是反向的,则reverse_cost值为路径的长度,cost值为-1;如果路径是双向的,则cost和reverse_cost的值都为路径的长度。
路网拓朴:

SELECT pgr_createTopology(
	'shenzhen_roads', 
	0.001,
	'geom',
	'gid',
	'source',
	'target'
); 

上面的六个参数分别表示:

路网表
路径之间的容差,两条路径的距离大于这个容差值,就表示它们不相交,否则就是相交。
路网表中包含空间信息的列
路网表的主码列
保存路径起始顶点的id的列
保存路径终止顶点的id的列

之后多处一张表shenzhen_roads_vertices_pgr
shenzhen_roads中source和target的值即为这里保存的id

路径优先级

这是无优先级
现在添加一个penalty列用于保存每条路径的优先级信息(penalty值越小,优先级越高):

ALTER TABLE shenzhen_roads ADD COLUMN penalty DOUBLE PRECISION;

把每条路径的penalty的值都设为1.0,表示所有路径都没有优先级之分(penalty值都为1.0)。

UPDATE shenzhen_roads SET penalty = 1.0;

有优先级
车辆路径可以让路径的优先级符合以下规则:
禁止在pedestrian、footway、steps、cycleway、track这些路径上行驶。
不鼓励在rsidential路径上行驶。
鼓励在primary、primary_link路径上行驶。

修改路径的优先级具体如下:

UPDATE shenzhen_roads SET penalty = -1.0
WHERE fclass IN ('steps','footway','pedestrian', 'cycleway', 'track', 'track_grade2');

UPDATE shenzhen_roads SET penalty = 5.0
WHERE fclass IN ('residential');

UPDATE shenzhen_roads SET penalty = 0.8
WHERE fclass IN ('tertiary', 'tertiary_link', 'mo
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值