拓 扑 路 径 详 细 原 理 ( 2 0 2 0 )

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

postGIS+pgrouting+geoserver+openlayers实现最短路径分析

最短路径分析原理阐述:将路网数据存储在postgresql中,构建拓扑,使用pgrouting写出一个查询最短路径的功能函数,在GeoServer中配置sqlview图层,调用前面发布的函数,客户端访问WMS服务,同时将起点终点坐标作为参数传过去,GeoServer就可以返回最短路径瓦片图层,叠加在当前地图就可以了。

效果图如下:

首先需要在postgresql创建空间数据库,存储空间数据;

在数据库运行如下代码

CREATE EXTENSION postgis;

CREATE EXTENSION pgrouting;

CREATE EXTENSION postgis_topology;

CREATE EXTENSION fuzzystrmatch;

CREATE EXTENSION postgis_tiger_geocoder;

CREATE EXTENSION address_standardizer;

然后利用PostGIS自带数据导入插件将线数据ShapFile文件导入空间数据库

处理数据,添加拓扑关系

--roa_4m为表名

--source为线表起点字段名称

--target为线表终点字段名称

--source和target可以在导入数据库前直接先自己定义

--如果不自己定义起点终点,则自动生成起点和终点点号

ALTER TABLE roa_4m ADD COLUMN "source" integer;

ALTER TABLE roa_4m ADD COLUMN "target" integer;

--创建拓扑

SELECT pgr_createTopology('roa_4m', 0.00001, 'geom', 'gid'); --为起点号终点号加空间索引

CREATE INDEX source_idx ON roa_4m("source");

CREATE INDEX target_idx ON roa_4m("target");

--添加长度字段、并计算赋值

ALTER TABLE road_line ADD COLUMN length double precis; update road_line set length =st_length(geom);

--将长度值赋给reverse_cost,作为路线选择标准

ALTER TABLE roa_4m ADD COLUMN reverse_cost double precision; UPDATE roa_4m SET reverse_cost = length;

通过下面代码可以通过起点号、终点号计算经过的路径编号

--通过起点号、终点号查询最短路径

--source为线表起点字段名称

--target为线表终点字段名称

--起点终点前后顺序无固定要求

--length为长度字段,也可以使用自己的评价体系

--1、9为测试使用起点号终点号

--roa_4m路网表名

--id1经过节点号

--id2经过路网线的gid

SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_dijkstra(' SELECT gid AS id,

source::integer,

target::integer,

length::double precision AS cost

FROM roa_4m',

1, 9, false, false);

输出结果

在数据库里输入建立脚本函数

--删除已存在的函数

DROP FUNCTION pgr_fromAtoB(tbl varchar,startx float, starty float,endx float,endy float);

--tbl路网表名

--startx起点经度

--starty起点纬度

--endx终点经度

--endy终点纬度

CREATE OR REPLACE function pgr_fromAtoB(tbl varchar,startx

float, starty float,endx float,endy float)

--限制返回类型

returns geometry as

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;

相关文档
最新文档