【问题标题】:Cover polygon with minimal number of overlapping polygons at fixed positions在固定位置用最少数量的重叠多边形覆盖多边形
【发布时间】:2015-10-20 12:00:15
【问题描述】:

如何从一组位置固定的多边形中选择最少数量的多边形,其并集覆盖输入多边形?

例如,让我们考虑以下输入,其中绿色多边形是查询集,蓝色多边形是查询:

正确的覆盖应该是两个多边形:

如何计算最有效地覆盖输入区域的多边形(最小化所选多边形的数量)?

【问题讨论】:

  • 您还想最小化返回区域吗?在您的示例中,左侧邻居而不是您选择的左侧多边形也将覆盖输入区域。但结果会更大。这个问题与地理有什么关系?
  • 地理空间应用程序是选择覆盖请求区域的最少数量的航拍照片(地理空间数据供应商可能会按每张照片收费)。在这种情况下,所选多边形的总面积并不重要,重要的是多边形的数量。

标签: polygon geospatial computational-geometry combinatorics


【解决方案1】:

似乎给出正确结果的解决方案如下:

  1. 将所有多边形裁剪到查询区域

  2. 将每个剪裁的多边形与与之相交的任何其他多边形分开,消除任何重复 - 我们称此操作为“切割”。例如,这样的操作会产生以下不重叠的多边形:

来自以下多边形(按范围裁剪):

  1. 所有切碎的多边形都代表集合覆盖项中的宇宙;被单个裁剪覆盖多边形覆盖的裁剪多边形代表一个子集

  2. 预选所有未完全被其他多边形并集覆盖的多边形对应的子集。

  3. 使用近似算法找到最小集覆盖(如here所述)

我已经使用GeoTools 实现了这一点。代码如下:https://github.com/w-k/MinimalCoverage 以及带有 jar 和依赖项的存档可以从这里下载:https://github.com/w-k/MinimalCoverage/releases


我是根据 Ante 的回答得出的,这个回答非常有价值,但没有提供正确的解决方案。这是不正确的,因为满足所有相交部分都被覆盖的要求会导致查询多边形的过度覆盖。例如,被范围多边形裁剪的覆盖多边形(如上图)产生以下公共部分:

为了覆盖所有公共部分,我们必须选择所有三个覆盖多边形(中间的公共部分没有完全被最左边或最右边的多边形覆盖)。

【讨论】:

    【解决方案2】:

    我认为多边形是四边形,并且您希望以最少的照片数量最大化返回区域,因为这样您将以相同的成本获得更多的区域,可以在将来使用。

    这只是一个关于解决方案的想法。

    对于每个多边形相交部分,存储包含该相交部分的覆盖多边形列表。在您的示例中,有约 30 个相交部分。有些是四边形,有些是 L 形。

    对于查询多边形,查找多边形包含或相交的所有相交部分。这样,我们就有了一组相交部分和覆盖多边形的每个部分列表。喜欢:

    ip_1 - [c1, c3]
    ip_2 - [c1, c2, c3, c6]
    ...
    

    反转这个“矩阵”:

    c1 - [ip_1, ip_2, ...]
    c2 - [ip_2, ... ]
    c3 - [ip_1, ip_2, ... ]
    

    找到最少数量的c's 列表并集是ip's 的整个集合是set covering problem

    此方法找到最优解。它适用于一般多边形。在最简单的版本中,它不能解决面积最大化问题。

    问题正在实施中:-)

    首先是创建支持多边形索引的数据结构。为此,需要一些空间分区结构。将新多边形插入数据结构意味着创建新的交叉点与结构中的交叉点部分。我认为最后的交叉部分的数量将是覆盖多边形数量的常数因子。如果您有规则间隔的四边形,则封面由n*m 部分组成,其中nm 可能很小。

    第二个是集合覆盖问题,它是NP完全的。我希望你不会有太多的套路要覆盖。

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 2013-11-28
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多