我有一个给定的latlong点和它们周围的距离 - 例如{40.6826048,-74.0288632:20英里,51.5007825,-0.1258957:100英里}。如果我选择一个固定的geohash长度(比如等于~1x1mile),我如何从每个点找到具有给定半径的那个长度的所有geohash条目?
要添加一些背景 - 我想这样做的原因是我可以保存由geohash id键入的缓存,其中包含给定geohash在半径范围内的点列表的值(并且还匹配一些自定义资格)规则)。然后,我可以快速查找用户的位置geohash,找到他们周围的所有符合条件的点。
答案 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
(maxLat, maxLon)
dr5ru
j4477kd
dr5ru
46ne2ux
dr5ru
6ryw0cp
dr5ru
步骤5:从这些地理位置计算查询边界框(MBR)前缀: dr5ru
这会给你更粗糙的GeoHash,它完全包含我们的MBR,因此也包含查询区域。换句话说,所有点都由 dr5ru 索引,从 mpfq534
要找到与我们的查询圆对应的精确网格(或)GeoHashes(精确的方形(MBR)),我们应该通过使用2D数组表示重复(4X8)矩阵来从这32个地理位置中选择。
在我们的示例中:我们得到 dr5ru0 - dr5ruz
+ dr5ru
。所有这些GeoHashes代表距离中央查询点800米J, M, H, K, 5, 7, 4, 6
的点,除了极少数GeoHash,这是无法避免的,因为考虑了MBR而不是一个完美的圆。
重要提示:请找到使用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级别相同,但数据大小显着减少,从而提高了速度和性能。