本文衔接上篇文章:

不睡觉的怪叔叔:pgRouting教程六:高级路径查询​zhuanlan.zhihu.com

pgRouting函数提供低级接口,在为更高级别的应用程序开发时,需要在SQL查询中调用pgRouting函数以满足应用需求。随着这些SQL查询的逻辑变得更加复杂,我们应该将它们存储在PostgreSQL存储过程或函数中,相当于对pgRouting函数再进行一次封装,这样我们在使用高级语言开发应用程序时只要调用我们定义的存储过程即可。

注意:在PostgreSQL中存储过程就是函数。

一、应用程序的需求

将要开发的存储过程具有以下需求:

1、规划车辆路径

  • 不使用人行道(pedestrian)。
  • 一旦数据库视图被创建,它可以被复用。
  • 道路的成本是时间,单位是分钟。

2、规划的结果路径具有道路名信息。

3、规划的结果路径中的几何线段具有正确的方向

  • 在结果中返回路径的几何信息。
  • 返回结果路径的各个路段的大地方位角(单位十进制度)。
  • 几何信息处理需要得到正确的方向。

1.1、练习1 —— 允许被车辆行驶的路径

车辆不允许在行人道路上行驶,因此:

  • 创建包含车辆可以行驶的道路的数据库视图。
  • 道路成本设置为时间(单位分钟)。
  • 验证以上过程减少了多少路段。
CREATE VIEW vehicle_net ASSELECT gid, source, target,cost / 1.3 / 60 AS cost,reverse_cost / 1.3 / 60 AS reverse_cost, -- 假设行人每秒走1.3mgeomFROM shenzhen_roads WHERE fclass NOT IN ('steps', 'cycleway', 'footway', 'track_grade2', 'track');-- 验证
SELECT count(*) FROM shenzhen_roads;
SELECT count(*) FROM vehicle_net;

后面两条SQL语句分别查询出原先的道路具有111185条,新创建的vehicle_net视图中具有道路92971条(没有包含行人道路和铁轨)。

1.2、练习2 —— 将路网限制在一个范围内

将车辆限制在只能在前海湾附近区域(如上图红框)中行驶,该区域的范围是:(12673569, 2573130, 12680410, 2578570)坐标系ESPG:3857。

  • 车辆只能在区域(12673569, 2573130, 12680410, 2578570)中行驶。
  • 创建一个保存该区域路段的数据库视图。
  • 验证缺少的路段数。
CREATE VIEW little_net ASSELECT *FROM vehicle_netWHERE vehicle_net.geom && ST_MakeEnvelope(12673569, 2573130, 12680410, 2578570, 3857);-- 验证
SELECT COUNT(*) FROM little_net; 

上面的SQL语句使用了一个PostGIS函数ST_MakeEnvelope创建一个矩形多边形用于筛选数据,它的官方API文档:

ST_MakeEnvelope​postgis.net

1.3、练习3 —— 结果包含道路名信息

规划车辆从南方医科大学深圳医院到前海金融中心,结果包含道路名信息

  • 车辆从南方医科大学深圳医院出发(id: 15938)。
  • 车辆到前海金融中心(id: 9064)。
  • 结果包含道路名信息
SELECT dijkstra.*, ways.name FROM pgr_dijkstra('SELECT gid AS id, * FROM little_net',15938, 9064
) AS dijkstra LEFT JOIN shenzhen_roads AS ways
ON (edge = gid)
ORDER BY seq;

注:因为数据的原因,有的道路没有道路名信息。另外这里的SQL语句性能肯定不佳,这里只是为了体现很多业务场景下SQL语句的逻辑是很复杂的,从而说明存储过程的重要性。

二、玩转几何信息

2.1、练习4 —— 路径的几何信息(WKT格式)

规划车辆从南方医科大学深圳医院到前海金融中心,结果包含如下信息:

  • 路径的道路名
  • 道路的几何信息(WKT格式)
SELECT dijkstra.*, ways.name, ST_AsText(ways.geom) FROM pgr_dijkstra('SELECT gid AS id, * FROM little_net',15938, 9064
) AS dijkstra LEFT JOIN shenzhen_roads AS ways
ON (edge = gid)
ORDER BY seq;

2.2、练习5 —— 路径的几何信息(二进制格式)

规划车辆从南方医科大学深圳医院到前海金融中心,结果包含如下信息:

  • 路径的道路名
  • 道路的几何信息(二进制格式)

注意:以下语句使用了WITH操作符,它可以为查询定义一张临时表。

WITH
dijkstra AS(SELECT * FROM pgr_dijkstra('SELECT gid AS id, * FROM little_net',15938, 9064)
)
SELECT dijkstra.*, ways.name, ways.geom AS route_geom
FROM dijkstra LEFT JOIN shenzhen_roads AS ways
ON (edge = gid)
ORDER BY seq;

2.3、练习6 —— 使用几何信息求方位角

规划车辆从南方医科大学深圳医院到前海金融中心,结果包含如下信息:

  • 路径的道路名
  • 路径的几何信息(二进制格式)
  • 路径各个路段的大地方位角(单位十进制度)
