使用经度和纬度将地图划分为可变大小的区域。
为简单起见,让我们将地图视为笛卡尔平面,将经度和纬度视为x,y坐标。
区域始终是矩形。例如,区域可以表示为x∈(0,3),y∈(30,50) 笛卡尔平面的范围是有限的,但非常大。
然后,当给定x,y坐标时,我们如何识别坐标所属的区域?
例如,当我们有一个x,y坐标(2,36)时,我们如何才能有效地发现它属于x∈(0,3),y∈(30,50)?
答案 0 :(得分:1)
参见Seidel的论文“用于计算梯形分解和三角化多边形的简单快速增量随机算法”,可在http://www.cs.princeton.edu/courses/archive/fall05/cos528/handouts/A%20Simple%20and%20fast.pdf获得。假设你有n个矩形,那么你的矩形集的这种梯形分解将给O(log n)查找包含给定查询点的矩形的时间。
答案 1 :(得分:1)
如我的评论中所述,您可以使用R-tree解决此问题。链接的维基文章提供了一种比我可以假设更好的解释,但基本概念非常简单:
给定一组区域R0
(示例中为矩形),通过对原始区域进行分组并计算其边界矩形,构建更少区域的集R1
作为一个例子,考虑以下一组区域(我想保持符号简单,这就是为什么我只考虑对角线上的方块:(p, s)
我的意思是一个左下角位于{{{ 1}},其边长(p, p)
}:
s
我们现在可以对前两个和最后两个区域进行分组并计算它们的边界矩形以进入R0 = {(0, 1), (1, 1), (3, 1), (4, 1)}
:
R1
现在的诀窍是,给定查询点R1 = {(0, 2), (3, 2)}
,我们不必检查(1.5, 1.5)
中的所有区域。我们首先在R0
上执行查询,并发现该点位于区域R1
内。因此,我们只需搜索该边界矩形的 children ,这是(0, 2)
中的前两个区域。
当然,这是一个非常简单的例子。实际上,您希望在R0
中的每个边界矩形中只有少数(一些低常数,如4)区域R0
。因此,当您有许多输入区域时,R1
中仍会有许多矩形。幸运的是,我们可以再次应用相同的技巧,并从R1
中创建一组较小的边界矩形R2
。依此类推,直到你到达一个R1
集合,它只包含几个矩形。
您创建了一个完整的树:整个区域是根。 Rn
中的每个矩形都是顶级子项,依此类推。
查询只是按照我为简单示例所描述的方式工作:您只需要递归包含查询点的矩形,理想情况下,您可以排除许多其他矩形。
那为什么我说理想?让我们回到这个例子,假设我将第一个和最后一个矩形分组,中间两个。这会给我一组不同的边界矩形:
Rn
这些矩形是重叠的,因此与上面相同的查询点将在两个矩形中。也就是说,我们仍然需要检查R1 = {(0, 5), (1, 3)}
的所有区域。
因此正确划分矩形非常重要。找到最优除法的问题是NP难的,所以你必须使用启发式算法。一个简单的方法是按左边的x坐标对矩形进行排序并相应地划分它们。在下一个级别中,您将通过y坐标执行相同操作。当所有矩形均匀分布并接近正方形时,该方法非常有效。