pgrouting最优路径规划之一

最近接触pgrouting。把学习的结果记录下来
一、pgrouting安装和配置
需要根据系统版本、PostgreSQL版本、PostGIS版本来选择合适的pgrouting版本
下载包以后解压缩,将lib目录下文件复制到PostgreSQL的lib目录下,再在PostgreSQL数据库中执行share/extension目录下的sql脚本,这样就完成了整个环境的配置

配置完成后,使用命令行创建数据库,使数据库支持PostGIS和pgRouting的函数和基础表

CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION address_standardizer;


二、导入shp数据

我使用的shp数据是自己手工绘制的,并通过拓扑打断相交线
我这里使用的是PostgreSQL自带的pgadmin,将shp数据导入到PostgreSQL数据库:

打开postgis安装目录下的PostGISShapefile Import/Export Manager

点击view connection details,设置数据库的连接
在Import选项卡中,点击Add File,并选择进行路径规划的路网shp
导入成功后就能在postgresql中看到导入的数据表

三、创建拓扑

//添加起点id

ALTER TABLE crossroad ADD COLUMN source integer;

//添加终点id

ALTER TABLE crossroad ADD COLUMN target integer;

//添加道路权重值

ALTER TABLE crossroad ADD COLUMN length double precision;


//为sampledata表创建拓扑布局,即为source和target字段赋值,生成crossroad_vertices_pgr

SELECT pgr_createTopology('crossroad',0.00001, 'geom', 'gid');

//为source和target字段创建索引

CREATE INDEX source_idx ON crossroad ("source");
CREATE INDEX target_idx ON crossroad ("target");

//为length赋值

update crossroad set length =st_length(geom);

//或者用已有的字段长度赋值,下面shape_length为shp中已有的长度属性

UPDATE crossroad SET length = shape_length;


//为crossroad表添加reverse_cost字段并用length的值赋值

ALTER TABLE crossroad ADD COLUMN reverse_cost double precision;
UPDATE crossroad SET reverse_cost =length;


四、查询

使用pgr_dijkstra算法查询

SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_dijkstra('
SELECT gid AS id,                   
source::integer,                       
target::integer,                      
length::double precision AS cost
FROM crossroad,
1, 9, false, false);

查询结果如图所示:
其中node代表路径的节点、edge代表边、cost就是length字段的成本
从1号点到9号点的最短路径可视化结果:1-8-9

五、geoserver发布图层
a.生成路网基础图
先发布路网shp数据,再发布crossroad_vertices_pgr,再将两图层叠加到一起,形成路径规划的基础图。(红色标注为节点编号)
b.生成路径规划图

新建图层,选择数据存储为postGIS的存储,再选择“配置新的SQL视图”,在SQl语句中添加以下语句,创建视图

SELECT seq, id1 AS node, id2 AS edge, cost,geom  FROM pgr_dijkstra('
SELECT gid AS id,                    
source::integer,                       
target::integer,                      
length::double precision AS cost
FROM crossroad',
1, 9, false, false) as di
join crossroad pt
on di.id2 = pt.gid;

计算好边界之后,再将1和9替换为带参的%a%和%b%

六、展示查询结果
在Openlayers中,我们通过TileWMS的方式来加载路网基础和路径规划

路网基础服务:

var roadLayer = new ol.layer.Tile({
          source: new ol.source.TileWMS({
            url: 'http://localhost:8080/geoserver/test/wms',
            params: {'LAYERS': 'test:cross', 'TILED': true},
            serverType: 'geoserver'
          })
        })
map.addLayer(roadLayer);

路径规划服务:(带参数)

var routeLayer = new ol.layer.Tile({
	source: new ol.source.TileWMS({
		url: 'http://localhost:8080/geoserver/test/wms',
		params: {'LAYERS': 'test:cross_route', 'TILED': true,'viewparams':'a:'+val1+';b:'+val2},
		serverType: 'geoserver'
	})
})
map.addLayer(routeLayer);

最终结果:



  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
在PostGIS中,已知两个点,我们可以使用最短路径算法来计算最优路径,并进行连通性分析。 首先,我们可以利用最短路径算法(如Dijkstra算法或A*算法)计算出两点之间的最优路径。这些算法基于权重或距离来确定路径,可以考虑道路网络中的交通状况和交通规则。我们需要确保在数据库中有包含道路网络的图形数据,并且具有相关属性(例如道路长度、速度限制等)。 在PostGIS中,可以使用pgRouting扩展来执行最短路径算法。首先,我们需要将图形数据导入PostGIS数据库,并且将其转换为拓扑网络。然后,可以使用pgRouting函数来计算最短路径。通过指定起点和终点,函数将返回两点之间的最短路径。我们还可以设置其他参数,如避免特定道路或考虑交通状况等。 除了计算最优路径,我们还可以利用PostGIS进行连通性分析。连通性分析可以确定两个点之间是否存在路径以及路径的连通程度。我们可以使用图形网络分析中的一些指标进行分析,如最短路径长度、可到达性、网络密度等。 通过查询图形数据和执行网络分析函数,我们可以获取连通性分析的结果。如果两个点之间存在路径,则意味着它们是连通的。如果两点之间的路径长度较短,则连通程度较高。这些结果可以帮助我们理解路网的结构以及两点之间的交通连接情况。 总之,在PostGIS中,我们可以使用最短路径算法来计算两点之间的最优路径,并通过连通性分析来评估两点之间的连通性。这些功能可以为交通规划、路线规划等应用提供有价值的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

evomap

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值