这就是我会尝试做的事情:
输入: 兴趣点(纬度,经度),查询半径
第 1 步:找到完全包含QUERY CIRCLE的“最小”边界矩形(MBR)
第 2 步:要创建最小边界矩形,首先使用输入参数计算其最小和最大纬度、经度。请参阅计算最小和最大纬度经度 - 正确方法的第 3.1 和 3.3 节
第 3 步:使用计算 MBR NorthWest、SouthWest、SouthEast、NorthEast(minLat, minLon), (maxLat, maxLon)
的四个角(maxLat, minLon)
(minLat, minLon)
(minLat, maxLon)
(maxLat, maxLon)
Step 4:计算MBR所有四个角的GeoHash
例如:对于纽约市的一个点,例如 (40.75798, -73.991516),距离:800 米和 GeoHash 长度:12
- 西北 :
dr5ru
j4477kd
- 西南 :
dr5ru
46ne2ux
- 东南 :
dr5ru
6ryw0cp
- 东北 :
dr5ru
mpfq534
第 5 步:从这些 GeoHashes 中,计算查询边界框(MBR)前缀:dr5ru
这将为您提供更粗略的 GeoHash,它完全包含我们的 MBR,因此也包含查询区域。换句话说,由dr5ru索引的所有点,产生 32 个 GeoHashesdr5ru0 - dr5ruz
最后一步:
为了找到与我们的查询圈(准确地说是方形(MBR))相对应的确切网格(或)GeoHash,我们应该通过使用 2D 数组表示重复的(4X8)矩阵来从这 32 个 GeoHash 中挑选。
在我们的示例中:我们得到dr5ru
+ J, M, H, K, 5, 7, 4, 6
。所有这些 GeoHash 都代表within
距离中心查询点 800 米的点,除了极少数的 GeoHash,因为考虑了 MBR 而不是正圆,所以无法避免。
单个 GIF 的整体过程:(步骤 1-5)

最后一步:

重要提示:请了解 GeoHash 使用 4 x 8 网格。它在 GeoHash 的长度上随每个字符而变化。对于 ODD 长度,它是 8 x 4,即使它的转置也是4 X 8。在我们的例子中,我们在内部dr5ru
(5 + 1,第 6 分辨率),因此我们使用4 X 8