获取Geohash当前区域周围8个区域编码

由于GeoHash是用的Peano空间填充曲线实现的,因此会存在突变。如下图所示,很近的两个点分布在不同矩形区域,而两个较远的点缺分布在相同的区域,为了解决这问题,我们需要计算出该hash值附近的8个区域,再计算距离。
参考 Geohash
这种方式比较好理解,贴下例子就行了。
[116.3967,44.9999]和[116.3967,45.0009]分别出现在各自附近的区域中,周围8个区域的Geohash怎么计算得到呢?很简单,当Geohash长度是8时,对应的每个最小单元

1
2
double latUnit = (Max_Lat - Min_Lat) / (1 << 20);
double lngUnit = (Max_Lng - Min_Lng) / (1 << 20);

其中20是因为二进制拆分了20次,对应长度为8.

这样可以计算出8个分别分布在周围8个区域的地点,根据地点便可以计算出周围8个区域的Geohash.

1
2
3
4
5
6
7
8
[lat + latUnit, lng]
[lat - latUnit, lng]
[lat, lng + lngUnit]
[lat, lng - lngUnit]
[lat + latUnit, lng + lngUnit]
[lat + latUnit, lng - lngUnit]
[lat - latUnit, lng + lngUnit]
[lat - latUnit, lng - lngUnit]
参考资料
分享到