GeoHash是一种编码地理位置的方法,它将地球表面的位置转化为一个简短的字符串。这个字符串的长度可以变化,并且其精度也随着字符串长度的增加而增加。GeoHash非常适合用于位置索引和空间索引,可以快速检索出一定范围内的地理信息。
GeoHash基础知识
编码与解码:GeoHash通过递归地将纬度和经度区间进行二分,将地理位置转换成一个由字母和数字组成的字符串。字符串越长,定位就越精确。
长度与精度:GeoHash的长度决定了它的精度。例如,长度为5的GeoHash大约能表示1.9km x 1.9km的区域;长度为6时,精度提升到0.61km x 0.61km
空间索引:由于GeoHash的特性,较短的前缀可以表示更大的区域,因此在数据库中使用GeoHash作为索引可以快速缩小搜索范围。
GeoHash长度和经度对应关系
查询数据库中的数据在我附近一公里范围内,常见的三种实现方法:
1)直接sql中进行计算和目标经纬度的距离进行查询。
2)首先计算目标经纬度1公里内,经度的最大和最小值,纬度的最大和最小值,然后在sql中直接判断经纬度分别在最小值和最大值之间。
3)首先需要数据表中加一个geohash字符串字段存储,然后计算目标地点的经纬度的geohash,然后在sql语句中like查询。适合数据量大的情况。
详细介绍GeoHash方法
引入依赖
<dependency>
<groupId>ch.hsr</groupId>
<artifactId>geohash</artifactId>
<version>1.3.0</version>
</dependency>
1、首先确保数据库中有geohash字符串字段,默认是长度为12的GeoHash字符串。
public static void main(String[] args) {
String geoHashStr = GeoHash.geoHashStringWithCharacterPrecision(39.96429451442876, 116.47551449510183, 12);
System.out.println(geoHashStr);
}
//打印结果:wx4g67qbuhqq
2、首先获取目标地点的经纬度,
3、确定精度,选择GeoHash合适的长度,结合上面图,使它可以表示1公里内的区域,选择长度5即可,范围为2.4km。
public static void main(String[] args) {
String geoHashStr = GeoHash.geoHashStringWithCharacterPrecision(39.96429451442876, 116.47551449510183, 12);
System.out.println(geoHashStr);
String geoHash5Str = GeoHash.geoHashStringWithCharacterPrecision(39.96434144610943, 116.47536141255637, 5);
System.out.println(geoHash5Str);
}
//geoHashStr打印结果:wx4g67qbuhqq
//geoHash5Str打印结果:wx4g
4、查询数据库,通过GeoHash过滤筛选范围内数据,获取2.4km范围内的数据。geostr是数据经纬度对应的GeoHash的字符串,value是目的地经纬度对应的GeoHash的值,长度为5。
select lat,lng,geostr from site_data where geostr like value+'%';
5、获取数据后再和当前地点内的经纬度进行计算,获取和当前地点的距离,然后筛选出1公里内的数据进行排序。