前言
这篇文章是我的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

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

被折叠的 条评论
为什么被折叠?



