基于pgrouting的路径规划之一

简介:

最近接触pgrouting。把学习的结果记录下来。

利用pgrouting进行路径规划只能导入line数据,mutiline会出错。这一点在进行数据导入的时候需要注意。

一、创建数据库

有两种方法:

1.pgadmin可视化工具创建

直接把数据道路postgis模版数据库或以postgis模版数据库为模版创建数据库,这样创建的数据库直接支持空间查询和空间分析。

2.命令行创建数据库

创建数据库

createdb -U postgres routing

让数据库支持PostGIS和pgRouting的函数和基础表

CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION address_standardizer;


二、把shp数据导入空间数据库

两种方式:

1.是用可视化工具

(a)打开postgis工具

postgis安装目录下的PostGISShapefile Import/Export Manager


会弹出对话框


(b)设置数据库连接

单击view connection details,设置数据库的连接



(c)添加shp数据

添加需要导入的shp文件

单击Add File ,会弹出文件选中对话框


选择需要导入是shp文件,注意此处路径一定要是英文,否则会导入失败

(d)编码设置

单击options,设备编码格式为GBK,选中generate simple geometries instead of multi geometries。

此处导入的shp数据一定要是单线的,否则无法完成路径计算。

(e)查看导入数据

成功导入数据之后就能在postgresql中看到导入的数据表

2.命令行导入数据

先用shp2psql.exe程序把shp文件装换成sql脚本,

格式为:shp2pgsql    路径\shp数据文件名 新建的数据表名 > 路径\SQL文件名.sql

shp2pgsql -s 4326 beijingmodified public.beijingmodified > beijingmodified.sql

 

执行得到的sql文件

psql -U postgres -d routing -f beijingmodified.sql

 

三、创建路网拓扑结构

//添加起点id

ALTER TABLE public.beijing ADD COLUMN source integer;

//添加终点id

ALTER TABLE public.beijing ADD COLUMN target integer;

//添加道路权重值

ALTER TABLE public.beijing ADD COLUMN length double precision;

 

//为sampledata表创建拓扑布局,即为source和target字段赋值

SELECT pgr_createTopology('public.beijing',0.00001, 'geom', 'gid');

 

//为source和target字段创建索引

CREATE INDEX source_idx ON beijingmodified("source");

CREATE INDEX target_idx ON beijingmodified("target");

 

//为length赋值

update beijingmodified set length =st_length(geom);

//或者用已有的字段长度赋值,下面shape_length为shp中已有的长度属性

UPDATE beijingmodified SET length = shape_length;

 

//为beijingmodified表添加reverse_cost字段并用length的值赋值

ALTER TABLE beijingmodified ADD COLUMN reverse_cost double precision;

UPDATE beijingmodified SET reverse_cost =length;

 

四、尝试查询

使用pgr_dijkstra算法查询

SELECT seq, id1 AS node, id2 AS edge, costFROM pgr_dijkstra('

SELECT gid AS id,                   

source::integer,                       

target::integer,                      

length::double precision AS cost

FROM beijingmodified',

30, 60, false, false);

 

//查询每个路段经过的点

SELECT st_astext(geom) FROM pgr_dijkstra('

SELECT gid AS id,                   

source::integer,                       

target::integer,                      

length::double precision AS cost

FROM beijingmodified',

30, 60, false, false) as di

join beijingmodified pt

on di.id2 = pt.gid;


//把查询结果放在新建的表格中

SELECT seq, id1 AS node, id2 AS edge, cost,geom into dijkstra_res FROM pgr_dijkstra('

SELECT gid AS id,                    

source::integer,                       

target::integer,                      

length::double precision AS cost

FROM beijingmodified',

30, 60, false, false) as di

join beijingmodified pt

on di.id2 = pt.gid;

/*

pgr_dijkstra的定义是pgr_costResult[]
pgr_dijkstra(textsql, integer source, integer target, boolean directed, boolean has_rcost);

directed是否限制方向,has_ rcost作用未知,返回值为pgr_costResult。

pgr_costResult在workshop中的解释是

A set of records to describe a path resultwith cost attribute

一组带有消耗属性的用于描述路径结果的记录的集合。

其定义如下

CREATE TYPE pgr_costResult AS

(

    seq integer, -- rowsequence

    id1 integer, -- node ID

    id2 integer, -- edge ID(-1 for the last row)

    cost float8 -- cost totraverse from id1 using id2

);

*/

将这个表导出为shp,再在arcmap中定义坐标系打开,可以看到上面的结果如下图所示


相关文章
|
SQL 数据库 Docker
OBCP实践 - OceanBase Docker 体验
开发者和技术爱好者可以在无需复杂安装配置的情况下迅速搭建OceanBase数据库环境,从而方便地进行功能测试、性能评估或者开发调试等实践活动。同时,由于Docker的便捷性,此方法也支持跨平台部署,使得OceanBase数据库能够在不同的操作系统(如Linux、Windows、macOS)上轻松体验。
583 2
|
Web App开发 域名解析 缓存
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
本文我们主要为大家介绍在 Ubuntu 20.04 上安装 Node.js 和 npm 的三种不同的方式。
161436 7
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
|
JavaScript
HTTP/2 协议-服务端主动推送消息
HTTP/2 协议-服务端主动推送消息
627 0
|
7月前
|
机器学习/深度学习 资源调度 数据可视化
YOLOv11改进策略【注意力机制篇】| 引入Shuffle Attention注意力模块,增强特征图的语义表示
YOLOv11改进策略【注意力机制篇】| 引入Shuffle Attention注意力模块,增强特征图的语义表示
316 1
YOLOv11改进策略【注意力机制篇】| 引入Shuffle Attention注意力模块,增强特征图的语义表示
|
7月前
|
算法 定位技术 vr&ar
基于WebGIS技术的校园地图导航系统解决方案
本文提出了一套基于WebGIS技术的校园地图导航系统构建与优化方案,通过校园三维地图、路线导航、特色路线、位置分享等核心功能机框架设计,旨在为用户提供高效、智能、个性化的导航体验。
381 0
基于WebGIS技术的校园地图导航系统解决方案
|
11月前
|
存储 前端开发 JavaScript
通过dem2terrain生成MapboxGL地形服务
通过dem2terrain生成MapboxGL地形服务
227 8
|
11月前
|
机器学习/深度学习 定位技术 Python
Matplotlib 教程 之 Matplotlib imshow() 方法 6
Matplotlib `imshow()` 方法教程:详解如何使用 `imshow()` 函数显示二维图像,包括灰度图、彩色图及不同插值方法的应用示例。通过调整参数如颜色映射(cmap)、插值方法(interpolation)等,实现图像的不同视觉效果。
188 2
|
Java 应用服务中间件 API
从0到1学会Jetty内存马注入
最近在学习geoserver的CVE-2024-36401注入内存马的时候,发现需要注入jetty类型的内存马,这是一个不同于tomcat的轻量级web容器。具体来说,Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。
|
关系型数据库 数据挖掘 数据库
在 PostgreSQL 中使用 IN
【8月更文挑战第12天】
812 0
在 PostgreSQL 中使用 IN
|
编解码 开发工具 数据安全/隐私保护
如何快速实现Windows平台屏幕摄像头采集并推送RTMP|轻量级RTSP服务能力?
一个好的推送模块,除了实现高效率的编码传输外,还要有好的音视频采集机制和灵活的架构支持,便于后期功能扩展,比如实时快照、预览、实时录像等。除此之外,还要有好的交互机制(比如envent callback)、低延迟和长期运行稳定的性能。
255 0

热门文章

最新文章