pgRouting求两点间最短路径
pgRouting 求两点间最短路径 pgRouting 是一个基于 PostgreSQL 的路由引擎,能够对空间数据进行分析和处理。在本文中,我们将详细介绍如何使用 pgRouting 求两点间最短路径。 一、pgRouting 环境搭建 为了使用 pgRouting,我们需要首先安装 pgRouting 并将其与 PostgreSQL 集成。具体步骤如下: 1. 下载 pgRouting 并解压缩,将解压文件中的三个文件夹中的内容放到 PostgreSQL 的安装目录下对应的文件夹中。 2. 打开 pgAdmin 插件,进入控制台,执行以下命令以安装 pgRouting: ``` CREATE EXTENSION pgrouting; ``` 然后,执行以下命令以验证安装是否成功: ``` SELECT pgr_version(); ``` 如果输出版本号,则表示安装成功。 二、创建空间数据库并导入 shp 数据 在使用 pgRouting 之前,我们需要创建一个空间数据库并导入路网 shp 数据。具体步骤如下: 1. 创建数据库后,安装以下扩展以支持最短路径查询: ``` CREATE EXTENSION postgis; CREATE EXTENSION pgrouting; CREATE EXTENSION postgis_topology; ``` 2. 导入路网 shp 数据。 三、创建路网拓扑结构 在数据表中添加起点 id 和终点 id: ``` ALTER TABLE table ADD COLUMN source integer; ALTER TABLE table ADD COLUMN target integer; ``` 添加道路权重值: ``` ALTER TABLE table ADD COLUMN length double precision; ``` 计算道路权重值: ``` UPDATE table SET length = st_length(geom); ``` 为表创建拓扑布局,即为 source 和 target 字段赋值: ``` SELECT pgr_createTopology('table', 0.0001, 'geom', 'gid'); ``` 四、自定义最短路径查询函数 创建一个函数以计算两点间的最短路径: ``` CREATE OR REPLACE FUNCTION pgr_fromatob2( IN tbl character varying, IN startx double precision, IN starty double precision, IN endx double precision, IN endy double precision, OUT seq integer, OUT gid integer, OUT geom geometry) RETURNS SETOF record AS $$ DECLARE v_startLine geometry; -- 离起点最近的线 v_endLine geometry; -- 离终点最近的线 v_startId integer; -- 起点线节点 ID v_startName text; -- 起点线节点名 v_startSource integer; -- 距离起点最近线的起点 v_startTarget integer; -- 距离起点最近线的终点 v_endId integer; -- 终点节点 ID v_endName text; -- 终点节点名 v_endSource integer; -- 距离终点最近线的起点 v_endTarget integer; -- 距离终点最近线的终点 v_startPoint geometry; -- 在 v_startLine 上距离起点最近的点 v_endPoint geometry; -- 在 v_endLine 上距离终点最近的点 rec record; -- 最短路径分析结果 v_perStart double precision; -- v_statpoint 在 v_res 上的百分比 v_perEnd double precision; -- v_endpoint 在 v_res 上的百分比 sqltext text; pointTemp integer; v_shPath geometry; -- 最终结果 BEGIN -- 查询离起点最近的线 EXECUTE 'SELECT id,geom,source,target FROM ' || tbl || ' WHERE ST_DWithin(geom,ST_Geometryfromtext(''point(' || startx || '' '' || starty || ')''),0.015)' ' ORDER BY ST_Distance(geom,ST_GeomFromText(''POINT(' || startx || '' '' || starty || ')'')) LIMIT 1' INTO rec; v_startId := rec.id; v_startLine := rec.geom; RAISE INFO 'geom:%', st_astext(rec.geom); v_startSource := rec.source; v_startTarget := rec.target; -- 查询离终点最近的线 EXECUTE 'SELECT id,geom,source,target FROM ' || tbl || ' WHERE ST_DWithin(geom,ST_Geometryfromtext(''point(' || endx || '' '' || endy || ')''),0.015)' ' ORDER BY ST_Distance(geom,ST_GeomFromText(''POINT(' || endx || '' '' || endy || ')'')) LIMIT 1' INTO rec; v_endId := rec.id; v_endLine := rec.geom; RAISE INFO 'geom:%', st_astext(rec.geom); v_endSource := rec.source; v_endTarget := rec.target; -- 计算最短路径 ... END; ``` 通过上述步骤,我们可以使用 pgRouting 求两点间的最短路径。
- jav小ZQ2019-07-22你确定可用吗,你这个存储过程是有问题的好吗,你的table名称在存储过程中是写死的,作为参数没用吧
- 粉丝: 90
- 资源: 29
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- json的合法基色来自红包东i请各位
- 项目采用YOLO V4算法模型进行目标检测,使用Deep SORT目标跟踪算法 .zip
- 针对实时视频流和静态图像实现的对象检测和跟踪算法 .zip
- 部署 yolox 算法使用 deepstream.zip
- 基于webmagic、springboot和mybatis的MagicToe Java爬虫设计源码
- 通过实时流协议 (RTSP) 使用 Yolo、OpenCV 和 Python 进行深度学习的对象检测.zip
- 基于Python和HTML的tb商品列表查询分析设计源码
- 基于国民技术RT-THREAD的MULTInstrument多功能电子测量仪器设计源码
- 基于Java技术的网络报修平台后端设计源码
- 基于Python的美食杰中华菜系数据挖掘与分析设计源码