这是一个集成算法在数据库上 利用数据库查询语句直接查询路径的方法。接下来就具体讲讲环境配置到路径查询的一条龙服务。
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,再使用③语句来查询最短路径。
查出来的路径为下图所示,是一段段组成