WITH
dijkstra AS(SELECT * FROM pgr_dijkstra('SELECT gid AS id, * FROM little_net',15938, 9064)
),
get_geom AS (SELECT dijkstra.*, ways.name, ways.geom AS route_geomFROM dijkstra LEFT JOIN shenzhen_roads AS ways ON (edge = gid)ORDER BY seq)
SELECT seq, name, cost,-- calculating the azimuthdegrees(ST_azimuth(ST_StartPoint(route_geom), ST_EndPoint(route_geom))) AS azimuth,ST_AsText(route_geom),route_geom
FROM get_geom
ORDER BY seq;

这里使用了一个PostGIS函数ST_Azimuth,简单来说它基于路段起点的正北方向求路段的方位角,结果是弧度制,需要使用PostgreSQL自带的degrees函数将其转换为十进制度。ST_Azimuth函数的官方API文档:

ST_Azimuth​postgis.net

2.4、练习7 —— 几何信息的方向性

当数据库生成一个结果路径时,结果路径的双向路段(oneway字段是'B')可以是正向的,也可以是反向的。那么可以得出如下结论:

  • 结果路径中的双向路段是正向的 —— 路段几何信息的起始点就是source字段指的那个顶点。
  • 结果路径中的双向路段是反向的 —— 路段几何信息的起始点就是target字段指的那个顶点。此时为了满足需求,求方位角需要将路段几何信息逆序排列。

总之我们需要保证计算出来的各路段的方位角能让各个路段沿着整条路径。

规划车辆从南方医科大学深圳医院到前海金融中心,结果包含如下信息:

  • 路段几何信息的终止点坐标必须与下一条路段的起始点坐标一致。
  • 路径的几何信息(二进制格式)
  • 路径各个路段的大地方位角(单位十进制度)
WITH
dijkstra AS(SELECT * FROM pgr_dijkstra('SELECT gid AS id, * FROM little_net',15938, 9064)
),
get_geom AS (SELECT dijkstra.*, ways.name, -- 将反向路段的几何信息逆序排列CASEWHEN dijkstra.node = ways.source THEN ways.geomELSE ST_Reverse(ways.geom)END AS route_geomFROM dijkstra LEFT JOIN shenzhen_roads AS ways ON (edge = gid)ORDER BY seq)
SELECT seq, name, cost,-- 计算方位角degrees(ST_azimuth(ST_StartPoint(route_geom), ST_EndPoint(route_geom))) AS azimuth,ST_AsText(route_geom),route_geom
FROM get_geom
ORDER BY seq;

以上SQL语句使用了PostGIS函数ST_Reverse,它的功能是将几何信息的坐标点信息逆序排列,它的官方API文档:

ST_Reverse​postgis.net

三、创建函数(存储过程)

我们创建自定义函数要注意以下命名规则:

  • 避免使用PostGIS和pgRouting已经使用的函数名。
  • 避免使用"pgr_"和"ST_"作为函数名的开头。

3.1、练习8 —— 创建一个函数

我们创建的函数具有如下特点:

  • 可以在车辆道路的全部区域进行搜索。
  • 将数据库视图作为参数。
  • 结果包含道路名、路径的几何信息(二进制格式)、路径各个路段的大地方位角(单位十进制度)等等。
CREATE OR REPLACE FUNCTION wrk_dijkstra(IN edges_subset regclass, -- 视图作为参数IN source BIGINT,IN target BIGINT,OUT seq INTEGER,OUT gid BIGINT,OUT name TEXT,OUT cost FLOAT,OUT azimuth FLOAT,OUT route_readable TEXT,OUT route_geom geometry
) RETURNS SETOF record AS
$BODY$WITHdijkstra AS (SELECT * FROM pgr_dijkstra(-- 使用参数化的视图'SELECT gid AS id, * FROM ' || $1,$2, $3)),get_geom AS (SELECT dijkstra.*, ways.name,CASEWHEN dijkstra.node = ways.source THEN geomELSE ST_Reverse(geom)END AS route_geomFROM dijkstra JOIN shenzhen_roads AS ways ON (edge = gid)ORDER BY seq)SELECTseq,edge,name,cost,degrees(ST_azimuth(ST_StartPoint(route_geom), ST_EndPoint(route_geom))) AS azimuth,ST_AsText(route_geom),route_geomFROM get_geomORDER BY seq;
$BODY$
LANGUAGE 'sql';

3.2、练习9 —— 使用函数

现在要规划车辆从南方医科大学深圳医院到前海金融中心,可以直接使用wrk_dijkstra函数。

  • 车辆从南方医科大学深圳医院出发(id: 15938)。
  • 车辆到前海金融中心(id: 9064)
SELECT * FROM wrk_dijkstra('vehicle_net', 15938, 9064);

3.3、练习10 —— 保存函数

可以将函数保存起来到一个SQL文件:E:/wrk_dijkstra.sql。

这个SQL文件可以用于在其他数据库安装wrk_dijkstra函数,比如在pgsql命令行中执行以下命令:

