哪种空间数据结构(算法)最适合(搜索)一组区域(空间数据)?

时间:2011-11-08 11:29:07

标签: c# gis kdtree r-tree

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

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

谢谢

注意:我参与过R-Tree实现,现在工作正常。

2 个答案:

答案 0 :(得分:2)

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

  1. 获取所有多边形点并确定包含它们的最小轴对齐边界矩形;基本上这是X和Y的最小值和最大值。
  2. 选择将用于创建搜索网格的分区因子dX和dY。为分区因子选择2的幂可以使稍后的计算速度稍快。
  3. 翻译多边形数据,使其边界矩形最小值与(0,0)重合,然后展开矩形,使其成为每个维度中分区因子的整数倍。
  4. 考虑每个网格方块,并列出与方形相交的多边形。存储每个网格方块的列表。根据数据的性质(您可以预期与正方形相交的多边形数量),有多种方法可以针对存储空间或速度进行优化。
  5. 现在,当您想要查找包含点的区域时:

    1. 使用我们之前定义的原点转换点并确定包含该点的网格方块(如果使用2的幂,则为移位操作;否则为除法。)
    2. 查看网格方块的列表。如果它为空,则不包含多边形。如果没有,则必须考虑列表中的每个多边形并搜索交叉点。
    3. 这适用于展开和大多数非交叉多边形,特别是如果您可以选择足够精细的网格尺寸,以便每平方只有几个多边形。如果你碰到有很多交叉多边形的正方形,它会很慢。另一个优化是在方块上为每个列出的多边形设置一个标志,表示该方块完全包含在多边形内;这允许您在许多情况下避免慢速包容测试,代价是每个多边形条目一位。如果您的网格间距与多边形大小相比很好,这是特别有价值的,因为大多数方块不在交叉点或边缘。

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

答案 1 :(得分:2)

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