【问题标题】:Which spatial data structure (algorithm) is best for (searching in) a set of regions (spacial data)?哪种空间数据结构(算法)最适合(搜索)一组区域(空间数据)?
【发布时间】:2011-12-24 09:10:42
【问题描述】:

我有一组多边形区域(地理围栏)。这组数据是固定的;所以不需要插入和删除数据。哪种数据结构可用于搜索查询点(经度、纬度)所在的区域?

注意:我已经为一组点成功实现了 KD-Tree(实际上是 2D-Tree)。但它不适用于这个问题。然后我实现了一个 R-Tree;它解决了问题,但速度很慢(或者我的实现很糟糕)。

谢谢

注意:我一直致力于 R-Tree 的实现,现在可以正常工作了。

【问题讨论】:

标签: c# gis kdtree r-tree


【解决方案1】:

由于您没有插入/删除并且可能有足够的时间来预处理数据,因此您可以使用一些额外的内存来加快计算速度。预处理的基本思路:

  1. 取所有多边形点并确定包含它们的最小轴对齐边界矩形;基本上这是 X 和 Y 的最小值和最大值。
  2. 选择用于创建搜索网格的分区因子 dX 和 dY。为分区因子选择 2 的幂可以使稍后的计算速度稍快。
  3. 转换多边形数据,使其边界矩形最小值与 (0,0) 重合,并扩展矩形,使其成为每个维度中分割因子的整数倍。
  4. 考虑每个网格正方形并列出与正方形相交的多边形。为每个方格存储此列表。根据数据的性质(您期望有多少多边形与正方形相交),您可以通过多种方式优化存储空间或速度。

现在,当您要查找包含点的区域时:

  1. 使用我们之前定义的原点平移该点,并确定包含该点的方格(如果使用 2 的幂,则为移位运算;否则为除法。)
  2. 查看方格列表。如果它为空,则没有包含多边形。如果没有,您必须考虑列表中的每个多边形并搜索交集。

这适用于展开且大部分不相交的多边形,特别是如果您可以选择足够精细的网格大小以使每个正方形只有几个多边形。如果你碰到有很多相交多边形的正方形,它会很慢。另一个优化是在正方形上为每个列出的多边形设置一个标志,以指示该正方形完全包含在多边形内;这允许您在许多情况下以每个多边形条目的单个位为代价来避免缓慢的包含测试。如果您的网格间距与多边形大小相比很好,这尤其有价值,因为大多数正方形不会位于交叉点或边缘。

如果您需要更快的速度,您可以开始使用多边形参考存储每个正方形的边缘信息。您只需要针对实际与正方形区域相交的多边形边缘进行测试。这可以将工作量减少到每个多边形只进行少量边缘测试。

【讨论】:

    【解决方案2】:

    R-Tree 数据结构可用于解决此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2012-11-24
      • 1970-01-01
      相关资源
      最近更新 更多