psql -U postgres -d city_routing -f E:/wrk_dijkstra.sql

或者在GUI工具中点击如下按钮打开wrk_dijkstra.sql文件并执行。

或者直接复制、粘贴。。。本文完。

sql server 存储过程_pgRouting教程七:使用SQL存储过程相关推荐

  1. SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者

    文章目录 目录 前言 一.启动SQL server服务的三种方法 1.不启动SQL server服务的影响 2.方法一:利用cmd启动SQL server服务 3.方法二:利用SQL Server配置 ...

  2. SQL Server 2014 安装教程(图文教程,附下载地址)

    SQL Server 2014 安装教程 解压 SQL Server 光盘镜像,在解压好的文件夹中,找到 setup.exe 文件,双击打开,选择安装. 选择 全新 SQL Server 独立安装或向 ...

  3. 最佳SQL Server 2008入门教程

    媒体评论 "本书是SQL Server数据库初学者的明智选择.它不仅很好地介绍了SQL Server的主要特性,还深入浅出地阐述了数据库开发和设计的一般性概念." --Amazon ...

  4. SQL Server 下载安装教程

    --------------------------2021.3.9更新---------------------------------------- 有几位读者私聊我遇到了如下问题 针对如上问题& ...

  5. 阿里7年技术员:SQL Server 下载安装教程

    有几位读者私聊我遇到了如下问题 针对如上问题"糟糕无法安装SQLServer(setup.exe)" 可以安装如下步骤进行解决: 1.尝试修复 出现这种状况主要原因还是安装过程中没 ...

  6. SQL Server里一些未公开的扩展存储过程

    SQL Server里一些未公开的扩展存储过程 [转帖] 博客天地 www.inbaidu.com SQL Server里一些未公开的扩展存储过程 扩展存储过程(xp)是直接运行在SQL Server ...

  7. SQL Server 2019安装教程(图文)

    本章教程,介绍一下SQL Server 2019的安装过程. SQL Server 是Microsoft 公司推出的关系型数据库管理系统.具有使用方便可伸缩性好与相关软件集成程度高等优点.Micros ...

  8. SQL Server 2005数据库教程

    SQL Server 2005数据库教程 此主题相关图片如下:000.jpg  下载信息  [文件大小:1.4 MB  下载次数:67] 点击浏览该文件:sql server 2005数据库简明教程 ...

  9. SQL Server 2014安装教程(保姆级图解教程)

    SQL Server 2014安装教程(保姆级图解教程) 1.找到准备好的SQL Server 2014安装包 2.解压缩后找到安装程序,双击打开 3.点击全新SQL Server,单击后会出现安装窗 ...

  10. sql server 2019 安装教程以及入门使用

    sql server 2019 安装教程以及入门使用 前言 一.安装sql sever 2019 二.安装SQL Server Management Studio (SSMS) 1.下载链接: 导入数 ...

最新文章

  1. 激光雷达与摄影测量相结合如何提高点云质量?
  2. 快速安装puppeteer (跳过安装Chromium)
  3. 机器学习笔记:PCA的简单理解以及应用建议
  4. Java代理设计模式(Proxy)的具体实现:静态代理和动态代理
  5. 从对集合数据去重到Distinct源码分析
  6. 只需6步,教你从零开发一个签到小程序
  7. 鸿蒙内核之内存调测:动态内存池信息统计
  8. 【kafka】Timeout of 60000ms expired before the position for partition could be determined
  9. Redis基本数据类型、应用场景、操作指令
  10. Docker教程:dokcer machine的概念和安装
  11. SmtpClient SSL 发送邮件异常排查
  12. MySQL简明教程-下
  13. ITIL 4讲解:ITIL4的设计框架解析
  14. Live Streaming
  15. 基于SSH商场管理系统
  16. Cydia添加源http://apt.Feng.com,完成packages卡住 解决方法
  17. 苹果计算机访问限制,苹果手机访问限制密码忘了怎么办
  18. CrackMe160 学习笔记 之 044
  19. 关于ant design pro中2个下拉列表,下列列表a的数据需要依据列表b选择的值来进行变化,无法及时获取
  20. 手机自动识别软件项目举例

热门文章

  1. VRTK summary
  2. Atitit ceo之道 艾龙 著 atitit 各分部ceo cao行政经理职责.docx 1.1. “重大执行权”和“日常执行权”两块分离 ,重大事件如大政方针、重大人事任命和重大投资方面
  3. Atitit Atitit 零食erp数据管理---世界著名零食系列数据.docx世界著名零食
  4. Atitit onvif 协议截图 getSnapshotUri 使用java
  5. 代码积累与编程能力哪个更重要
  6. BOMRemover v2.0 去除代码中的UTF-8 BOM
  7. 移动云招聘,加入我们,搞点大事~
  8. 索纳塔9 2.4L旗舰版 一手原车 诚意出售
  9. c语言中变量后减号大于号,大于等于运算符.ppt
  10. 【图像隐写】基于matlab GUI DCT数字水印嵌入+提取【含Matlab源码 1671期】