zoukankan      html  css  js  c++  java
  • PostGIS管网连通性分析

    GIS在管网数据中的很重要的一个应用方向就是”管网空间分析“,其中包括连通性分析、上下游分析、爆管分析等等。下面是我使用postgis来实现“管网连通性分析”的解决方案,分享给大家,以便相互学习。

    使用该分析之前确保已添加扩展postgispgrouting

    CREATE EXTENSION postgis;
    CREATE EXTENSION pgrouting;
    

    导入数据

    将数据导入到postgreSQL数据库,我是从ArcGIS直接导入的,导入方式参考https://blog.csdn.net/eternity_xyf/article/details/80168029

    创建拓扑

    这里我用的管网数据表名为pipe

    创建拓扑,生成pipe_vertices_pgr,该操作类似于ArcGIS中创建路网数据。

    pipe添加管段起始编号pgr_source、结束编号pgr_target、管段长度pgr_length三个字段,其中管段长度是用于分析的权重值。

    --添加起点id
    ALTER TABLE postgres.pipe ADD COLUMN IF NOT EXISTS pgr_source integer;
    
    --添加终点id
    ALTER TABLE postgres.pipe ADD COLUMN IF NOT EXISTS pgr_target integer;
    
    --添加权重值
    ALTER TABLE postgres.pipe ADD COLUMN IF NOT EXISTS pgr_length double precision;
    

    pgr_sourcepgr_target创建索引

    --为pgr_source字段创建索引
    CREATE INDEX IF NOT EXISTS pgr_source_idx ON postgres.pipe("pgr_source")
    
    --为pgr_target字段创建索引
    CREATE INDEX IF NOT EXISTS pgr_target_idx ON postgres.pipe("pgr_target")
    

    为权重字段pgr_length赋值

    --为pgr_length赋值,shape为几何类型的字段,可能为shape、the_geom,通过ArcGIS导入的时候字段为"shape",其他方式导入时一般为"the_geom"
    update postgres.pipe set pgr_length = public.st_length(shape)
    

    调用pgr_createTopology方法,创建拓扑,这个步骤会为pgr_sourcepgr_target字段赋值,同时生成节点表pipe_vertices_pgr

    --为目标表创建拓扑布局,即为pgr_source和pgr_target字段赋值
    select public.pgr_createTopology('postgres.pipe',0.000001,'shape','objectid','pgr_source','pgr_target')
    

    计算联通性

    根据起点坐标、终点坐标从pipe_vertices_pgr查询最近的起点、终点标识

    image-20210426182158735

    调用pgr_kdijkstraPath函数,查询出起点、终点联通的线。

    image-20210315104505557

    通过这里我们可以看出,该分析的核心是调用了pgrouting扩展中的求最短路径的函数pgr_kdijkstraPath,该函数用的是是Dijkstra算法,通过已添加的索引pgr_sourcepgr_target以及权重值pgr_length,计算出两点之间的最短路径,如果有最短路径,证明两点联通。

    该分析可用于计算给水管网、排水管网、输油管道等管网数据的两节点的连通性,当然也可用于路网的最短路径分析。

    函数脚本

    上面为整体分析思路,现在将上述思路整理成函数,方便使用

    1. 创建拓扑函数:analysis_updatetopology()
    2. 计算连通性函数:analysis_connect()

    如何使用

    1. 调用analysis_updatetopology()函数,完成拓扑创建

      -- 传入表名pipe,创建拓扑
      select * from analysis_updatetopology('pipe')
      
    2. 从地图选择起点、终点,然后调用analysis_connect()函数,得到分析结果

      -- 传入表名、起点坐标、终点坐标、容差值
      select * from analysis_connect('pipe',103.90893393,30.789659886,103.911700936,30.787850094,0.00001)
      

    总结

    1. 连通性分析的核心是利用最短路径分析算法来实现
    2. 进行分析之前需要对管网数据创建拓扑

    原文地址:http://gisarmory.xyz/blog/index.html?blog=PostGISConnect

    关注《GIS兵器库》, 第一时间获得更多高质量GIS文章。

    本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名《GIS兵器库》(包含链接:  http://gisarmory.xyz/blog/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

  • 相关阅读:
    正则表达式分组()、不捕获(?:)和断言(?<=)详解
    正则匹配IP
    正则匹配中文
    SPL--Serializable
    JavaScript中原型和原型链
    JavaScript中变量和函数声明的提升
    运行gulp提示:Task function must be specified
    vue-router 去掉#
    学以致用 ---- vue子组件→父组件通信
    删除node_modules
  • 原文地址:https://www.cnblogs.com/gisarmory/p/14708124.html
Copyright © 2011-2022 走看看