包含原始详细多边形的简化(或平滑)多边形

Posted

技术标签:

【中文标题】包含原始详细多边形的简化(或平滑)多边形【英文标题】:Simplified (or smooth) polygons that contain the original detailed polygon 【发布时间】:2011-06-29 14:01:47 【问题描述】:

我有一个详细的二维多边形(代表一个地理区域),它由一组非常大的顶点定义。我正在寻找一种算法来简化和平滑多边形,(减少顶点的数量),其约束条件是生成的多边形的 area 必须包含详细多边形的所有顶点。

关于上下文,这里是一个复杂多边形的边的示例:

我的研究:

我发现 Ramer–Douglas–Peucker 算法会减少顶点的数量 - 但生成的多边形不会包含原始多边形的所有顶点。看这篇文章Ramer-Douglas-Peucker on Wikipedia

我考虑过扩展多边形(我相信这也称为向外多边形偏移)。我发现了这些问题:Expanding a polygon (convex only) 和 Inflating a polygon。但我不认为这会大大减少我的多边形的细节。

感谢您给我的任何建议!

【问题讨论】:

我被这句话弄糊涂了——“我正在寻找一种算法来简化和平滑多边形,(减少顶点的数量),约束条件是生成的多边形必须包含所有详细多边形的顶点。"。如何减少顶点的数量,同时保留所有顶点? 我的意思是生成的多边形应该有更少的顶点,但是它定义的 area 必须包含详细多边形中的所有顶点。谢谢。 这里是性能问题吗? 最终的顶点集应该是原始集的一部分,还是可以伪造一组“新”的不同顶点? 如果新多边形的顶点与详细多边形完全不同,那也没关系,只要新多边形的边缘离原始边缘不太远。例如我不想要一个凸包,或者一个包含原始多边形的大圆。 【参考方案1】:

我写了一个 Douglas-Peucker 的简单修改,可能对以后遇到这个问题的人有所帮助:https://github.com/prakol16/rdp-expansion-only

它与 DP 相同,只是如果要删除的点位于多边形之外,它会将线段向外推一点。这保证了生成的简化多边形包含所有原始多边形,但它具有与原始 DP 算法几乎相同数量的线段,并且通常相当擅长近似原始形状。

【讨论】:

【参考方案2】:

我有一个非常相似的问题:我需要多边形的膨胀简化。

我做了一个简单的算法,通过移除凹点(这将增加多边形大小)或移除凸边(在 2 个凸点之间)并延长相邻边。在任何情况下,执行这两种可能性中的一种都会删除多边形上的一个点。

我选择删除导致最小区域变化的点或边缘。您可以重复此过程,直到您可以简化(例如不超过 200 分)。

两个主要困难是获得快速算法(通过避免计算顶点/边移除变化两次并保持排序的可能性)和避免在过程中插入自相交(不太容易做到和解释,但可能计算复杂度有限)。

事实上,仔细观察后,它与 Visvalingam 的想法相似,带有边缘去除的适应。

【讨论】:

【参考方案3】:

我认为 Visvalingam’s algorithm 可以用于此目的 - 通过跳过会减少面积的三角形的删除。

【讨论】:

【参考方案4】:

在某种程度上,我不确定您要做什么,但您似乎有两个非常好的答案。一个是 Ramer-Douglas-Peucker (DP),另一个是计算 alpha 形状(也称为凹壳、非凸壳等)。我找到了一篇描述 alpha 形状的最新论文,并将其链接在下面。

我个人认为带有多边形扩展的 DP 是要走的路。我不确定为什么你认为它不会大大减少顶点的数量。使用 DP,您可以提供一个因子,并且无论您输入什么内容,您都可以将其制作成任何您想要的三角形。选择这个因素可能很困难,但在你的情况下,我认为这是最好的方法。您应该能够根据您想要消失的最大细节的大小来确定因素。您可以通过直接测试或通过源数据计算来做到这一点。

http://www.it.uu.se/edu/course/homepage/projektTDB/ht13/project10/Project-10-report.pdf

【讨论】:

【参考方案5】:

编辑

截至 2013 年,以下大多数链接不再可用。但是,我找到了the cited paper, algorithm included, still available at this (very slow) server。


Here 你可以找到一个项目来解决你的问题。虽然它主要适用于由点“填充”的区域,但您可以将其设置为与您的“周长”类型定义一起使用。

它使用 k 最近邻方法来计算区域。

样本:

Here您可以索取论文的副本。

似乎他们planned to offer an online service 请求计算,但我没有测试它,可能它没有运行。

HTH!

【讨论】:

谢谢。这看起来很有希望。我想自己实现这个,所以必须看看我能不能拿到那篇论文。计划在本周六工作 - 会及时通知您 @mbrenig 如果您有 ACM 用户,我认为您可以在那里获得论文。此外,如果作者不回答您的请求,我相信您应该能够在网上其他地方找到相关论文。祝你好运!【参考方案6】:

这是一个有趣的问题!我从来没有尝试过这样的事情,但这是我脑海中的一个想法......如果它没有意义或不起作用,请道歉:)

    计算一个可能太大/不精确的凸包 将船体分成 N 个切片,例如将船体的每个顶点连接到中心 计算对象与每个切片的交集 对每个交叉路口递归重复(计算交叉路口的船体等)

每个级别的递归都应该给出更好的近似值......当您达到满意的级别时,合并该级别的所有外壳以获得最终的多边形。

这听起来像它可以完成这项工作吗?

【讨论】:

谢谢!我认为我没有正确理解第 (3) 或 (4) 点。但即便如此,如果我有一个凸包,并采取一些相交(与原始多边形)使其凹入......当你在步骤(4)中再次使其凸出时 - 你最终不会得到相同的凸包你是从什么开始的? 这就是我的想法:docs.google.com/drawings/…。似乎在 1 级之后,我们得到了更多的细节,结果变成了凹形,但我不确定如果我们通过切片每个小船体来重复第 3 步和第 4 步会发生什么。 如果你有一个小的交错线(通过创建船体来平滑)和主要的挤压(通过切割船体进行细化),这也可能效果最好。我不确定您添加的屏幕截图上的结果。 也许凹壳比凸壳更好? gis.stackexchange.com/questions/1200/… @mbrenig - 你有没有找到答案?我有一个相关问题@gis.stackexchange.com/questions/31354/…

以上是关于包含原始详细多边形的简化(或平滑)多边形的主要内容,如果未能解决你的问题,请参考以下文章

海量多边形矢量并行平滑实现

空间索引减慢查询

建筑物多边形化简系列——多边形点数化简

三次贝塞尔曲线平滑多边形

使用贝塞尔曲线进行插值 一种非常简单的平滑多边形的方法

ArcGIS实验教程——实验四十六:地图概括功能实验教程