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

时间:2016-04-18 22:23:30

标签: geohashing

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

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

2 个答案:

答案 0 :(得分:29)

我将尝试这样做:

输入 兴趣点(纬线,长线)查询半径

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

步骤2:要创建最小边界矩形,首先使用输入参数计算其最小和最大纬度。请参阅 Computing the Minimum and Maximum Latitude Longitude – the Correct Way

的第3.1和3.3节

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

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

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

  • NorthWest (maxLat, maxLon) dr5ru
  • SouthWest j4477kd dr5ru
  • SouthEast 46ne2ux dr5ru
  • NorthEast 6ryw0cp dr5ru

步骤5:从这些地理位置计算查询边界框(MBR)前缀: dr5ru

这会给你更粗糙的GeoHash,它完全包含我们的MBR,因此也包含查询区域。换句话说,所有点都由 dr5ru 索引,从 mpfq534

获得32个GeoHashes

最后一步:

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

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

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

Overall Process

最后一步:

GeoHash

  

重要提示:请找到使用4 x 8 Grid for GeoHash。它有所不同   对于沿着GeoHash长度的每个角色。对于ODD长度,它是   8 x 4,即使其转置 4 X 8 。在我们的例子中,我们位于 within (5 + 1,6分辨率)内   因此我们使用 4 X 8

答案 1 :(得分:3)

看看这个 - > ProximityHash

ProximityHash生成一组覆盖圆形区域的地理位置,给定中心坐标和半径。它还有一个额外的选项,可以使用GeoRaptor创建各个级别的地理位置的最佳组合来表示圆,从最高级别开始迭代直到最佳混合酿造。结果准确性与起始geohash级别相同,但数据大小显着减少,从而提高了速度和性能。