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

时间:2011-02-18 04:24:09

标签: algorithm geometry gis polygon computational-geometry

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

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

enter image description here

我的研究:

感谢你给我的任何建议!

6 个答案:

答案 0 :(得分:18)

修改

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


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

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

样品:

enter image description here

Here您可以索取该文件的副本。

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

HTH!

答案 1 :(得分:1)

这是一个有趣的问题!我从来没有尝试过这样的事情,但是这里有一个我头脑中的想法...如果没有意义或不行则道歉:)

  1. 计算一个可能太大/不精确的凸包
  2. 将船体划分为N个切片,例如将每个船体的顶点连接到中心
  3. 计算对象与每个切片的交集
  4. 每个交叉点递归重复(计算交叉口的船体等)
  5. 每个级别的递归应该给出更好的近似....当你达到令人满意的水平时,合并该水平的所有外壳以获得最终的多边形。

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

答案 2 :(得分:1)

我遇到了一个非常类似的问题:我需要对多边形进行充气简化。

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

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

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

事实上,在仔细观察之后,它与Visvalingam相似,并且适合去除边缘。

答案 3 :(得分:0)

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

我个人认为带有多边形扩展的DP是可行的方法。我不确定为什么你认为它不会大幅减少顶点的数量。使用DP,您可以提供一个因子,无论您输入什么,您都可以随心所欲地制作任何想要的三角形。挑选这个因素可能很难,但在你的情况下,我认为这是最好的方法。您应该能够根据要消失的最大细节的大小来确定因子。您可以通过直接测试或从源数据计算来完成此操作。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我写了道格拉斯·皮克(Douglas-Peucker)的简单修改,可能对将来遇到此问题的任何人都有用:https://github.com/prakol16/rdp-expansion-only

与DP相同,不同之处在于,如果要删除的点在多边形之外,则会将线段向外一点推动。这样可以保证所生成的简化多边形包含所有原始多边形,但是它具有与原始DP算法几乎相同的线段数,并且通常在近似原始形状方面相当出色。