【NetTopologySuite类库】GeometryFixer几何自动修复,解决几何自相交等问题

news2024/12/23 13:34:58

介绍

NetTopologySuite 2.x 提供了GeometryFixer类,该类能够将几何体修复为有效几何体,同时尽可能保留输入的形状和位置。几何的IsValid属性,反映了几何是否是有效的。

输入的几何图形始终会被处理,因此即使是有效的输入也可能会有一些微小的更改。输出始终是一个新的几何体对象。

自动修复规则

  1. 删除具有X、Y坐标无限大(或无限小)的顶点(根据IsValid属性)
  2. 重复的点减少到一个点
  3. 空几何的结构是有效的,不作修复
  4. 从集合中删除空元素
  5. Point:保持有效坐标,或为空
  6. LineString:修复坐标
  7. LinearRing:修复坐标,保持环的有效性或将其转为LineString
  8. Polygon:转换为有效的多边形,尽可能多地保留范围和顶点
  • 环被修复,以保证环是有效的
  • 从外轮廓中减掉孔洞
  • 外轮廓线外部的孔洞会被转为Polygon
  1. MultiPolygon:每个多边形都被修复,并且它们之间不会重叠,否则会被合并成一个多边形
  2. GeometryCollection:每个元素都被修复
  3. 通过为GeometryFixer设置参数keepCollapse,折叠线和多边形的处理方式如下:
  • keepCollapse=false,这是默认值,“形状萎缩退化”的几何会变成空几何图形(如果它们是集合的元素,则会被删除)
  • keepCollapse=true,“形状萎缩退化”的几何会被转化为较低维度的有效几何图形

注意:NetTopologySuite 1.x版本没有提供GeometryFixer这个类,需要使用2.x的版本。

对多边形的修复测试

测试1、单个自相交多边形被修复为多个有效的多边形

使用该博客中提到的两个自相交多边形进行测试:

在这里插入图片描述
在这里插入图片描述

        public void TestMethod1()
        {
            var r = new WKTReader();
            var wkts = new string[]
            {
                "POLYGON((0 2, 2 2, 0 0, 2 0, 0 2))",
                "POLYGON((0 0, 1 1, 2 0, 3 0, 4 1,5 0,0 0))"
            };
            var geos = wkts.Select(x=>r.Read(x)).ToList();
            var fixedGeos = geos.Select(x => GeometryFixer.Fix(x)).ToList();

            foreach (var item in fixedGeos)
            {
                Trace.WriteLine(item.AsText());
            }
        }

输出的结果:

MULTIPOLYGON (((0 2, 2 2, 1 1, 0 2)), ((1 1, 2 0, 0 0, 1 1)))
MULTIPOLYGON (((0 0, 1 1, 2 0, 0 0)), ((3 0, 4 1, 5 0, 3 0)))

可以发现修复结果是正确的:

  • 第一个漏斗形状的多边形,被修复为三角形形状的两个多边形
  • 第二个多边形,被修复为三角形形状的两个多边形

测试2、自相交形成“内部洞”,但修复后无洞

在这里插入图片

多边形ABCDEFGH,是自相交的,并且在内部自相交出一个“洞”。
由于多边形本身不带洞,所以修复后,也不带洞。
修复前的WKT:Polygon((0 0,0 3,2 3,2 1,1 1,1 2,3 2,3 0,0 0))
修复后的WKT:POLYGON ((0 0, 0 3, 2 3, 2 2, 3 2, 3 0, 0 0))

测试3、自相交形成“内部洞”,且修复后有洞

在这里插入图片描述
与上面相似但不同的是,多边形ABCDEFGHIFEA被修复后得到一个有洞的多边形,即多边形JKLM带有洞NQPO。

修复前的WKT:Polygon((0 0,0 3,3 3,3 0,1 0,1 1,2 1,2 2,1 2,1 1,1 0,0 0))
修复后的WKT:POLYGON ((0 0, 0 3, 3 3, 3 0, 1 0, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))

测试4、对测试2的调整,使其修复后有洞

修复后是否有洞,与折线的交叉方向、形式有关。
对测试2中的输入几何做略微调整,便可以得到有洞的多边形:
修复前的WKT:Polygon((0 0,0 3,2 3,2 2,1 2,1 1,2 1,2 2,3 2,3 0,0 0))
修复后的WKT:POLYGON ((0 0, 0 3, 2 3, 2 2, 3 2, 3 0, 0 0), (2 2, 1 2, 1 1, 2 1, 2 2))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1936554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

特征工程方法总结

方法有以下这些 首先看数据有没有重复值、缺失值情况 离散:独热 连续变量:离散化(也成为分箱) 作用:1.消除异常值影响 2.引入非线性因素,提升模型表现能力 3.缺点是会损失一些信息 怎么分:…

pdf太大了怎么变小 pdf太大了如何变小一点

在数字化时代,pdf文件已成为工作与学习的重要工具。然而,有时我们可能会遇到pdf文件过大的问题,这会导致传输困难或者存储不便。别担心,下面我将为你介绍一些实用的技巧和工具,帮助你轻松减小pdf文件的大小。 方法一、…

docker的学习(一):docker的基本概念和命令

简介 docker的学习,基本概念,以及镜像命令和容器命令的使用 docker docker的基本概念 一次镜像,处处运行。 在部署程序的过程中,往往是很繁琐的,要保证运行的环境,软件的版本,配置文件&…

SQLite数据库在Android中的使用

