(一)经纬度转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转经纬度
1350 0
|
JSON 安全 Java
security跨域配置
security跨域配置
339 3
|
3月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
244 2
|
Linux
configure: error: cannot guess build type; you must specify one
configure: error: cannot guess build type; you must specify one
684 0
|
关系型数据库 Serverless 定位技术
PostgreSQL如何使用GIS函数计算两个点连线的中间点?
PostgreSQL如何使用GIS函数计算两个点连线的中间点?
502 62
|
10月前
|
数据可视化 前端开发 JavaScript
GoView:Start14.6k,上车啦上车啦,Vue3低代码平台GoView,零代码+全栈框架
GoView 是一个Vue3搭建的低代码数据可视化开发平台,将图表或页面元素封装为基础组件,无需编写代码即可完成业务需求。 它的技术栈为:Vue3 + TypeScript4 + Vite2 + NaiveUI + ECharts5 +VChart + Axios + Pinia2 + PlopJS
238 0
|
安全 Java API
深入探索Java网络编程中的HttpURLConnection:从基础到进阶
本文介绍了Java网络编程中HttpURLConnection的高级特性,包括灵活使用不同HTTP方法、处理重定向、管理Cookie、优化安全性以及处理大文件上传和下载。通过解答五个常见问题,帮助开发者提升网络编程的效率和安全性。
542 9
|
缓存 人工智能 PyTorch
LMDeploy 部署 VLMs 的方法与探讨
LMDeploy 部署 VLMs 的方法与探讨 LMDeploy 是一个高效且友好的大型语言模型(LLMs)和视觉-语言模型(VLMs)部署工具箱,由上海人工智能实验室模型压缩和部署团队开发,涵盖了模型量化、离线推理和在线服务等功能。
LMDeploy 部署 VLMs 的方法与探讨
|
监控 安全 网络安全
如何防止内网渗透攻击?
【10月更文挑战第10天】如何防止内网渗透攻击?
935 3
|
数据采集 Java 数据库
Java 利用工具包Geotools实现不同坐标系之间坐标转换
java 利用工具包Geotools实现不同坐标系之间坐标转换
695 0