22

我有给定纬度和周围距离的点 - 例如{40.6826048,-74.0288632:20英里,51.5007825,-0.1258957:100英里}。如果我选择一个固定的 geohash 长度(比如说等于 ~ 1x1mile),我如何才能找到每个点具有给定半径的该长度的所有 geohash 条目?

添加一些背景 - 我想要这样做的原因是,我可以保存一个由 geohash id 键入的缓存,其中包含给定 geohash 在半径内的点列表的值(并且还匹配一些自定义资格规则)。然后我可以快速查找用户的位置 geohash 以找到他们周围所有符合条件的点。

4

2 回答 2

55

这就是我会尝试做的事情:

输入: 兴趣点(纬度,经度)查询半径

第 1 步:找到完全包含QUERY CIRCLE的“最小”边界矩形(MBR)

第 2 步:要创建最小边界矩形,首先使用输入参数计算其最小和最大纬度、经度。请参阅计算最小和最大纬度经度 - 正确方法的第 3.1 和 3.3 节

第 3 步:使用计算 MBR NorthWestSouthWestSouthEastNorthEast(minLat, minLon), (maxLat, maxLon)的四个角(maxLat, minLon)(minLat, minLon)(minLat, maxLon)(maxLat, maxLon)

Step 4:计算MBR所有四个角的GeoHash

例如:对于纽约市的一个点,例如 (40.75798, -73.991516),距离:800 米和 GeoHash 长度:12

  • 西北dr5ruj4477kd
  • 西南dr5ru46ne2ux
  • 东南 :dr5ru6ryw0cp
  • 东北dr5rumpfq534

第 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

于 2016-04-20T09:17:32.030 回答
7

看看这个 -> ProximityHash

给定中心坐标和半径,ProximityHash 生成一组覆盖圆形区域的地理哈希。它还具有使用 GeoRaptor 的附加选项,该选项创建跨各个级别的 geohashes 的最佳组合来表示圆圈,从最高级别开始并迭代直到酿造出最佳混合。结果精度与起始 geohash 级别相同,但数据大小显着减小,从而提高了速度和性能。

于 2017-06-12T08:36:38.927 回答