PostgreSQL+PostGIS+pgRouting最短路径规划之

本文详细介绍如何在PostgreSQL+PostGIS+pgRouting环境下配置并实现路径查询,包括软件下载、安装、地图数据导入及路径规划查询步骤。

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

这是一个集成算法在数据库上 利用数据库查询语句直接查询路径的方法。接下来就具体讲讲环境配置到路径查询的一条龙服务。

PostgreSQL+PostGIS+pgRouting这三个存在版本之间的依赖的
https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS
这个网址所示为各个版本之间的依赖关系 (可以按照自己的需求选择下载)
1.下载postsql(9.4),postgis(2.5.1),pgrouting(2.6.2)
飞机直达链接: https://pan.baidu.com/s/1CVl_2R8TazHGhpNRbo-iag 提取码: 9xye
2.安装postsql和postgis 教程如网址所示 https://www.cnblogs.com/ytwy/p/6817179.html
(注意在安装postsql时选择场景时直接下一步不用修改locale)
(在安装postgis 选择路径时必须在postsql安装目录下才能成功)
3.解压下载的pgrouting包
解压过后得到bin,lib,share三个文件夹
(1)把解压得到的bin下的文件粘贴复制到postsql安装目录下的bin下
(2)把解压得到的lib下的文件粘贴复制到postsql安装目录下的lib下
(3)把解压得到的share下的extension下的文件粘贴复制到postsql安装目录与之对应的文件夹下
4.导入地图数据(shp文件)
(1)我们在应用列表如4-1 打开postgis 如图4-2
在这里插入图片描述
4-1

(2)点击 4-2中 View connection details按钮输入登录信息连接数据库,点击options按钮勾选上最后一项
点击addfile添加shp文件修改 SRID为4326。最后点击import导入数据库
在这里插入图片描述
4-2
5.连接postsql进行路径规划查询
1.连接sql数据库
(1)使用qt进行连接,直接使用qt自带的“QPSQL”库进行连接

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
//以下为登录信息
db.setHostName("127.0.0.1");
db.setDatabaseName("rpath");
db.setPort(5432);
db.setUserName("postgres");
db.setPassword("123456");
bool ok = db.open();
if(!ok)
    return 0;
QSqlQuery qsql = QSqlQuery(db);

QString sql ="select *from road";  //此为查询语句
if(qsql.exec(sql))
{
    while (qsql.next()) {
            qDebug()<<qsql.value(0); //此为查询结果
    }
}
        (2)使用vs进行连接,查询语句等如 ***https://www.cnblogs.com/infiniti/p/4274752.html*** 所示
    2.查询最短路径(以下tableName为表名)
	(1)创建路网拓扑图,添加必要字段
.给导入的道路数据表添加关键字
			ALTER TABLE tableName ADD COLUMN source integer; //起点
       			ALTER TABLE tableName ADD COLUMN target integer;  //终点S
       			ALTER TABLE tableName ADD COLUMN length double precision; //允许正向通   道路长度
       			ALTER TABLE tableName ADD COLUMN rev_length double precision;//反向通路.创建拓扑图表(存放道路所有节点,数据库会创建一个后缀为vertices_pgr的表)
		  	SELECT pgr_createTopology('tableName',0.000001,'geom','gid');.为起点终点添加索引增加查询速度
  			CREATE INDEX source_idx ON tableName(source);
       		CREATE INDEX target_idx ON tableName(target);.给每一条道路赋值权重(正向,反向)
	                            updata tableName set length=ST_Length(ST_TransFrom(geom,4326),true),rev_length=ST_Length           (ST_TransFrom(geom,4326),true) where oneway is null;
 		            updata tableName set length=st_length(ST_TransFrom(geom,4326),true), rev_length=99999999999 where oneway=0;                                                                                                                                                                                                                  
update tableName set length=99999999999,rev_length=st_length(ST_TransForm(geom,4326),true) where oneway=1;

(2)使用查询语句查询
需要用到以下语句:

.离点最近的线段(dis表示距点多少m范围,poinx,poiny表示查询点的横坐标和纵坐标)	
		select ST_AsGeoJson(geom) from tableName where ST_DWithin(geom,ST_Geometryfromtext('point('||Pointx
||' '||Pointy||')',4326),dis) order by ST_Distance(geom,ST_GeometryFromText('point('||Pointzx||' '||Pointy||')',4326)) limit 1;.查询id语句(tableName_ver表示vertices_pgr为后缀的表,poinx,poiny表示查询点的横坐标和纵坐标)
		select id from tableName_ver where the_geom = ST_Geometryfromtext('point('||pointx||' '||pointy||')',4326);.最短路径查询语句(AsGeoJson表示转换wkb为json格式,start_id表示起点id,end_id表示终点id。id是在vertices_pgr为后缀表中查询而得)
		select seq,id1 AS node,id2 AS edge,cost,rev_length as rev_cost,ST_AsGeoJson(geom) from pgr_dijkstra('select gid as id,source,target,length as cost from tableName',start_id,end_id,false,false) as di join tableName pt on di.id2 = pt.gid;";

如果shp文件存储数据没有 查询的点就需要使用①语句 先让该点上路。查询出最近线段中最近的点。
最短路径查询是需要用到查询点在数据库中id来查询 ,所以就先要用到②语句在创建的拓扑图表中查询出id,再使用③语句来查询最短路径。

查出来的路径为下图所示,是一段段组成
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值