从一个点找到半径范围内一定长度的地理相位

nau*_*cho 11 geohashing

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

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

Har*_*dhi 31

我就是这样做的:

输入: 兴趣点(lat,long),查询半径

第1步:找到完全包含QUERY CIRCLE的'MINIMUM'BOUNDING RECTANGLE(MBR)

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

步骤3:使用(minLat, minLon), (maxLat, maxLon)计算MBR NorthWest(maxLat, minLon),SouthWest(minLat, minLon),SouthEast(minLat, maxLon),NorthEast的四个角(maxLat, maxLon)

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

例如:在纽约的一个点,比如说(40.75798,-73.991516),距离:800米,地理汉堡长度:12

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

步骤5:从这些GeoHashes中,计算查询边界框(MBR)前缀:dr5ru

这将为您提供更粗略的GeoHash,它完全包含我们的MBR,因此也包含查询区域.换句话说,所有点都由dr5ru索引,产生32个GeoHashesdr5ru0 - dr5ruz

最后一步:

为了找到与我们的查询圆对应的精确网格(或)GeoHashes(精确的方形(MBR)),我们应该通过使用2D数组表示重复(4X8)矩阵来从这32个地理位置中进行选择.

在我们的例子中:我们得dr5ru+ J, M, H, K, 5, 7, 4, 6.所有这些GeoHashes代表within距离中央查询点800米的点,除了极少数GeoHashes,这是无法避免的,因为考虑MBR而不是完美的圆.


单个GIF中的整个过程:(步骤1-5)

整体流程


最后一步:

地理散列

重要提示:请找到使用4 x 8 Grid for GeoHash.它在GeoHash长度上的每个字符都有所不同.对于ODD长度,它是8 x 4,即使它的转置4 X 8.在我们的例子中,我们在里面dr5ru(5 + 1,6分辨率),因此我们使用4 X 8


Ash*_*air 7

看看这个 -> ProximityHash

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