基于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中定义坐标系打开,可以看到上面的结果如下图所示

时间: 2024-09-12 06:45:36

基于pgrouting的路径规划之一的相关文章

pgrouting进行路径规划之入门二

本文是在上一篇文章的基础上的.数据入库和字段设置请参考上篇文章.本文介绍利用pgrouting中其他方法来求取最短路径. 一.添加属性字段 为表格beijingmodified添加x1,y1,x2,y2字段 ALTER TABLE beijingmodified ADD COLUMN x1double precision; ALTER TABLE beijingmodified ADD COLUMN y1double precision; ALTER TABLE beijingmodified

聊一聊双十一背后的技术 - 物流, 动态路径规划

双十一背后的技术系列文章 <聊一聊双十一背后的技术 - 物流, 动态路径规划> <聊一聊双十一背后的技术 - 分词和搜索> <聊一聊双十一背后的技术 - 强奸式秒杀技术实现> <聊一聊双十一背后的技术 - 毫秒分词算啥, 试试正则和相似度> 云栖聚能聊 - 聊一聊双十一背后的数据库技术 标签 PostgreSQL , 物流 , 路径规划 , LBS , PostGIS , Greenplum , 最短路径 , 双十一 , 地理位置信息 , 快递 , 菜鸟物流

PgSQL · GIS应用 · 物流, 动态路径规划

背景 双十一背后的技术系列文章 <聊一聊双十一背后的技术 - 分词和搜索> 每年双十一的交易额都创新高,今年也不例外,双十一几乎成了各种IT系统的大考,物流也不例外. 每次双十一快递几乎都被爆仓,但是随着技术的发展,今年,听说双十一刚过,小伙伴们的包裹差不多都收到了,今年的快递效率怎么如此之高呢? 今天,来给大家分享一下物流与背后的数据库技术,当然我讲的还是PostgreSQL, Greenplum, PostGIS一类,大伙了解我的. 物流行业是被电子商务催生的产业之一. 快件的配送和揽件的

基于pgrouting的任意两点间的最短路径查询函数

    前面文章介绍了如何利用postgresql创建空间数据库,建立空间索引和进行路径规划.但是在真实的场景中用户进行路径规划的时候都是基于经纬度数据进行路径规划的,因为用户根本不会知道道路上节点的ID.因此文本讲述如何查询任意两点间的最短路径.     一.定义函数名及函数参数         函数名定义为: pgr_fromAtoB         参数设置分别为:                  输入为数据库表名,起点和终点的经纬度坐标                  输出为:路段序

PostgreSQL 路径规划插件 pgruoting 介绍

    我们都知道PostgreSQL利用PostGIS插件,善于处理LBS相关的业务.     PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象.空间索引.空间操作函数和空间操作符.同时,PostGIS遵循OpenGIS的规范.  PostGIS的优势 一: 支持所有的空间数据类型,这些类型包括:点(POINT).线(LINESTRING).多边形(POLYGON).多点(MULTIPOINT).多线(MULTILINESTR

基于pgrouting的任意两点间的最短路径查询函数二

    在前面的博文中写过一篇查询任意两点间最短路径的函数,当时对pgrouting不熟悉,功能很low.现在对该函数进行扩展,支持用户自己输入查询的数据库表,这一点看似简单,其实意义很大,在做室内导航的时候当用户所在的楼层变化的时候最短路径函数查询的数据表名称也会发生变化,不可能一栋大楼里的道路都是一样的吧,另外进行跨楼层的最短路径规划时,需要查询从A到楼梯口的最短路径和楼梯口到B的最短路径,这些都需要进行最短路径规划的时候能够自己选择数据表.     先解释一下最短路径规划的处理步骤,首先要

多点最优路径规划 - (商旅问题,拼车,餐饮配送,包裹配送,包裹取件,回程单)

标签 PostgreSQL , PostGIS , pgrouting , 商旅问题 , 拼车 , 餐饮配送 , 包裹配送 , 包裹取件 , 回程单 背景 小长假,带着一家人出去旅行,计划好了去几个地方,如何设计旅行线路是最优的?(里面还涉及到路费,路途时间等因素). 又比如 拼车,餐饮配送,包裹取件.配送,都包含最佳路径计算的共性在里面. PostgreSQL 在GIS领域有这非常丰富的用户和实际案例,路径规划方面,我之前写过一篇关于包裹配送的文章 <聊一聊双十一背后的技术 - 物流.动态路径

基于openlayers的最短路径规划

之前的文章讲到了如何构建空间数据库,矢量数据如何入库,如何构建拓扑网络,如何自定义查询函数,如何构建wms服务,本文讲解如何基于openlayers晚上最短路径规划功能. 一.基于openlayers3 1.构建网页,这里只是一个简单的网页 <!DOCTYPE html> <html lang='en'> <head> <meta charset='utf-8'/> <title>indoornavigation</title> &l

产品信息架构:互联网产品路径规划

文章描述:产品路径规划的几个阶段. 相比之前在博客上公布自己的创业项目时候的数据,又过了3个月,下厨房总体的数据翻了3倍多,注册用户2.6W,每天的独立用户也已经2W多.当然,我们的团队相比之前的3.5个人,翻了4倍. 创业前写过一个PPT,大致描述了一下下厨房的路径规划,到目前为止,基本按照设想的路径发展:1 第一阶段,主要是靠"感觉"驱动产品.(在知乎曾经回答过一个问题可以解释这种"感觉"的来源)如果感觉对的话,不久应该可以做到每天3W独立IP(之前估计的6-8