(一)经纬度转GeoHash

简介: 经纬度转GeoHash

(一)经纬度转GeoHash

(二)GeoHash转经纬度

importjava.util.ArrayList;
importjava.util.List;
publicclassGeoHashHelper {
publicfinaldoubleMax_Lat=90;
publicfinaldoubleMin_Lat=-90;
publicfinaldoubleMax_Lng=180;
publicfinaldoubleMin_Lng=-180;
/*** 纬度二值串长度*/privatestaticintlatLength;
/*** 经度二值串长度*/privatestaticintlngLength;
privatefinaldoublelatUnit= (Max_Lat-Min_Lat) / (1<<latLength);
privatefinaldoublelngUnit= (Max_Lng-Min_Lng) / (1<<lngLength);
privatefinalString[] base32Lookup= {
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "b", "c", "d", "e", "f", "g", "h", "j", "k",
"m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"    };
/*** 二值化:对经纬度二分逼近,大于中间值的为1,小于中间值的为0,将其转为长度为length的二值串** @param min   区间最小值* @param max   区间最大值* @param value 经度或纬度* @param count 二分次数* @param list  二值串*/privatevoidconvert(doublemin, doublemax, doublevalue, intcount, Listlist) {
if (list.size() > (count-1)) {
return;
        }
doublemid= (max+min) /2;
if (value<mid) {
list.add('0');
convert(min, mid, value, count, list);
        } else {
list.add('1');
convert(mid, max, value, count, list);
        }
    }
/*** 将合并的二值串转为base32串** @param str 合并的二值串* @return base32串*/privateStringbase32Encode(finalStringstr) {
System.out.println(str);
Stringunit="";
StringBuildersb=newStringBuilder();
for (intstart=0; start<str.length(); start=start+5) {
unit=str.substring(start, start+5);
sb.append(base32Lookup[convertToIndex(unit)]);
        }
returnsb.toString();
    }
/*** 每五个一组将二进制转为十进制** @param str 五个为一个unit* @return 十进制数*/privateintconvertToIndex(Stringstr) {
intlength=str.length();
intresult=0;
for (intindex=0; index<length; index++) {
result+=str.charAt(index) =='0'?0 : 1<< (length-1-index);
        }
System.out.println(result);
returnresult;
    }
/*** 经纬度二值串合并:偶数位放经度,奇数位放纬度,把2串编码组合生成新串** @param lat 纬度* @param lng 经度*/publicStringencode(doublelat, doublelng) {
if (latLength<1||lngLength<1) {
return"";
        }
ListlatList=newArrayList<>(latLength);
ListlngList=newArrayList<>(lngLength);
// 获取维度二值串convert(Min_Lat, Max_Lat, lat, latLength, latList);
// 获取经度二值串convert(Min_Lng, Max_Lng, lng, lngLength, lngList);
System.out.println("latList: "+latList);
System.out.println("lngList: "+lngList);
StringBuildersb=newStringBuilder();
for (intindex=0; index<latList.size(); index++) {
sb.append(lngList.get(index)).append(latList.get(index));
        }
//        如果二者长度不一样,说明要求的精度为奇数,经度长度比纬度长度大1if (lngLength!=latLength) {
sb.append(lngList.get(lngList.size() -1));
        }
returnbase32Encode(sb.toString());
    }
/*** 根据精度获取GeoHash串** @param precise 精度* @return GeoHash串*/publicStringgetGeoHash(doublelat, doublelng, intprecise) {
if (precise<1||precise>9) {
return"";
        }
latLength= (precise*5) /2;
if (precise%2==0) {
lngLength=latLength;
        } else {
lngLength=latLength+1;
        }
returnencode(lat, lng);
    }
/*** 获取GeoHash6** @return GeoHash6*/publicStringgetGeoHash6(doublelat, doublelng) {
latLength=15;
lngLength=15;
returnencode(lat, lng);
    }
/*** 获取GeoHash7** @return GeoHash7*/publicStringgetGeoHash7(doublelat, doublelng) {
latLength=17;
lngLength=18;
returnencode(lat, lng);
    }
publicstaticvoidmain(String[] args) {
longstart=System.currentTimeMillis();
System.out.println(newGeoHashHelper().getGeoHash(39.928167, 116.389550, 7));
System.out.println("waste time: "+ (System.currentTimeMillis() -start) +"ms");
    }
}


目录
相关文章
(二)GeoHash转经纬度
GeoHash转经纬度
1170 0
|
26天前
|
存储 定位技术 数据库
探索GeoHash:滴滴打车定位技术揭秘
【10月更文挑战第28天】
36 5
|
4月前
|
算法 C++
大地经纬度坐标与地心地固坐标的的转换
大地经纬度坐标与地心地固坐标的的转换
90 0
|
定位技术
百度地图开发:字符串经纬度转为经纬度数组的解决方案
百度地图开发:字符串经纬度转为经纬度数组的解决方案
159 0
|
存储 NoSQL Go
GeoHash之存储篇
GeoHash之存储篇
150 0
|
存储 算法 定位技术
GeoHash——滴滴打车如何找出方圆一千米内的乘客?
GeoHash——滴滴打车如何找出方圆一千米内的乘客?
根据经纬度计算距离
#region 计算经纬度 private const double EARTH_RADIUS = 6378137; /// /// 计算两点位置的距离,返回两点的距离,单位 米 /// 该公式为GOOGLE提供,误差小于0.
1116 0