预RTree步骤:将一组点分成矩形区域,每个区域包含一个点

时间:2009-02-15 21:31:17

标签: database algorithm data-structures gis spatial

鉴于我当前的位置(lat,long)我想快速找到兴趣点问题中最近的邻居。因此,我打算使用R-Tree数据库,它允许快速查找。但是,首先必须填充数据库 - 当然。因此,我需要确定覆盖该区域的矩形区域,其中每个区域包含一个感兴趣的点。

我的问题是如何预处理数据,即如何将区域细分为这些矩形子区域? (我想要矩形区域,因为它们很容易添加到RTree中 - 与更一般的Voronoi区域相比)。

/约翰

3 个答案:

答案 0 :(得分:2)

Oracle Spatial Cartridge文档描述了可以执行您想要的曲面细分算法。简而言之:

  • 将所有积分都包含在方格
  • 如果square包含1个点 - index square
  • 如果square不包含点 - 忽略它
  • 如果square包含多于1个点
    • 将正方形分成4个相等的正方形并对每个新正方形重复分析

结果应该是这样的:
alt text http://download-uk.oracle.com/docs/cd/A64702_01/doc/cartridg.805/a53264/sdo_ina5.gif

答案 1 :(得分:2)

编辑:以下方法有效,但忽略了R树的关键特性 - R树节点的分裂行为已明确定义,并维护一个平衡树(通过B-树状的属性)。所以事实上,你所要做的就是:

  1. 每页选择最大矩形数
  2. 创建种子矩形(使用距离彼此最远的点,质心等)。
  3. 对于每个点,选择一个矩形以将其放入
    1. 如果它已经落入一个矩形,请将其放在那里
    2. 如果没有,请扩展需要延伸最少的矩形(测量“最少”出口的不同方法 - 区域有效)
    3. 如果适用多个矩形 - 根据它的充实程度或其他一些启发式
    4. 选择一个
  4. 如果发生溢出 - 使用二次分割来移动物体......
  5. 依此类推,直接使用教科书中的R-tree算法。
  6. 我认为下面的方法可以找到你的初始种子矩形;但是你不希望以这种方式填充整个R-tree。一直进行拆分和重新平衡可能有点贵,因此您可能希望使用下面的KD方法完成相当大的工作。只是不是所有的工作。


    KD方法:将所有内容都包含在一个矩形中。

    如果矩形中的点数是>阈值,扫描方向D,直到你覆盖一半的点。

    划分为左右(或上下)分裂点的矩形。

    在新的矩形上递归调用相同的程序,使用下一个方向(如果你从左到右,你现在将从上到下,反之亦然)。

    这与另一张海报提供的分为平方的方法相比,其优势在于它可以更好地适应偏斜点分布。

答案 2 :(得分:0)

我认为你在问题陈述中遗漏了一些东西。假设您有N个点(x,y),使得每个点都具有唯一的x和y坐标。您可以将区域划分为N个矩形,然后将其划分为N个垂直列。但这并不能帮助您轻松解决最近的POI问题,是吗?所以我认为你正在思考一些你尚未明确表达的矩形结构。

插图:

| | | | |5| | |
|1| | | | |6| |
| | |3| | | | |
| | | | | | | |
| |2| | | | | |
| | | | | | |7|
| | | |4| | | |

数字是POI,垂直线显示细分为7个矩形区域。但显然,细分中没有太多“有趣”的信息。你没有提到的细分是否有一些额外的标准?