Geohash 边界框搜索
Posted
技术标签:
【中文标题】Geohash 边界框搜索【英文标题】:Geohash bounding box search 【发布时间】:2013-01-30 18:06:18 【问题描述】:我想做一个边界框查询一个地理哈希字符串的 Trie,其中的点位于空间的中心周围。当点跨越中心点时,我似乎找不到查询特里树的好方法。
假设您在 16x16 的空间中每个坐标有 4 位(总共 8 个)信息,其中每个框都是 1x1。本质上是一个 16x16 的网格。
红线表示geohash中使用的四叉树的最粗划分。
Trie 表示上面的图形。
bits=4, min=0, max=16, numBuckets=16.0, scaling=1.0, tree=
└── null
├── 0
│ ├── (0110100) 00110100 = (6, 6), hash=00110100
│ └── (1100000) 01100000 = (6, 8), hash=01100000
└── 1
├── (0010101) 10010101 = (8, 7), hash=10010101
└── (1000010) 11000010 = (9, 8), hash=11000010
边界框查询定义为左上角点和长度、宽度。 例如(6,6 4x4) 应该返回 6,6 6,8 8,7 和 9,8。
我想到的一种方法是:从包含左上角坐标的最精确的框开始,并不断降低精确度,直到我可以覆盖 4x4 正方形。但是如果我这样做了,我最终会在这个例子中查询整个树。我只是没有看到“更好”的方法。
【问题讨论】:
您的问题是什么?此外,16x16 的空间看起来不太现实。 对 GeoHash 编码尝试的有效边界框查询。 我实际上正在为我的纬度/经度点处理一个 16K x 16K 的盒子,但我在这个问题中使用了一个简单的例子。无论如何,问题始终如一。 【参考方案1】:如果您可以向 trie 结构的节点添加额外信息,我会忽略 GeoHash 编码并将其视为任意树结构。从叶子向上工作,您可以计算围绕每个节点的边界框,该边界框仅包含该节点下方的所有点。然后,当您从上到下搜索一个点(或区域)时,您可以在节点的边界框没有包围(或相交)您的查询点(或区域)时停止搜索。
如果您有能力保持更新,那么当您的搜索点或区域不在(或不相交)一个边界框内时,您将获得一个包围实际上位于某个节点下方的所有点的边界框,即使搜索点或区域可能会与某个点重叠,理论上 GeoHash 可以与该区域重叠。
【讨论】:
是的,我就是这么想的。像在常规 QuadTree 中一样对待查询。测试每个节点的边界框相交,如果相交,则仅继续其子节点。这似乎是目前最好的方法。我希望 geohash 尝试有一些不同,但也许没有。以上是关于Geohash 边界框搜索的主要内容,如果未能解决你的问题,请参考以下文章