基于pgrouting的任意两点间的最短路径查询函数
来源:互联网 发布:淘宝店铺装修教程pdf 编辑:程序博客网 时间:2024/05/19 22:01
前面文章介绍了如何利用postgresql创建空间数据库,建立空间索引和进行路径规划。但是在真实的场景中用户进行路径规划的时候都是基于经纬度数据进行路径规划的,因为用户根本不会知道道路上节点的ID。因此文本讲述如何查询任意两点间的最短路径。
一、定义函数名及函数参数
函数名定义为: pgr_fromAtoB
参数设置分别为:
输入为数据库表名,起点和终点的经纬度坐标
输出为:路段序号,gid号,道路名,消耗及道路集合体。
IN tbl varchar, --数据库表名
IN x1 double precision, --起点x坐标
IN y1 double precision, --起点y坐标
IN x2 double precision, --终点x坐标
IN y2 double precision, --终点y坐标
OUT seq integer, --
OUT gid integer,
OUT name text,
OUT heading double precision,
OUT cost double precision,
OUT geom geometry
二、计算距离起点和终点距离最近的道路节点,
可以使用的函数为
SELECT id::integer FROM minidata_vertices_pgr
ORDER BY the_geom <-> ST_GeometryFromText(''POINT('
|| x1 || ' ' || y1 || ')'',900913) LIMIT 1
三、然后根据检索到的节点再调用pgrouting的最短路径查询函数进行计算。
可以使用的函数为:
SELECT gid, geom, name, cost, source, target,
ST_Reverse(geom) AS flip_geom FROM ' ||
'pgr_bdAstar(''SELECT gid as id, source::int, target::int, '
|| 'length::float AS cost,x1,y1,x2,y2 FROM '
|| quote_ident(tbl) || ''', '
|| source || ', ' || target
|| ' ,false, false), '
|| quote_ident(tbl) || ' WHERE id2 = gid ORDER BY seq
四、整合上面几个子过程,得到的最终查询sql函数如下:
----DROP FUNCTION pgr_fromAtoB(varchar, double precision, double precision, -- double precision, double precision);CREATE OR REPLACE FUNCTION pgr_fromAtoB( IN tbl varchar, IN x1 double precision, IN y1 double precision, IN x2 double precision, IN y2 double precision, OUT seq integer, OUT gid integer, OUT name text, OUT heading double precision, OUT cost double precision, OUT geom geometry ) RETURNS SETOF record AS$BODY$DECLARE sql text; rec record; sourceinteger; targetinteger; pointinteger; BEGIN-- 查询距离出发点最近的道路节点EXECUTE 'SELECT id::integer FROM minidata_vertices_pgr ORDER BY the_geom <-> ST_GeometryFromText(''POINT(' || x1 || ' ' || y1 || ')'',900913) LIMIT 1' INTO rec;source := rec.id;-- 查询距离目的地最近的道路节点EXECUTE 'SELECT id::integer FROM minidata_vertices_pgr ORDER BY the_geom <-> ST_GeometryFromText(''POINT(' || x2 || ' ' || y2 || ')'',900913) LIMIT 1' INTO rec;target := rec.id;-- 最短路径查询 seq := 0; sql := 'SELECT gid, geom, name, cost, source, target, ST_Reverse(geom) AS flip_geom FROM ' || 'pgr_bdAstar(''SELECT gid as id, source::int, target::int, ' || 'length::float AS cost,x1,y1,x2,y2 FROM ' || quote_ident(tbl) || ''', ' || source || ', ' || target || ' ,false, false), ' || quote_ident(tbl) || ' WHERE id2 = gid ORDER BY seq';-- Remember start point point := source; FOR rec IN EXECUTE sql LOOP-- Flip geometry (if required)IF ( point != rec.source ) THENrec.geom := rec.flip_geom;point := rec.source;ELSEpoint := rec.target;END IF;-- Calculate heading (simplified)EXECUTE 'SELECT degrees( ST_Azimuth( ST_StartPoint(''' || rec.geom::text || '''),ST_EndPoint(''' || rec.geom::text || ''') ) )' INTO heading;-- Return record seq := seq + 1; gid := rec.gid; name := rec.name; cost := rec.cost; geom := rec.geom; RETURN NEXT; END LOOP; RETURN;END;$BODY$LANGUAGE 'plpgsql' VOLATILE STRICT;
- 基于pgrouting的任意两点间的最短路径查询函数
- 基于pgrouting的任意两点间的最短路径查询函数二
- 基于pgrouting求任意两点的最短路径的函数pgr_fromAtoB
- 使用pgrouting求任意两点的最短路径
- pgrouting路径分析(任意两点之间的最短路径)
- 任意两点间的最短路径
- 求任意两点间的最短路径
- 任意两点间的最短路径---floyd_warshall算法
- floyd算法(求任意两点间的最短路径)
- Floyd算法(任意两点间的最短路径)
- POJ 2139-- 最短路径 (floyd算法,任意两点间的最短路径)
- pgrouting最短路径
- 运用Floyd算法求得带权有向图任意两点间的最短路径C/C++
- Dijkstra单源最短路径实现 及 Floyd任意两点之间的最短路径
- 任意两点之间最短路径
- 【OI杂记】求二叉树上任意两点的最短路径上的边权最大值
- 两点之间的所有最短路径
- 软件测试作业 图中任意两点的最短路径
- 客运综合管理系统项目(1) 搭建WCF框架
- 明源售楼系统技术解析 架构搭建(一)
- 南宁便秘
- jQuery $.each用法
- Hive编程入门总结-用Java代码通过JDBC连接Hiveserver
- 基于pgrouting的任意两点间的最短路径查询函数
- Myeclipse Server中deby插件去掉
- 蓝桥杯练习系统算法提高—最大乘积
- 线程基础—线程的创建
- 利用Bluemix and Bluemix DevOps 服务开发 Node.js应用
- Location:LocationManager的位置获取
- 移动端切图备忘
- 10分钟从源码编译到部署ceph环境
- 前端:两种实现带背景遮罩的弹窗写法