我正在研究使用类似geohash的索引来存储地理空间信息,也许可以使用Hilbert曲线。我的问题是关于如何最好地在这样一个索引上划分区域查询。
例如,本文展示了如何将一个区域查询拆分为多个查询,以避免查询显示较差位置的范围(请参见此图)。如果你想像普通的地理哈希一样使用Z曲线通过一个查询来搜索圆形区域,你必须查询整个左下象限,它只占我们所关注区域的一小部分。
在这种情况下,最好将搜索拆分为几个查询,但我还没有找到任何关于如何最好地做到这一点的信息。有没有算法可以将这样的范围查询拆分为覆盖原始区域的较小范围?
一旦您确定了覆盖查询边界的哈希前缀,您就可以开始将该前缀拆分为组成前缀,并在保留它之前测试每个前缀是否与查询边界相交。例如,假设您已将前缀0100确定为覆盖查询区域。前缀0100包括前缀01000和01001,而前缀01000包括前缀010000和010001,前缀01001包括前缀010010和010011等。当您将前缀重写为较大前缀的集合(对应于较小区域)时,您可以过滤掉那些与查询边界不相交的前缀。您将不得不在某个时刻停止拆分过程;拆分的每次迭代都可能使前缀集合的大小加倍。例如,您可以创建一个最大前缀集合大小,此时您可以声明对筛选满意;当然,还有其他指标可以用来找到一个停止点。作为最后一步,您可以重新组合"相邻"前缀,以减少正在执行的搜索次数。例如,如果你只剩下前缀01000和01001,你可以将它们组合成0100,以避免搜索01000后再搜索01001(假设搜索过程的开销超过了顺序读取)。您需要一个例程来计算哈希前缀的边界框,以便测试与查询边界的交集。这将取决于您使用的哈希方案。