欢迎关注我的博客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

如果实在是有原来的版本 可以尝试一下方法:

  1. 删除原有postgis
  2. 点击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路径规划的简单配置(数据库配置)相关推荐

  1. Docker腾讯云加速源配置+数据库配置

    一.腾讯云加速源配置 1.下载docker # 安装yum-utils和存储驱动 yum install -y yum-utils decive-mapper-persistent-data lvm2 ...

  2. ROS导航系列(四):全局路径规划器的参数配置分析

    全局路径规划器global_planner的参数配置与分析 一.global_planner相关参数 二.测试 nav_core中提供了对应的全局路径规划接口.要想使用机器人move_base提供的便 ...

  3. SpringBoot项目不需要数据库配置

    1. 错误 springboot项目启动时,如果没有配置数据库配置,启动时会抛出如下异常. Description: Cannot determine embedded database driver ...

  4. maximo数据库配置

    1.1.1.进入数据库配置 打开Maximo主页面,启动中心→转到→系统配置→平台配置→数据库配置,按上述操作,我们进可以进入数据库配置页面.以下就是我们的数据库配置列表: 1.1.2.新建对象 在M ...

  5. php django mysql配置文件_Mysql学习Django+mysql配置与简单操作数据库实例代码

    <Mysql学习Django+mysql配置与简单操作数据库实例代码>要点: 本文介绍了Mysql学习Django+mysql配置与简单操作数据库实例代码,希望对您有用.如果有疑问,可以联 ...

  6. ROS---进行建图或者move_base路径规划时出现打滑现象(雷达匹配不上地图)的解决方法 附gmapping建图配置参数

    ROS-进行建图或者move_base路径规划时出现打滑现象(雷达匹配不上地图)的解决方法-本人多次实验的出的结论 之前我的车会经常出现打滑现象,图也建不了,就算勉强建好了图,在进行路径规划的时候也是 ...

  7. 简单安装与配置mysql数据库(绿色版)

    简单安装与配置mysql数据库(绿色版) 目录 绿色版下载 mysql绿色版(5.7版本的安装与配置) 绿色版下载: mysql官网下载地址:https://www.oracle.com/index. ...

  8. Django models数据库配置以及多数据库调用设置

    今天来说说web框架Django怎么配置使用数据库,也就是传说中MVC(Model View Controller)中的M,Model(模型). 简单介绍一下Django中的MVC: 模型(model ...

  9. EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

    为什么80%的码农都做不了架构师?>>>    EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 I.EF里的默认映射 上篇文章演示 ...

最新文章

  1. Java for LeetCode 067 Add Binary
  2. 使用 TListView 控件(3)
  3. 安装java的rpm_Centos7使用rpm命令安装java
  4. 用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中
  5. es6 - foreach
  6. Kerberos协议
  7. 《罗辑思维》读书笔记及思维导图
  8. 201771010120 苏浪浪 《面向对象程序设计(java)》第二周学习总结
  9. 使用IDEA 创建SpringBoot项目
  10. 收藏 | Pytorch-lightning的使用
  11. 部分xcode插件可能有新版本
  12. Apache与Tomcat的区别
  13. android查看网页源码,流数据
  14. Word 相关的快捷键
  15. Lua的多任务机制——协程(coroutine)
  16. 计算机蠕虫病毒,电脑中蠕虫病毒怎么办
  17. 网络打印机拒绝访问,无法连接处理方法汇总
  18. 拆书帮便签读书法,重新定义高效阅读
  19. 计算机毕业设计(附源码)python智慧医疗系统
  20. [USACO 1.2.1] Milking Cows

热门文章

  1. 【Python案例】基于Pygame黑白棋游戏(附源码)
  2. 通信工程用这些书应该够了
  3. 丰巢后撤,便宜了菜鸟驿站、京东快递柜?
  4. Ancient Message (古埃及象形文字识别 Uva 1103)
  5. CNN去马赛克代码阅读笔记
  6. Chrome浏览器开启黑暗模式
  7. java学习笔记day09 final、多态、抽象类、接口
  8. .Net加密与解密——非对称加密之加密模式
  9. Unity实用小工具或脚本——智能包住任意多个物体的碰撞体
  10. sql中完全依赖,部分依赖,传递依赖关系