POSTGIS路径规划的简单配置(数据库配置)
欢迎关注我的博客For CR
docker安装pgrouting是最方便的方法没有之一
所以我们使用docker安装pgrouting
0:需有docker环境 没有的请自行百度
0.1:必须使用拥有amd64架构的宿主机(树莓派就只能gg)
1.安装docker镜像
1.1首先 打开浏览器搜索docker hub
在此处输入pgrouting后搜索
在已经安装了docker的任何环境中键入右侧代码
docker pull pgrouting/pgrouting
可以看到
我搜索的当前版本是基于 Postgres 13/PostGIS 3.1 的
所以必须保证负责部署传输的主机拥有 PostGIS 3.1
如果实在是有原来的版本 可以尝试一下方法:
- 删除原有postgis
- 点击docker hub中的tag并在其中找到相关版本
2.启动镜像
根据docker中postgresql的相关操作文档
Docker Hub
我的启动命令为
docker run --name=pgrouting -p 5432:5432 --restart=always -e POSTGRES_PASSWORD=yourpass -d pgrouting/pgrouting
由上得出我的启动密码为'yourpass'
使用任意数据库管理工具即可登录数据库
3.初始化数据
3.0 本章需要预先准备路网数据 如没有 请自行查找方法下载 此处不进行展示
3.1 将已经下载的路网数据导入arcgis中 进行要素转线
此处必须进行 否则会出现多线的道路 导致无法导入
3.2 将导出的数据放入数据库
3.2.1 登录数据库
当出现如图二中的
Connection succeeded.
则证明连接成功
将要使用的数据拖入
需注意下图中的几个选项
4.处理数据
4.1.数据库新加字段并赋值
执行如下sql
-- 添加起点
ALTER TABLE public.road ADD COLUMN source integer;--添加终点idALTER TABLE public.road ADD COLUMN target integer;--添加道路权重值ALTER TABLE public.road ADD COLUMN length double precision;SELECT pgr_createTopology('public.road',0.0001, 'geom', 'gid');-- 创建起点和终点编号的索引
CREATE INDEX source_idx ON road ("source");
CREATE INDEX target_idx ON road ("target");
-- 计算道路长度
UPDATE road SET length =st_length(geom);
-- 新建道路权重(用于后期经常修改)
ALTER TABLE road ADD COLUMN reverse_cost double precision;
-- 赋值道路权重
UPDATE road SET reverse_cost =length;ALTER TABLE road ADD COLUMN x1 double precision; --创建起点经度x1
ALTER TABLE road ADD COLUMN y1 double precision; --创建起点纬度y1
ALTER TABLE road ADD COLUMN x2 double precision; --创建起点经度x2
ALTER TABLE road ADD COLUMN y2 double precision; --创建起点经度y2UPDATE road SET x1 =ST_x(ST_PointN(geom, 1));
UPDATE road SET y1 =ST_y(ST_PointN(geom, 1));
UPDATE road SET x2 =ST_x(ST_PointN(geom, ST_NumPoints(geom)));
UPDATE road SET y2 =ST_y(ST_PointN(geom, ST_NumPoints(geom))); --给x1、y1、x2、y2赋值
4.2.添加存储过程
CREATE OR REPLACE FUNCTION public.pgr_fromctod(tbl character varying, startx double precision, starty double precision, endx double precision, endy double precision)RETURNS geometryLANGUAGE plpgsqlSTRICT
AS $function$ declare v_startLine geometry;--离起点最近的线 v_endLine geometry;--离终点最近的线 v_startTarget integer;--距离起点最近线的终点v_startSource integer;v_endSource integer;--距离终点最近线的起点v_endTarget integer;v_statpoint geometry;--在v_startLine上距离起点最近的点 v_endpoint geometry;--在v_endLine上距离终点最近的点 v_res geometry;--最短路径分析结果v_res_a geometry;v_res_b geometry;v_res_c geometry;v_res_d geometry; v_perStart float;--v_statpoint在v_res上的百分比 v_perEnd float;--v_endpoint在v_res上的百分比 v_shPath_se geometry;--开始到结束v_shPath_es geometry;--结束到开始v_shPath geometry;--最终结果tempnode float; begin--查询离起点最近的线 --4326坐标系--找起点15米范围内的最近线execute 'select geom, source, target from ' ||tbl||' where ST_DWithin(geom,ST_Geometryfromtext(''point('||startx ||' ' || starty||')'',4326),15)order by ST_Distance(geom,ST_GeometryFromText(''point('|| startx ||' '|| starty ||')'',4326)) limit 1'into v_startLine, v_startSource ,v_startTarget; --查询离终点最近的线 --找终点15米范围内的最近线execute 'select geom, source, target from ' ||tbl||' where ST_DWithin(geom,ST_Geometryfromtext(''point('|| endx || ' ' || endy ||')'',4326),15)order by ST_Distance(geom,ST_GeometryFromText(''point('|| endx ||' ' || endy ||')'',4326)) limit 1'into v_endLine, v_endSource,v_endTarget; --如果没找到最近的线,就返回null if (v_startLine is null) or (v_endLine is null) then return null; end if ; select ST_ClosestPoint(v_startLine, ST_Geometryfromtext('point('|| startx ||' ' || starty ||')',4326)) into v_statpoint; select ST_ClosestPoint(v_endLine, ST_GeometryFromText('point('|| endx ||' ' || endy ||')',4326)) into v_endpoint; -- ST_Distance --从开始的起点到结束的起点最短路径execute 'SELECT st_linemerge(st_union(b.geom)) ' ||'FROM pgr_kdijkstraPath( ''SELECT gid as id, source, target, cost FROM ' || tbl ||''',' ||v_startSource|| ', ' ||'array['||v_endSource||'] , false, false ) a, ' ||tbl|| ' b WHERE a.id3=b.gid GROUP by id1 ORDER by id1' into v_res ;--从开始的终点到结束的起点最短路径execute 'SELECT st_linemerge(st_union(b.geom)) ' ||'FROM pgr_kdijkstraPath( ''SELECT gid as id, source, target, cost FROM ' || tbl ||''',' ||v_startTarget|| ', ' ||'array['||v_endSource||'] , false, false ) a, ' ||tbl|| ' b WHERE a.id3=b.gid GROUP by id1 ORDER by id1' into v_res_b ;--从开始的起点到结束的终点最短路径execute 'SELECT st_linemerge(st_union(b.geom)) ' ||'FROM pgr_kdijkstraPath( ''SELECT gid as id, source, target, cost FROM ' || tbl ||''',' ||v_startSource || ', ' ||'array['||v_endTarget||'] , false, false ) a, ' || tbl || ' b WHERE a.id3=b.gid GROUP by id1 ORDER by id1' into v_res_c ;--从开始的终点到结束的终点最短路径execute 'SELECT st_linemerge(st_union(b.geom)) ' ||'FROM pgr_kdijkstraPath( ''SELECT gid as id, source, target, cost FROM ' || tbl ||''',' ||v_startTarget || ', ' ||'array['||v_endTarget||'] , false, false ) a, ' || tbl || ' b WHERE a.id3=b.gid GROUP by id1 ORDER by id1' into v_res_d ;if(ST_Length(v_res) > ST_Length(v_res_b)) thenv_res = v_res_b;end if;if(ST_Length(v_res) > ST_Length(v_res_c)) thenv_res = v_res_c;end if;if(ST_Length(v_res) > ST_Length(v_res_d)) thenv_res = v_res_d;end if;--如果找不到最短路径,就返回null --if(v_res is null) then -- return null; --end if; --将v_res,v_startLine,v_endLine进行拼接 select st_linemerge(ST_Union(array[v_res,v_startLine,v_endLine])) into v_res;select ST_Line_Locate_Point(v_res, v_statpoint) into v_perStart; select ST_Line_Locate_Point(v_res, v_endpoint) into v_perEnd; if(v_perStart > v_perEnd) then tempnode = v_perStart;v_perStart = v_perEnd;v_perEnd = tempnode;end if;--截取v_res --拼接线SELECT ST_Line_SubString(v_res,v_perStart, v_perEnd) into v_shPath;return v_shPath; end; $function$
;
接下来便可以通过使用如下sql进行查询
select * from pgr_fromctod('road', startx, starty, endx, endy)
POSTGIS路径规划的简单配置(数据库配置)相关推荐
- Docker腾讯云加速源配置+数据库配置
一.腾讯云加速源配置 1.下载docker # 安装yum-utils和存储驱动 yum install -y yum-utils decive-mapper-persistent-data lvm2 ...
- ROS导航系列(四):全局路径规划器的参数配置分析
全局路径规划器global_planner的参数配置与分析 一.global_planner相关参数 二.测试 nav_core中提供了对应的全局路径规划接口.要想使用机器人move_base提供的便 ...
- SpringBoot项目不需要数据库配置
1. 错误 springboot项目启动时,如果没有配置数据库配置,启动时会抛出如下异常. Description: Cannot determine embedded database driver ...
- maximo数据库配置
1.1.1.进入数据库配置 打开Maximo主页面,启动中心→转到→系统配置→平台配置→数据库配置,按上述操作,我们进可以进入数据库配置页面.以下就是我们的数据库配置列表: 1.1.2.新建对象 在M ...
- php django mysql配置文件_Mysql学习Django+mysql配置与简单操作数据库实例代码
<Mysql学习Django+mysql配置与简单操作数据库实例代码>要点: 本文介绍了Mysql学习Django+mysql配置与简单操作数据库实例代码,希望对您有用.如果有疑问,可以联 ...
- ROS---进行建图或者move_base路径规划时出现打滑现象(雷达匹配不上地图)的解决方法 附gmapping建图配置参数
ROS-进行建图或者move_base路径规划时出现打滑现象(雷达匹配不上地图)的解决方法-本人多次实验的出的结论 之前我的车会经常出现打滑现象,图也建不了,就算勉强建好了图,在进行路径规划的时候也是 ...
- 简单安装与配置mysql数据库(绿色版)
简单安装与配置mysql数据库(绿色版) 目录 绿色版下载 mysql绿色版(5.7版本的安装与配置) 绿色版下载: mysql官网下载地址:https://www.oracle.com/index. ...
- Django models数据库配置以及多数据库调用设置
今天来说说web框架Django怎么配置使用数据库,也就是传说中MVC(Model View Controller)中的M,Model(模型). 简单介绍一下Django中的MVC: 模型(model ...
- EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
为什么80%的码农都做不了架构师?>>> EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 I.EF里的默认映射 上篇文章演示 ...
最新文章
- Java for LeetCode 067 Add Binary
- 使用 TListView 控件(3)
- 安装java的rpm_Centos7使用rpm命令安装java
- 用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中
- es6 - foreach
- Kerberos协议
- 《罗辑思维》读书笔记及思维导图
- 201771010120 苏浪浪 《面向对象程序设计(java)》第二周学习总结
- 使用IDEA 创建SpringBoot项目
- 收藏 | Pytorch-lightning的使用
- 部分xcode插件可能有新版本
- Apache与Tomcat的区别
- android查看网页源码,流数据
- Word 相关的快捷键
- Lua的多任务机制——协程(coroutine)
- 计算机蠕虫病毒,电脑中蠕虫病毒怎么办
- 网络打印机拒绝访问,无法连接处理方法汇总
- 拆书帮便签读书法,重新定义高效阅读
- 计算机毕业设计(附源码)python智慧医疗系统
- [USACO 1.2.1] Milking Cows