目录 一,SQLite简介 二,SQLIte在Android中的使用 1,打开或者创建数据库 2,创建表 3,插入数据 4,删除数据 5,修改数据 6,查询数据 三,SQLiteOpenHelper类 四&…

信弘智能与图为科技共探科技合作新蓝图

本期导读 近日,图为信息科技(深圳)有限公司迎来上海信弘智能科技有限公司代表的到访,双方共同探讨英伟达生态系统在人工智能领域的发展。 在科技日新月异的今天,跨界合作与技术交流成为了推动行业发展的重要驱动。7月…

使用JWT双令牌机制进行接口请求鉴权

在前后端分离的开发过程中,前端发起请求,调用后端接口,后端在接收请求时,首先需要对收到的请求鉴权,在这种情况先我们可以采用JWT机制来鉴权。 JWT有两种机制,单令牌机制和双令牌机制。 单令牌机制服务端…

JAVA 异步编程(线程安全)二

1、线程安全 线程安全是指你的代码所在的进程中有多个线程同时运行,而这些线程可能会同时运行这段代码,如果每次运行的代码结果和单线程运行的结果是一样的,且其他变量的值和预期的也是一样的,那么就是线程安全的。 一个类或者程序…

Linux驱动开发-06蜂鸣器和多组GPIO控制

一、控制蜂鸣器 1.1 控制原理 我们可以看到SNVS_TAMPER1是这个端口在控制着蜂鸣器,同时这是一个PNP型的三极管,在端口输出为低电平时,蜂鸣器响,在高电平时,蜂鸣器不响 1.2 在Linux中端口号的控制 gpiochipX:当前SoC所包含的GPIO控制器,我们知道I.MX6UL/I.MX6ULL一共包…

整顿职场?安全体系建设

本文由 ChatMoney团队出品 00后整顿职场,职场到底怎么了?无压力、无忧虑的00后可以直接开整,那绝大部分打工人寒窗苦读、闯过高考,艰辛毕业,几轮面试杀入职场,结婚买房、上有老下有小,就活该再被…

怎么剪辑音频文件?4款适合新的音频剪辑软件

是谁还不会音频剪辑?无论是个人音乐爱好者,还是专业音频工作者,我们都希望能找到一款操作简便、功能强大且稳定可靠的音频剪辑工具。今天,我就要为大家带来四款热门音频剪辑软件的体验感分享。 一、福昕音频剪辑 福昕音频剪辑是…

JUnit 单元测试

JUnit 测试是程序员测试,就是白盒测试,可以让程序员知道被测试的软件如何 (How)完成功能和完成什么样(What)的功能。 下载junit-4.12和hamcrest-core-1.3依赖包 相关链接 junit-4.12:Central …

【JavaScript 算法】最长公共子序列:字符串问题的经典解法

🔥 个人主页:空白诗 文章目录 一、算法原理状态转移方程初始条件 二、算法实现注释说明: 三、应用场景四、总结 最长公共子序列(Longest Common Subsequence,LCS)是字符串处理中的经典问题。给定两个字符串…

Go语言之参数传递

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 修改参数 假设你定义了一个函数,并在函数里对参数进行…

string相关

int main() {// world替换成 xxxxxxxxxxxxxxxxxxxxxxstring s1("hello world hello bit");s1.replace(6, 5, "xxxxxxxxxxxxxxxxxxxxxx");cout << s1 << endl;s1.replace(6, 23, "yyyyy");cout << s1 << endl;// 所有空格…

C++ | Leetcode C++题解之第260题只出现一次的数字III

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> singleNumber(vector<int>& nums) {int xorsum 0;for (int num: nums) {xorsum ^ num;}// 防止溢出int lsb (xorsum INT_MIN ? xorsum : xorsum & (-xorsum));int type1 0, …

类和对象:构造函数

构造函数是特殊的成员函数&#xff0c;需要注意的是&#xff0c;构造函数虽然名称叫构造&#xff0c;但是构造函数的主要任务并不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时&#xff0c;空间就开好了)&#xff0c;⽽是对象实例化时初始化对象。构造函数的本质是要替代…

通过splunk web服务将服务器上文件下载到本地

1. 需求说明 工作中经常遇到需要将服务器上的文件下载到本地&#xff0c;但是由于各种网络环境限制&#xff0c;没办法使用winscp或者xftp工具&#xff0c;那么如何将服务器上的文件下载下来呢&#xff1f; 这里提供一种思路: 如果服务器上安装有web服务&#xff0c;可将待下…

MongoDB教程(十四):MongoDB查询分析

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、查询分…

防火墙之内容安全过滤技术篇

深度行为检测技术&#xff1a;是一种基于应用层的流量检测和控制技术 DPI:针对完整的数据包&#xff0c;进行内容的识别和检测 基于应用网关的检测技术 --- 有些应用控制和数据是分离的&#xff0c;比如一些视频流。一开始会通过TCP协议链接之后&#xff0c;协商一些参数&#…

扩容升级丨极海正式推出G32A1465系列汽车通用MCU,驱动智驾再进阶

继2023年推出G32A系列汽车通用平台首发产品G32A1445系列后&#xff0c;极海宣布正式推出G32A1465系列全新汽车通用MCU&#xff0c;以满足日益增长的智能驾驶应用需求。作为升级迭代产品&#xff0c;G32A1465专为应用范围不断扩大的高运算要求而设计&#xff0c;集成丰富的通信接…