在PostGIS中一个面要素表中的缝隙(Find gaps among polygons in PostGIS)

2024-06-01 06:04

本文主要是介绍在PostGIS中一个面要素表中的缝隙(Find gaps among polygons in PostGIS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

场景

在PostGIS中有一张面要素表,需要检查该表中的哪些地方有缝隙。
其中缝隙定义为这些多边形的并集中的环。
There is a surface feature table in PostGIS, and it is necessary to check which areas in the table have gaps.
The gaps are defined as the rings in the union of these polygons.
数据分布如下:
在这里插入图片描述
我们可以看出其中的缝隙,用红色框选一下:
在这里插入图片描述

第一步:计算全部要素的外包矩形

			WITH all_box AS (SELECT ST_Envelope(ST_Union(geom)) AS boxFROM TARGET_TABLE), unionB as (SELECT ST_Simplify(ST_Union(st_buffer(GEOM_COLUMN,TOLERANCE_VALUE)),TOLERANCE_VALUE) AS BGEOM FROM TARGET_TABLE) 

第二步:从外包矩形中依次去掉面要素

removed_box AS (SELECT ST_Difference(a.box, B.BGEOM) AS xFROM all_box aJOIN unionB b ON TRUE)

第三步:去掉与边界接触的子要素

			, filtered_x AS (SELECT ST_Difference(r.x, ST_Boundary(r.x)) AS yFROM removed_box r)

第四步:如果是几何集合则分解为简单对象

			, otherpolygons as (SELECT (ST_Dump(f.y)).* FROM filtered_x f), otherPolygons_sub as (select geom from otherpolygons where ST_NumInteriorRings(geom) > 0), interior_rings AS (SELECT ST_InteriorRingN(geom, generate_series(1, ST_NumInteriorRings(geom))) AS geomFROM otherPolygons_sub t)select op.geomfrom otherpolygons op, all_box ab where (st_touches(ST_ExteriorRing(ab.box),op.geom) = false)or(st_geometrytype(st_intersection(ST_ExteriorRing(ab.box),op.geom)) = ''ST_Point'')';

完整函数

create or replace function public.sp_check_gap(targetTb varchar,resultTb varchar,geomColumnName varchar default 'geom', curUserName varchar default '')
RETURNS character varying
LANGUAGE 'plpgsql'
AS $BODY$--DECLARE _RESULT VARCHAR;--DECLARE row record;declare _TOLERANCE FLOAT8 default 0.0000000000001;declare _SQLTMP text;declare _ISPOINTTYPE BOOLEAN;
beginexecute 'SELECT EXISTS (SELECT POSITION(''Polygon'' in ST_GEOMETRYTYPE(GEOM)) FROM ' ||targetTb|| ' LIMIT 1)' into _ISPOINTTYPE;-- 如果类型不是面,则不检查if _ISPOINTTYPE = false then return -1;end if;--ID、要素ID、是否已修正EXECUTE 'CREATE TABLE IF NOT EXISTS ' || resultTb ||' (id varchar DEFAULT (((''ID_''::text || to_char(now(), ''YYYYMMDDHH24MISS''::text)) || ''_''::text) || "substring"(md5(random()::text), 1, 10)) NOT NULL,geom Geometry,corrected Boolean)';execute 'DELETE FROM ' || resultTb;_SQLTMP :='-- 第一步:计算全部要素的外包矩形WITH all_box AS (SELECT ST_Envelope(ST_Union(geom)) AS boxFROM TARGET_TABLE), unionB as (SELECT ST_Simplify(ST_Union(st_buffer(GEOM_COLUMN,TOLERANCE_VALUE)),TOLERANCE_VALUE) AS BGEOM FROM TARGET_TABLE) -- 第二步:从外包矩形中依次去掉面要素, removed_box AS (SELECT ST_Difference(a.box, B.BGEOM) AS xFROM all_box aJOIN unionB b ON TRUE)-- 第三步:去掉与边界接触的子要素, filtered_x AS (SELECT ST_Difference(r.x, ST_Boundary(r.x)) AS yFROM removed_box r)-- 第四步:如果是几何集合则分解为简单对象, otherpolygons as (SELECT (ST_Dump(f.y)).* FROM filtered_x f), otherPolygons_sub as (select geom from otherpolygons where ST_NumInteriorRings(geom) > 0), interior_rings AS (SELECT ST_InteriorRingN(geom, generate_series(1, ST_NumInteriorRings(geom))) AS geomFROM otherPolygons_sub t)insert into RESULT_TABLE (geom)select op.geomfrom otherpolygons op, all_box ab where (st_touches(ST_ExteriorRing(ab.box),op.geom) = false)or(st_geometrytype(st_intersection(ST_ExteriorRing(ab.box),op.geom)) = ''ST_Point'')';_SQLTMP:= REPLACE(_SQLTMP,'RESULT_TABLE',resultTb);_SQLTMP:= REPLACE(_SQLTMP,'TARGET_TABLE',targetTb);_SQLTMP:= REPLACE(_SQLTMP,'GEOM_COLUMN',geomColumnName);_SQLTMP:= REPLACE(_SQLTMP,'TOLERANCE_VALUE',_TOLERANCE::VARCHAR);raise notice '_SQLTMP : %',_SQLTMP;execute _SQLTMP;RETURN resultTb;
end;
$BODY$;

测试调用

select public.sp_check_gap('TARGET_TABLE','RESULT_TABLE');

查询结果

select * from YOUR_RESULT_TABLENAME;

在这里插入图片描述

分析结果

在这里插入图片描述

这篇关于在PostGIS中一个面要素表中的缝隙(Find gaps among polygons in PostGIS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020178

相关文章

展厅设计主要的六大要素

1、从创意开始      展示设计的开始必须创意在先。根据整体的风格思路进行创意,首先要考虑的是主体的造型、大小高度位置以及它和周围展厅的关系。另外其他道具设计制作与运作方式也必须在创意中有明确的体现。      2、平面感      平面感是指对展示艺术设计平面图纸审美和功能两个方面理性的感觉认识。它是三维空间设计认识的基础,也是施工的重要依据。展示空间的设计应先在展场环境的平面

IPD推行成功的核心要素(十一)技术规划与平台规划促进公司战略成功

随着外部大环境的影响,各企业仅有良好的愿望是不够的。预测并顺应新兴市场和技术的变化,变危机为转机,不断推出强大的产品才是一个公司持续繁荣的根本保障。而高效的产品开发往往是基于某些关键技术,针对市场推出的一个或几个产品系列,这些产品系列通常共用一些产品平台,共用一种或者几种关键技术。当一家企业进入了平稳发展期,已经建立了较为完善的管理制度和产品开发流程,但是依然认为竞争对手是那样强大,那样不可战胜。

【Linux系列】find命令使用与用法详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等常用开发工具系列:常用的开发工具,IDEA,M

Leetcode 3195. Find the Minimum Area to Cover All Ones I

Leetcode 3195. Find the Minimum Area to Cover All Ones I 1. 解题思路2. 代码实现 题目链接:3195. Find the Minimum Area to Cover All Ones I 1. 解题思路 这一题还是挺简单的,只要找到所有1所在的元素的上下左右4个边界,作为目标矩形的四个边即可。 2. 代码实现 给出python

「Debug R」报错unable to find an inherited method for function是如何产生的

在一个群里看到这样一条报错,截图如下: 报错信息 当然这种问题解决起来也很快,无非就是把报错信息复制出来放在搜索引擎上,只不过你要挑选合适的搜索引擎。 百度 谷歌 必应 解决方案就是用dplyr::select。 虽然报错解决了,但是我还想着要重复出这个报错。因为只有能重复出报错,才能证明你不是运气好才解

[数据概念]梅宏院士-数据要素化怎么办十问

“ 提出问题,才能解决问题。” 5月27日,2023中国国际大数据产业博览会“数据要素流通与价值化”论坛举行,中国科学院院士、中国计算机学会理事长梅宏发出数据要素化十问。 本文主要内容转自 数字化转型战略指南 01   第一问:能否以及如何将数据列为资产? —————————————————— 资产,从广义上讲,指的是源于过去交易或者事件的一系

管理不到位,活该执行力差?狠抓这4点要素,强化执行力

管理不到位,活该执行力差?狠抓这4点要素,强化执行力 一:强化制度管理 1、权责分明,追责管理 要知道,规章制度其实就是一种“契约”。 在制定制度和规则的时候,民主一点,征求团队成员的意见,或者沟通一下,投票表决比较好。   然后,到时候,该怎么罚怎么罚,不要破例,也不要对任何人手下留情。 一定要权责分明,对事不对人。只有维护制度的权威,才能提高执行力。  2、相互监督,互相负责   领导永远只有

百老开通知识星球啦,数据要素、数据治理等资料迅速扩散!

1.写在前面: 做数据相关工作有一些年头了,手里也积攒了几千份案例、解决方案、考试认证资料、数据要素研报等材料,形成自我的架构参考库,按TOGAF开发方法,分别形成标准信息库(Standards Information Base)、参考库(Reference Library)、架构情景库等。使得工作效率事半功倍。搞个星球,是希望跟各位分享架构参考库,希望帮助到各位! 按分类形成企业连续

[leetcode] 515. Find Largest Value in Each Tree Row

Find Largest Value in Each Tree Row 描述 You need to find the largest value in each row of a binary tree. Example: Input: 1/ \3 2/ \ \ 5 3 9 Output: [1, 3, 9] 我的代码 简单的dfs。 要使

8.12 矢量图层面要素单一符号使用五(栅格数据填充)

文章目录 前言栅格数据填充(Raster image fill)QGis设置面符号为栅格数据填充(Raster image fill)二次开发代码实现栅格数据填充(Raster image fill) 总结 前言 本章介绍矢量图层线要素单一符号中使用栅格数据填充(Raster image fill)的使用说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps 栅