java,经纬度转换行政区域
- 格式:docx
- 大小:29.60 KB
- 文档页数:11
坐标转换从经纬度坐标到大地坐标及源码利用网络上开源的资料,可以很容易的实现从经纬度坐标向各种投影坐标的转换,美国地质调查局开发USGS的GCTP就是很好的东西之一,有C语言版本的支持各种投影类型的源代码,比如UNIVERSAL TRANSVERSE MERCATOR, ALBERS CONICAL EQUAL AREA ,LAMBERT CONFORMAL CONIC等等,我们机房使用的就是LAMBERT CONFORMAL CONIC(LAMBERT 圆锥等角投影),利用GCTP提供的源代码详见source文件夹下的lamccfor.c 和 lamccinv.c ,可以轻松实现经纬度投影坐标和LAMBERT CONFORMAL CONIC坐标的相互转化,其他投影方式使用的比较少,还要进一步研究,就以后在写了.lamccforint函数设置LAMBERT CONFORMAL CONIC投影的各个参数,比如长半轴,短半轴,中心点经纬度坐标,标准纬线等等信息.longlamccforint(r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north) double r_maj; /* majoraxis */double r_min; /* minoraxis */double lat1; /* first standardparallel */double lat2; /* second standardparallel */double c_lon; /* centerlongitude */double c_lat; /* centerlatitude */double false_east; /* x offset inmeters */double false_north; /* y offset inmeters */{double sin_po; /* sinvalue */double cos_po; /* cosvalue */double con; /* temporaryvariable */double ms1; /* small m1 */double ms2; /* small m2 */double temp; /* temporaryvariable */double ts0; /* small t0 */double ts1; /* small t1 */double ts2; /* small t2 */r_major = r_maj;r_minor = r_min;false_northing = false_north;false_easting = false_east;/* Standard Parallels cannot be equal and on opposite sides of the equator------------------------------------------------------------------------*/if (fabs(lat1 lat2) < EPSLN){p_error("Equal latitudes for St. Parallels on opposite sides of equator","lamcc-for");return(41);}temp = r_minor / r_major;es = 1.0 - SQUARE(temp);e = sqrt(es);center_lon = c_lon;center_lat = c_lat;sincos(lat1,&sin_po,&cos_po);con = sin_po;ms1 = msfnz(e,sin_po,cos_po);ts1 = tsfnz(e,lat1,sin_po); sincos(lat2,&sin_po,&cos_po);ms2 = msfnz(e,sin_po,cos_po);ts2 = tsfnz(e,lat2,sin_po);sin_po = sin(center_lat);ts0 = tsfnz(e,center_lat,sin_po); if (fabs(lat1 - lat2) > EPSLN)ns = log (ms1/ms2)/ log (ts1/ts2);elsens = con;f0 = ms1 / (ns * pow(ts1,ns));rh = r_major * f0 * pow(ts0,ns);/* Report parameters to the user-----------------------------*/ptitle("LAMBERT CONFORMAL CONIC");radius2(r_major, r_minor);stanparl(lat1,lat2);cenlonmer(center_lon);origin(c_lat);offsetp(false_easting,false_northing);return(OK);}lamccfor函数实现输入任意点经纬度值输出此投影下对应的点的大地坐标long lamccfor(lon, lat, x, y)double lon; /* (I) Longitude */ double lat; /* (I) Latitude */ double *x; /* (O) X projection coordinate */ double *y; /* (O) Y projection coordinate */{double con; /* temporary anglevariable */double rh1; /* height aboveellipsoid */double sinphi; /* sinvalue */double theta; /*angle */double ts; /* small valuet */con = fabs( fabs(lat) - HALF_PI);if (con > EPSLN){sinphi = sin(lat);ts = tsfnz(e,lat,sinphi);rh1 = r_major * f0 * pow(ts,ns);}else{con = lat * ns;if (con <= 0){p_error("Point can not be projected","lamcc-for"); return(44);}rh1 = 0;}theta = ns * adjust_lon(lon - center_lon);*x = rh1 * sin(theta) false_easting;*y = rh - rh1 * cos(theta) false_northing;return(OK);}lamccinv函数的作用与lamccfor函数相反,计算从大地坐标变换到对应的经纬度值long lamccinv(x , y, lon, lat)double x; /* (O) X projection coordinate */double y; /* (O) Y projection coordinate */double *lon; /* (I) Longitude */double *lat; /* (I) Latitude */{double rh1; /* height above ellipsoid */double con; /* sign variable */double ts; /* small t */double theta; /* angle */long flag; /* error flag */flag = 0;x -= false_easting;y = rh - y false_northing;if (ns > 0){rh1 = sqrt (x * x y * y);con = 1.0;}else{rh1 = -sqrt (x * x y * y);con = -1.0;}theta = 0.0;if (rh1 != 0)theta = atan2((con * x),(con * y)); if ((rh1 != 0) || (ns > 0.0)){con = 1.0/ns;ts = pow((rh1/(r_major * f0)),con); *lat = phi2z(e,ts,&flag);if (flag != 0)return(flag);}else*lat = -HALF_PI;*lon = adjust_lon(theta/ns center_lon); return(OK);}。
Java 经纬度转换1. 简介在开发中,经纬度是一个常见的数据类型,用于表示地理位置。
在使用 Java 进行开发时,我们经常需要进行经纬度的转换和处理。
本文将介绍如何在 Java 中进行经纬度的转换,包括经纬度的表示、坐标系的转换、距离计算等方面的内容。
2. 经纬度的表示经纬度是用来表示地球上某一点的坐标,一般由纬度和经度两个值组成。
纬度表示北纬或南纬的位置,取值范围为 -90 到 90 度;经度表示东经或西经的位置,取值范围为 -180 到 180 度。
在 Java 中,可以使用浮点数或者字符串来表示经纬度。
浮点数表示更直观,但由于精度问题可能会导致计算误差。
字符串表示则可以保留更高的精度,但需要进行字符串转换操作。
3. 坐标系的转换地球上的经纬度是基于地心坐标系的,而在实际开发中,我们常常需要将经纬度转换到平面坐标系上进行计算。
常见的平面坐标系有火星坐标系(GCJ-02)、百度坐标系(BD-09)等。
3.1. GCJ-02 坐标系GCJ-02 坐标系,全称为国家测绘局坐标系,是中国国家测绘局制定的一种地理坐标系统。
在中国大陆,由于安全和政策等原因,避免将真实的经纬度信息直接提供给外部服务,所以在国内的地图服务商(如高德地图)会对经纬度进行加密处理,即将地球坐标系(WGS84)转换为 GCJ-02 坐标系。
3.2. BD-09 坐标系BD-09 坐标系,全称为百度坐标系,是百度地图使用的一种地理坐标系统。
与GCJ-02 坐标系类似,BD-09 坐标系也是对 WGS84 坐标系进行加密处理得到的。
在 Java 中,可以使用第三方库或者自己实现算法来进行坐标系的转换。
常用的第三方库有百度地图 Java SDK、高德地图 Java SDK 等。
4. 经纬度的计算在实际开发中,经常会涉及到根据经纬度计算两点之间的距离、判断某一点是否在某个区域内等问题。
下面介绍一些常用的经纬度计算方法。
4.1. 计算两点之间的距离计算两点之间的距离是经纬度计算中的一个常见需求。
java 生成行政区划规则生成行政区划规则是指根据国家或地区的行政管理需要,将一个国家或地区的行政区域划分为不同的行政区划单位,并为每个行政区划单位设立相应的行政机构和管理规则。
行政区划是国家或地区政府对地理空间进行管理和管辖的基本单位,具有重要的行政、经济、社会等功能。
在Java中生成行政区划规则可以通过以下步骤实现:1. 定义行政区划类:创建一个行政区划类,用于表示行政区划单位的信息和属性。
该类可以包含行政区划单位的名称、代码、上级行政区划单位、下级行政区划单位等信息。
2. 构建行政区划数据结构:使用合适的数据结构来组织行政区划单位的层次关系。
常用的数据结构包括树结构和图结构。
树结构可以方便地表示上下级关系,而图结构可以更灵活地表示行政区划之间的复杂关系。
3. 解析行政区划数据:获取行政区划数据源,可以是文本文件、数据库或网络API等。
将行政区划数据解析成相应的数据结构,并建立行政区划之间的层次关系。
4. 实现行政区划查询功能:为行政区划类提供查询方法,根据行政区划代码或名称等条件查询相应的行政区划单位,实现行政区划的检索功能。
5. 实现行政区划管理功能:为行政区划类提供添加、修改、删除等管理方法,方便对行政区划单位进行管理和维护。
6. 提供行政区划数据接口:将生成的行政区划规则以接口的形式提供给其他系统或模块使用,方便其他模块进行行政区划相关的操作。
7. 完善行政区划规则:根据实际需要,可以进一步完善行政区划规则,例如添加行政区划单位的经纬度信息,以支持地理位置相关的功能。
在实际应用中,生成行政区划规则常常需要参考国家或地区的相关法律法规和标准,以确保行政区划规则的准确性和合法性。
为了提高生成行政区划规则的效率和准确性,可以利用现有的行政区划数据源和相关工具,例如国家统计局的行政区划数据、地理信息系统(GIS)软件等。
通过使用Java编程语言,结合合适的数据结构和算法,可以方便地生成行政区划规则,为行政管理和地理空间分析等领域提供支持。
java识别行政区域编码的方法在Java中,识别行政区域编码是一项常见的需求。
行政区域编码是一种标识地区的唯一编号,用于区分不同的行政区域,如国家、省份、城市和县区等。
下面将介绍一种简单的方法来识别行政区域编码。
首先,可以利用第三方库来实现行政区域编码的识别。
例如,可以使用“pinyin4j”库来获取地区的拼音编码。
该库可以将汉字转换为拼音,并提供了丰富的方法来操作拼音数据。
通过将行政区域的名称转换为拼音,然后与已知的行政区域编码进行匹配,即可识别出相应的行政区域编码。
下面是一个简单的示例代码,展示了如何使用“pinyin4j”库来实现行政区域编码的识别:```javaimport net.sourceforge.pinyin4j.PinyinHelper;public class AreaCodeRecognition {public static void main(String[] args) {String areaName = "北京市";String[] areas = {"北京市", "上海市", "广东省"}; // 已知行政区域for (String area : areas) {if (PinyinHelper.convertToPinyinString(area, "",PinyinFormat.WITHOUT_TONE).equals(PinyinHelper.convertToPinyinString(areaName, "", PinyinFormat.WITHOUT_TONE))) {System.out.println("行政区域:" + area + ",编码:" + getAreaCode(area));}}}public static String getAreaCode(String areaName) {// 这里可以根据已知的行政区域编码进行匹配,返回对应的编码// 实际场景中,可以从数据库或其他数据源中获取行政区域编码if (areaName.equals("北京市")) {return "110000";} else if (areaName.equals("上海市")) {return "310000";} else if (areaName.equals("广东省")) {return "440000";}return "";}}```在上述代码中,首先将行政区域的名称转换为拼音,然后与已知的行政区域进行匹配,如果匹配成功,则输出对应的行政区域编码。
根据经纬度获取地市的方法可以通过Google Maps API或者OpenStreetMap API来实现。
下面我将使用Google Maps API的Java SDK进行演示。
首先,你需要在Google Cloud Platform上创建一个项目并获取API密钥。
然后,你可以在Maven中央仓库下载Google Maps API Java SDK。
以下是一个简单的Java代码示例,使用Google Maps API根据经纬度获取地市:```javaimport com.google.maps.GeoApiContext;import com.google.maps.GeocodingApi;import com.google.maps.model.GeocodingResult;import tLng;import java.io.IOException;import java.util.List;public class GeoCoderExample {public static void main(String[] args) {String apiKey = "YOUR_API_KEY"; // 请替换为你的API密钥double latitude = 37.7667; // 示例经纬度double longitude = -122.4444; // 示例经纬度try {GeoApiContext context = new GeoApiContext.Builder().apiKey(apiKey).build();GeocodingResult[] results = GeocodingApi.geocode(context, new LatLng(latitude, longitude)).await();System.out.println("地址:" + results[0].formattedAddress);System.out.println("地市:" + results[0].addressComponents[0].longName); // 第一个地址组件通常代表地市} catch (IOException e) {e.printStackTrace();}}}```这段代码首先创建一个`GeoApiContext`对象,并设置你的API密钥。
java 经纬度转换简书(原创实用版)目录1.经纬度的概念与表示方法2.经纬度转换的必要性3.Java 实现经纬度转换的方法4.经纬度转换的实例5.总结正文1.经纬度的概念与表示方法经纬度是地球表面上某一点的精确位置的表示方法。
经度表示地球表面的位置相对于本初子午线的角度,范围为 0°至 180°,向东增大为东经,向西增大为西经。
纬度表示地球表面的位置相对于赤道的角度,范围为 0°至 90°,向北增大为北纬,向南增大为南纬。
2.经纬度转换的必要性在某些应用场景下,需要将经纬度转换为数字或其他形式。
例如,在数字地图上,经纬度需要转换为二维坐标系下的 x、y 坐标;在导航系统中,经纬度需要转换为海拔高度等。
因此,经纬度转换在实际应用中具有重要意义。
3.Java 实现经纬度转换的方法Java 中,可以使用一些第三方库进行经纬度转换,如 jgeocode 等。
这里以 jgeocode 库为例,展示如何实现经纬度转换。
首先,需要添加 jgeocode 的依赖。
在 Maven 项目中,将以下代码添加到 pom.xml 文件中:```xml<dependency><groupId>com.github.mkandel</groupId><artifactId>jgeocode</artifactId><version>0.1.0</version></dependency>```接下来,可以使用以下代码进行经纬度转换:```javaimport com.github.mkandel.jgeocode.GeoCoordinate;import com.github.mkandel.jgeocode.GeoCoordinateConverter;import com.github.mkandel.jgeocode.Location;public class GeoCoordinateConverterDemo {public static void main(String[] args) {double longitude = 116.39137; // 经度double latitude = 39.90782; // 纬度// 将经纬度转换为 GeoCoordinate 对象GeoCoordinate geoCoordinate = newGeoCoordinate(longitude, latitude);// 将 GeoCoordinate 对象转换为 x、y 坐标Location location =GeoCoordinateConverter.geoCoordinateToLocation(geoCoordinate);double x = location.getX();double y = location.getY();System.out.println("经纬度转换后的 x 坐标:" + x);System.out.println("经纬度转换后的 y 坐标:" + y);}}```4.经纬度转换的实例以经度 116.39137、纬度 39.90782 为例,经过转换后,可以得到 x 坐标为 3982.2,y 坐标为 3982.2。
java根据经纬度获取地址public class GetLocation {public static void main(String[] args) {// lat 39.97646//log 116.3039String add = getAdd("116.3039", "39.97646");JSONObject jsonObject = JSONObject.fromObject(add);JSONArray jsonArray = JSONArray.fromObject(jsonObject.getString("addrList"));JSONObject j_2 = JSONObject.fromObject(jsonArray.get(0));String allAdd = j_2.getString("admName");String arr[] = allAdd.split(",");System.out.println("省:"+arr[0]+"\n市:"+arr[1]+"\n区:"+arr[2]);}public static String getAdd(String log, String lat ){//lat ⼩ log ⼤//参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显⽰前三项)String urlString = "/regeocoding?l="+lat+","+log+"&type=010";String res = "";try {URL url = new URL(urlString);.HttpURLConnection conn = (.HttpURLConnection)url.openConnection();conn.setDoOutput(true);conn.setRequestMethod("POST");java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream(),"UTF-8")); String line;while ((line = in.readLine()) != null) {res += line+"\n";}in.close();} catch (Exception e) {System.out.println("error in wapaction,and e is " + e.getMessage());}System.out.println(res);return res;}}。
java 经纬度到地图编号的转换2010-06-24 16:55好吧= =,纠结了一下午,总算是盆盆啃啃写出来了,只写了1:100万,1:50万,1:25万,1:10万的,剩下的写起来也差不多,不太高兴写了,目前问题是只能区分东西经,不能分南北纬,其实也有笨办法,还是懒得写了,因为没学过正则表达式,如果学过的话提取数字就简单多了。
package mapDivide;//1:100万的图幅编号public class Million {private double latitude; //纬度private double longitude; //经度//构造器,输入经纬度public Million(double latitude, double longitude) {titude = latitude;this.longitude = longitude;}//如果是东经,北纬public String ifeast(){int h=(int)(latitude/4)+1;int l=(int)(longitude/6)+31;char c=(char) (h+64);return c+"-"+l;}//如果是西经,北纬public String ifwest(){int h=(int)(latitude/4)+1;int l=30-(int)(longitude/6);char c=(char) (h+64);return c+"-"+l;}/* //如果是东经,南纬public String ifeastsouth(){int h=(int)(latitude/4)+1;int l=(int)(longitude/6)+31;char c=(char) (h+64);return 'S'+"-"+c+"-"+l;}//如果是西经,南纬public String ifwestsouth(){int h=(int)(latitude/4)+1;int l=30-(int)(longitude/6);char c=(char) (h+64);return 'S'+"-"+c+"-"+l;}*//*public static void main(String args[]){Million million=new Million(31,119);System.out.println(million.ifeast());}*/}package mapDivide;//1:50万public class FiveHundredThousand {private double latitude; //纬度private double longitude; //经度private String str; //1:100万图幅编号public FiveHundredThousand(double latitude, double longitude, String str) { titude = latitude;this.longitude = longitude;this.str = str;}public String number(){char c=str.charAt(0);int h=c-64;int l=Integer.parseInt(str.substring(2));if((latitude>=(h*4-2))&&(longitude<=(l-30)*6-3)) return str+"-"+"A";else if((latitude>=(h*4-2))&&(longitude>=(l-30)*6-3)) return str+"-"+"B"; else if((latitude<=(h*4-2))&&(longitude<=(l-30)*6-3)) return str+"-"+"C"; else return str+"-"+"D";}/*public static void main(String args[]){FiveHundredThousand map=new FiveHundredThousand(37,119,"J-50");System.out.println(map.number());}*/}package mapDivide;//1:25万public class TwFiveTh {private double latitude; //纬度private double longitude; //经度private String str; //1:100万图幅编号public TwFiveTh(double latitude, double longitude, String str) {titude = latitude;this.longitude = longitude;this.str = str;}public String number(){char c=str.charAt(0);int h=c-64;int l=Integer.parseInt(str.substring(2));int xz=h*4; //1:100万中左上角点纬度int yz=0; //1:100万中左上角经度if(l>30) yz=(l-31)*6;else yz=(30-l)*6;int i=(int)((xz-latitude)/1)*4+(int)((longitude-yz)/1.5)+1; return str+"-"+"["+i+"]";}/*public static void main(String[] args){TwFiveTh map=new TwFiveTh(30.5,120.1,"H-51");System.out.println(map.number());}*/}package mapDivide;//1:10万public class HunTh {private double latitude; //纬度private double longitude; //经度private String str; //1:100万图幅编号public HunTh(double latitude, double longitude, String str) { titude = latitude;this.longitude = longitude;this.str = str;}public String number(){char c=str.charAt(0);int h=c-64;int l=Integer.parseInt(str.substring(2));int xz=h*4; //1:100万中左上角点纬度int yz=0; //1:100万中左上角经度if(l>30) yz=(l-31)*6;else yz=(30-l)*6;int i=(int)((xz-latitude)*3)*12+(int)((longitude-yz)*2)+1; return str+"-"+i;}/*public static void main(String[] args){HunTh map=new HunTh(30.3028,120.154,"H-51");System.out.println(map.number());}*/}package mapDivide;//1:10万public class TestMap {//将经纬度转换为十进制数public static double decimal(String str){String s[]={str.substring(0,3),str.substring(4,6),str.substring(7,9)}; double i1=Double.parseDouble(s[0]);double i2=Double.parseDouble(s[1])/60;double i3=Double.parseDouble(s[2])/60/60;return i1+i2+i3;}public static void main(String[] args) throws Exception{double latitude=decimal(args[0]);double longitude=decimal(args[1]);String str1; //1:100万中的地图编号String str2; //1:50万中的地图编号String str3; //1:25万中的地图编号String str4; //1:10万中的地图编号if(args[1].substring(10).equals("E")) str1=newMillion(latitude,longitude).ifeast();else str1=new Million(latitude,longitude).ifwest();str2=new FiveHundredThousand(latitude,longitude,str1).number();str3=new TwFiveTh(latitude,longitude,str1).number();str4=new HunTh(latitude,longitude,str1).number();System.out.println("纬度:"+args[0]+" 经度:"+args[1]);System.out.println("1:100万中地图编号:"+str1);System.out.println("1:50万中地图编号:"+str2);System.out.println("1:25万中的地图编号:"+str3);System.out.println("1:10万中的地图编号"+str4);}。
java通过区域编码获取经纬度的方法在Java中,获取经纬度的方法通常需要使用到一些外部的API或者数据源。
这些数据源通常是一些地图服务提供商,例如Google Maps、Bing Maps 等。
然而,你需要注意,这样的操作可能需要一些许可或者API费用。
一种常用的方法是通过Google Maps的Geocoding API。
以下是一个简单的示例,说明如何使用Java来调用这个API:```javaimport ;import ;import ;import ;public class Main {public static void main(String[] args) throws Exception {String address = "1600 Amphitheatre Parkway, Mountain View, CA";String geocodeApiUrl = " + address + "&sensor=true";URL url = new URL(geocodeApiUrl);HttpURLConnection conn = (HttpURLConnection) ();("GET");BufferedReader in = new BufferedReader(new InputStreamReader(()));String inputLine;StringBuffer response = new StringBuffer();while ((inputLine = ()) != null) {(inputLine);}();();// 打印结果(());}}```这个示例中,我们首先定义了一个地址,然后构造了一个Geocoding API 的URL。
然后我们打开一个到这个URL的连接,发送一个GET请求,并读取返回的输入流。
竭诚为您提供优质文档/双击可除java,经纬度转换行政区域
篇一:geohash算法经纬度转换
geohash算法经纬度转换
geohash在查找周围朋友,lbs中有很多的应用,在网上查找到geohash算法实现分享给大家。
importjava.util.hashmap;
importjava.util.map;
publicclassgeohashkit{
//geohashscharmap
//noasislsos
//oldmacdonalwouldntbehappy
privatestaticchar[]_base32={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};
privatefinalstaticmap_decodemap=newhashmap();static
{
intsz=_base32.length;
for(inti=0;i _decodemap.put(_base32[i],i);
}
}
privatestaticintprecision=12;
privatestaticint[]bits={16,8,4,2,1};
publicstaticvoidmain(string[]args){
geohashkitghf=newgeohashkit();
stringgc1=ghf.encode(31.277631,120.53916300000003);
stringgc2=ghf.encode(51.4797,-0.0124);
system.out.println(gc1);
system.out.println(gc2);
double[]gd1=ghf.decode(gc1);
double[]gd2=ghf.decode(gc2);
system.out.println(gd1[0]
+","+gd1[1]);
system.out.println(gd2[0]+","+gd2[1]);
}
publicstaticstringencode(doublelatitude,doublelongi
double[]lat_interval={-90.0,90.0};
double[]lon_interval={-180.0,180.0}; stringbuildergeohash=newstringbuilder(); booleanis_even=true;
intbit=0,ch=0;
while(geohash.length() doublemid=0.0; if(is_even){
mid=(lon_interval[0]+lon_interval[1])/2;
ch|=bits[bit];
lon_interval[0]=mid;
}else{
lon_interval[1]=mid;
}
}else{
mid=(lat_interval[0]+lat_interval[1])/2;
if(latitude>mid){
ch|=bits[bit];
lat_interval[0]=mid;
}else{
lat_interval[1]=mid;
}
is_even=is_evenfalse:true;
if(bit bit++;
}else{
geohash.append(_base32[ch]);
bit=0;
ch=0;
}
}
returngeohash.tostring();
}
publicstaticdouble[]decode(stringgeohash){
double[]ge=decode_exactly(geohash);
doublelat,lon,lat_err,lon_err;
lat=ge[0];
lon=ge[1];
lat_err=ge[2];
lon_err=ge[3];
doublelat_precision=math.max(1,math.round(-math.log 10(lat_err)))-1;doublelon_precision=math.max(1,math .round(-math.log10(lon_err)))-1;lat=getprecision(la
t,lat_precision);
lon=getprecision(lon,lon_precision);
returnnewdouble[]{lat,lon};
}
publicstaticdouble[]decode_exactly(stringgeohash){ double[]lat_interval={-90.0,90.0};
double[]lon_interval={-180.0,180.0};
doublelat_err=90.0;
doublelon_err=180.0;
intsz=geohash.length();
intbsz=bits.length;
doublelatitude,longitude;
for(inti=0;i
intcd=_decodemap.get(geohash.charat(i));
for(intz=0;z intmask=bits[z];
if(is_even){
lon_err/=2;
if((cd
}else{
lon_interval[1]=(lon_interval[0]+lon_interval[1])/2;
}
}else{
lat_err/=2;
if((cd
}else{
lat_interval[1]=(lat_interval[0]+lat_interval[1])/2;
}
}
is_even=is_evenfalse:true;
}
}
latitude=(lat_interval[0]+lat_interval[1])/2;
longitude=(lon_interval[0]+lon_interval[1])/2;
returnnewdouble[]{latitude,longitude,lat_err,lon_er r};}
staticdoublegetprecision(doublex,doubleprecision){ doublebase=math.pow(10,-precision);
doublediff=x%base;
returnx-diff;。