使用希尔伯特曲线索引进行范围搜索

时间:2018-11-25 22:00:40

标签: database geospatial spatial-query space-filling-curve

我有一个基于this算法的希尔伯特曲线索引。我采用两个到四个值(纬度,经度,Unix格式的时间和一个ID码)并创建一维希尔伯特曲线。

我正在寻找一种使用此数据来创建边界框查询的方法(即“在此矩形内查找所有ID”)。

我正在寻找一种方法,而不将1d Hilbert代码解码回其组成部分。使用Morton / Z阶曲线似乎更容易做到这一点,但我想知道保留位置的原因。

我的问题是:如果我创建了一个2d希尔伯特曲线范围(即,将框的范围转换为希尔伯特曲线,因此x1y1-> hilbert value1和x2y2-> hilbertvalue2),则对应的2d希尔伯特值的所有值都将落入他们的范围?

例如如果我将(1,2)和(20,30)转换为希尔伯特值,然后搜索hilbertvalue1和hilbertvalue2之间的所有值,那么我得到的所有值都将解码为落在(1,2)和(20,30)之内,还是我必须执行其他转换?

另一个问题是,当您具有2个以上尺寸时,将要设计范围。我可以转换出希尔伯特曲线,但是如何确保4d值的经度和纬度都在同一矩形/边界框中?

谢谢。

2 个答案:

答案 0 :(得分:0)

  

我的问题是:如果我创建了2d希尔伯特曲线范围(即,将框的范围转换为希尔伯特曲线,因此x1y1-> hilbert value1和x2y2-> hilbertvalue2),则对应的2d希尔伯特值的所有值都将落入他们的范围?

答案是否定的。这是使用希尔伯特索引的挑战的一部分。以下是示例曲线。您会注意到,曲线上的点的索引比包含该点的框的顶点的索引高。浅蓝色框是一个示例,其中顶点的索引为117、122、133、138,而内部(尽管在边界上)的值为143。

一种简单的方法是蛮力,您可以访问搜索区域中的每个单元格并计算这些单元格中的索引。然后,您将编译将在查询中使用的索引范围的列表。您可能会加入一些范围并稍后进行过滤,以基于基准进行性能优化(很多小范围查询可能比查询较少的较大范围后再进行过滤要花费更多时间)。我希望看到比这更优雅的东西,但还没有看到。

更新:我已经制定出比蛮力技术更优雅的方法,其详细信息(和Java库)在https://github.com/davidmoten/hilbert-curve中。简而言之,精确覆盖搜索框的范围的端点将全部位于该区域的外围。如果对区域的周边上的所有希尔伯特曲线值进行排序,并从最小值开始,则可以通过测试曲线上的下一个点是否位于周边上,离开方框还是位于内部来对所有范围进行配对盒子。

  

另一个问题是,当您具有2个以上尺寸时,将要设计范围。我可以转换出希尔伯特曲线,但是如何确保4d值的经度和纬度都在同一矩形/边界框中?

上述外围技术可用于任何数量的尺寸(但当然会变得更昂贵!)。

答案 1 :(得分:0)

对于2维,您可以将曲线视为以4为底的数字(四键)并从左到右搜索。