地理空间索引的划分查询
Posted
技术标签:
【中文标题】地理空间索引的划分查询【英文标题】:Dividing Query on Geospatial Index 【发布时间】:2011-09-23 02:11:10 【问题描述】:我正在研究使用类似 geohash 的索引存储地理空间信息,可能使用希尔伯特曲线。我的问题是关于如何最好地拆分此类索引上的区域查询。
This 文章例如展示了如何将一个区域查询拆分为多个查询,以避免查询显示较差局部性的范围(参见this 图像)。如果您想使用 Z 曲线(如普通 geohash)通过单个查询来搜索圆形区域,则必须查询整个左下象限,该区域只有我们关注的区域的一小部分。
在这种情况下,最好将搜索拆分为几个查询,但是我无法找到有关如何最好地执行此操作的任何信息。是否有算法可以将这样的范围查询拆分为覆盖原始区域的较小范围?
【问题讨论】:
可能会尝试在 gis.stackexchange.com 上询问。它是 *** 的姊妹项目,专注于纯 GIS。 你为什么不只使用地理空间数据库?其中有很多,其中至少有两个是开源的——PostGIS(在 postgresql 上)和 SpatialIte(在 SQLLite 上) 【参考方案1】:一旦您确定了覆盖查询范围的哈希前缀,您就可以开始将该前缀拆分为组成前缀,并在保留之前测试每个前缀是否与您的查询范围相交。例如,假设您已将前缀 0100 标识为覆盖您的查询区域。前缀 0100 包括前缀 01000 和 01001,而前缀 01000 包括前缀 010000 和 010001,前缀 01001 包括前缀 010010 和 010011 等。当您将前缀重写为更大前缀的集合时(对应于较小的区域),您可以过滤掉那些不与查询范围相交的前缀。您必须在某个时候停止拆分过程;每次拆分迭代都可能使前缀集合的大小翻倍。例如,您可以创建一个最大前缀集合大小,此时您声明对过滤感到满意;当然,您可以使用其他指标来找到停止点。作为最后一步,您可以重新组合“相邻”前缀,以减少您正在执行的搜索次数。例如,如果您留下前缀 01000 和 01001,您可以将它们组合成 0100 以避免搜索 01000,然后搜索 01001(假设搜索过程具有超出顺序读取的开销,这是一个好处) .您需要一个例程来计算哈希前缀的边界框,以便测试与查询边界的交集。这取决于您使用的哈希方案。
【讨论】:
以上是关于地理空间索引的划分查询的主要内容,如果未能解决你的问题,请参考以下文章
具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311