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 根据坐标判断城市编码的方法1. 简介在开发中,我们经常会遇到需要根据给定的坐标来判断所在城市编码的情况。
例如,我们可能需要根据用户当前位置来提供相关的城市信息或者服务。
本文将介绍如何使用 Java 编程语言来实现根据坐标判断城市编码的方法。
2. 城市编码数据源要实现根据坐标判断城市编码的功能,我们首先需要获取到相应的城市编码数据源。
在中国,我们可以使用国家统计局发布的《中华人民共和国行政区划代码》作为数据源。
该数据源包含了中国所有省、市、县、乡镇等行政区域信息以及对应的编码。
你可以从国家统计局官方网站([)上下载最新版的《中华人民共和国行政区划代码》。
3. 数据处理与存储3.1 数据导入将下载好的《中华人民共和国行政区划代码》文件导入到 Java 程序中进行处理。
一种常见的做法是将该文件转换为 CSV 格式,并使用第三方库(如 Apache Commons CSV)来读取和解析 CSV 文件内容。
以下是一个简单示例,展示了如何使用 Apache Commons CSV 来读取 CSV 文件并将数据存储到内存中:import mons.csv.CSVFormat;import mons.csv.CSVParser;import mons.csv.CSVRecord;import java.io.FileReader;import java.io.IOException;import java.io.Reader;import java.util.ArrayList;import java.util.List;public class CityCodeParser {public static List<City> parseCityCodeCSV(String filePath) throws IOExcept ion {List<City> cities = new ArrayList<>();Reader reader = new FileReader(filePath);CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withHead er());for (CSVRecord csvRecord : csvParser) {String code = csvRecord.get("编码");String name = csvRecord.get("名称");String parentCode = csvRecord.get("上级编码");City city = new City(code, name, parentCode);cities.add(city);}csvParser.close();reader.close();return cities;}}3.2 数据存储可以将解析后的城市编码数据存储到内存中的数据结构(如列表、映射等),以便之后的查询操作。
java解析中国⾏政区域并在页⾯显⽰实现动态逐级筛选⼀、实现⽬标⾸先会有⼀个存放中国⾏政区域数据的⼀个txt⽂件,⽤java读取并解析出来,并在页⾯上通过下拉框的形式展⽰出来。
实现效果如下图,当选择完省份后,在选择该省份下的城市,然后在选择该城市下的县区这样逐级显⽰:⼆、代码实现:1. 先创建⼀个javaBean,⽤来存放基本数据;1public class Area {2private String code ;//⾏政编码3private String name;//名称4private int level;//⾏政级别 0:省/直辖市 1:地级市 2:县级市5private String parentCode;//上⼀级的⾏政区划代码67public Area() {8super();9 }1011public Area(String code, String name, int level, String parentCode) {12super();13this.code = code; = name;15this.level = level;16this.parentCode = parentCode;17 }1819public String getCode() {20return code;21 }2223public void setCode(String code) {24this.code = code;25 }2627public String getName() {28return name;29 }3031public void setName(String name) { = name;33 }3435public int getLevel() {36return level;37 }3839public void setLevel(int level) {40this.level = level;41 }4243public String getParentCode() {44return parentCode;45 }4647public void setParentCode(String parentCode) {48this.parentCode = parentCode;49 }5051public String toString(){52return "⾏政编码:"+this.getCode()+"\t名称:"+this.getName()+"\t⾏政级别:"+53this.getLevel()+"\t上⼀级的⾏政区划代码:" +this.getParentCode();54 }55 }2. 然后创建⼀个读取txt资源⽂件的⼯具类;1import java.io.BufferedReader;2import java.io.File;3import java.io.FileNotFoundException;4import java.io.FileReader;5import java.io.IOException;6import java.util.ArrayList;7import java.util.HashMap;8import java.util.List;9import java.util.Map;1011import com.***.Area;1213public class ReadAreaUtil {1415public List<Area> provinceList = new ArrayList<Area>();16public List<Area> townList = new ArrayList<Area>();17public List<Area> countyList = new ArrayList<Area>();1819public Map<String,List<Area>> getAreaData(String path){20 ReadAllArea(path);21 Map<String,List<Area>> result = new HashMap<String,List<Area>>();22 result.put("provinceList", provinceList);23 result.put("townList", townList);24 result.put("countyList", countyList.subList(1, countyList.size())); //去掉表头2526return result ;27 }2829public void ReadAllArea(String path){30 String line = null;31 BufferedReader reader = null;32 File file = new File(path);3334 String cityCode="";35 String countyCode="";36try {37 FileReader in = new FileReader(file);38 reader = new BufferedReader(in);39//读取⽂件的每⼀⾏40while((line = reader.readLine())!=null){41 String[] data = cutString(line);4243//处理读取的⽂件记录44if(isProvince(data[0])){45 cityCode = data[0];46 Area area = new Area(data[0], data[1], 0, "0");47 provinceList.add(area);48 }else if(isTown(data[0])){49 countyCode =data[0];50 Area area = new Area(data[0], data[1], 1, cityCode);51 townList.add(area);52 }else{53 Area area = new Area(data[0], data[1], 2, countyCode);54 countyList.add(area);55 }56 }57 } catch (FileNotFoundException e) {58 e.printStackTrace();59 } catch (IOException e) {60 e.printStackTrace();61 }finally{62try {63 reader.close();64 } catch (IOException e) {65 e.printStackTrace();66 }67 }68 }6970//字符分割71public String[] cutString(String line){72 String code="";73 String name="";74 code = line.substring(0, 6);75 String lastStr = line.substring(7, line.length());76 name = lastStr.substring(0, lastStr.indexOf("\t"));77 String[] result = new String []{code,name};78return result;79 }8081//判断是否省或者直辖市82public boolean isProvince(String code){83 String last = code.substring(2);84if("0000".equalsIgnoreCase(last)){85return true;86 }87return false;88 }89//判断是否地级市90public boolean isTown(String code){91 String last = code.substring(4);92if("00".equalsIgnoreCase(last)){93return true;94 }95return false;96 }9798 }3. 改项⽬使⽤了struts2,在action的⽅法中调⽤即可:1//读txt数据...2 String path = ServletActionContext.getServletContext().getRealPath("/2015Area.txt");3 Map<String,List<Area>> area = new ReadAreaUtil().getAreaData(path);4 List<Area> provinceList = area.get("provinceList");5 ServletActionContext.getRequest().setAttribute("prlist", provinceList);4. JSP页⾯上的html,第⼀个select是直接遍历的,但是后⾯两个就要根据前⾯select选中的来动态显⽰了,这⾥需要⽤到jQuery的Ajax; 1<div id="areaDiv">2<a >省份:3<select id="sel_province" name="">4<option value="-1">-请选择-</option>5<c:forEach var="pro" items="${prlist }">6<option value="${pro.code }">${ }</option>7</c:forEach>8</select>9</a> 10<a class="wsy_f14">城市/区:11<select id="sel_town" name="">12<option value="-1">-----</option>13</select>14</a> 15<a class="wsy_f14">县级:16<select id="sel_county" name="">17<option value="-1">-----</option>18</select>19</a>20</div>jQuery 代码,select标签变化时触发函数并发送post请求数据;1 $(document).ready(function(){2 $('#sel_province').change(function(){3 var code = $(this).children('option:selected').val();//selected的值4 $.post("${basePath}ajax/filterArea.action",5 {6 parentCode:code,7 areaType:1//0省,1市,2县8 },9 function(data){10 $("#sel_town").html(data);11 });12 });1314 $('#sel_town').change(function(){15 var code = $(this).children('option:selected').val();//selected的值16 $.post("${basePath}ajax/filterArea.action",17 {18 parentCode:code,19 areaType:2//0省,1市,2县20 },21 function(data){22 $("#sel_county").html(data);23 });24 });25 });5. struts如何处理Ajax请求,专门写⼀个action⽤于处理ajax请求;strut.xml:1<?xml version="1.0" encoding="UTF-8" ?>2<!DOCTYPE struts PUBLIC3 "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"4 "/dtds/struts-2.1.dtd">5<struts>6<package name="ajax" namespace="/ajax" extends="json-default">7<action name="filterArea" method="filterArea" class="com.llw.action.AjaxFilter"></action>8</package>9</struts>action:1public class AjaxFilter extends ActionSupport {23//⾏政区域过滤4private String parentCode ;5private int areaType ;6public String getParentCode() {7return parentCode;8 }9public void setParentCode(String parentCode) {10this.parentCode = parentCode;11 }12public int getAreaType() {13return areaType;14 }15public void setAreaType(int areaType) {16this.areaType = areaType;17 }1819public void filterArea(){20 String htmlStr = "<option value=\"-1\">-请选择-</option>" ;2122 String path = ServletActionContext.getServletContext().getRealPath("/2015Area.txt");23 Map<String,List<Area>> area = new ReadAreaUtil().getAreaData(path);24 List<Area> areaList = null ;25if(areaType==1){ //0省,1市,2县26 areaList = area.get("townList");27 }else if(areaType==2){28 areaList = area.get("countyList");29 }30if(areaList!=null && areaList.size()>0 && parentCode!=null){31for(Area a : areaList){32if(parentCode.equals(a.getParentCode())){33 htmlStr += "<option value=\""+a.getCode()+"\">"+a.getName()+"</option>" ;34 }35 }36 }3738// System.out.println("xxxxx"+htmlStr);39 HttpServletResponse response = ServletActionContext.getResponse();40 PrintWriter writer = null;41try {42 writer = response.getWriter();43 } catch (IOException e) {44 e.printStackTrace();45 }46 writer.print(htmlStr);47 writer.flush();48 writer.close();49 }5051 }三、总结:以上基本完成了需要的效果,⽤java读取txt资源⽂件,并封装到List⾥⾯,上⾯代码中把不同级别的数据放到不同的list⾥了,也可以放到同⼀个list⾥⾯,这个根据⾃⼰需要可以去修改;然后是通过Ajax⽅式动态逐级显⽰select展⽰的内容;并演⽰了strut中如何处理ajax请求。
一、概述在地理信息系统(GIS)和位置服务应用中,计算经纬度点之间的距离以及确定一个经纬度点距离区域最近边缘的点是一项常见的任务。
这项任务在实际的导航、地图绘制以及位置服务应用中具有重要意义。
本文将讨论如何使用Java语言来实现计算经纬度点距离区域最近边缘的点的功能。
二、经纬度点之间的距离计算1. 使用Haversine公式计算两个经纬度点之间的距离Haversine公式是一种用于计算两个地球上任意两点(在给定的经度和纬度下)之间的距离的方法。
这个公式基于一种数学变换,将经纬度坐标系下的角度转换为一个球面极坐标系下的二维极坐标系。
2. 在Java中实现Haversine公式在Java中,可以编写一个计算Haversine公式的函数来实现经纬度点之间距离的计算。
该函数接受两个经纬度点的坐标作为输入,并返回它们之间的距离值。
三、确定经纬度点距离区域最近边缘的点1. 使用点到多边形边缘的距离计算方法确定一个经纬度点距离区域最近边缘的点,可以使用点到多边形边缘的距离计算方法。
这个方法首先计算该点到多边形的每条边的距离,然后找到其中距离最近的边。
2. 在Java中实现点到多边形边缘的距离计算在Java中,可以编写一个函数来实现点到多边形边缘的距离计算。
该函数接受一个经纬度点和一个由多个经纬度点组成的多边形作为输入,返回该点距离多边形最近边缘的距离值以及最近边缘上的点的坐标。
四、结论使用Java语言可以很方便地实现计算经纬度点之间的距离以及确定一个经纬度点距离区域最近边缘的点的功能。
这些功能在位置服务应用中具有重要的应用价值,可以帮助用户更好地理解地理位置信息,并提供更加精准的导航和位置服务。
希望本文所介绍的方法能够对相关领域的开发人员有所帮助。
五、应用场景经纬度点距离区域最近边缘的点的计算在实际应用中有许多场景。
下面将介绍一些常见的应用场景:1. 导航应用在导航应用中,计算用户当前位置到最近道路的距离以及确定最近道路上的交叉口或出口位置是至关重要的。
java通过区域编码获取经纬度的方法-回复Java通过区域编码获取经纬度的方法在实际开发中,我们经常会遇到需要通过区域编码获取相应经纬度信息的场景。
这在地理信息系统、定位服务等领域非常常见。
本文将介绍一种使用Java 编程语言实现通过区域编码获取经纬度的方法。
第一步:了解区域编码在开始编写代码之前,我们需要先了解区域编码的基本概念。
区域编码是一种将地理区域划分并进行编号的方法。
常见的区域编码包括中国的行政区划代码(如省、市、县)、世界国家或地区的编码(如ISO 3166)、邮政编码等。
不同的区域编码系统可能有不同的编码格式和规则,我们需要根据具体情况进行相应的处理。
第二步:选择合适的地理编码服务在编写代码之前,我们需要选择一种合适的地理编码服务来获取相应的经纬度信息。
常见的地理编码服务包括高德地图、百度地图、腾讯地图等。
这些地理编码服务都提供了相应的API 接口,我们可以通过调用接口来获取区域的经纬度信息。
以下是使用高德地图地理编码服务获取经纬度的方法示例:javaimport java.io.IOException;import java.util.HashMap;import java.util.Map;import com.alibaba.fastjson.JSONObject;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class GeoCoder {private static final String GEOCODE_URL = "private static final String KEY = "your_api_key";public static Map<String, Double> getLatLngByRegionCode(String regionCode) throws IOException { OkHttpClient client = new OkHttpClient();String url = GEOCODE_URL + "?key=" + KEY +"&address=" + regionCode;Request request = new Request.Builder().url(url).build();Response response = client.newCall(request).execute();String jsonString = response.body().string();JSONObject json =JSONObject.parseObject(jsonString);String status = json.getString("status");if (status.equals("1")) {String location = json.getJSONObject("geocodes").getJSONObject(0).getString("location");String[] latLng = location.split(",");Map<String, Double> result = new HashMap<>();result.put("latitude",Double.parseDouble(latLng[1]));result.put("longitude",Double.parseDouble(latLng[0]));return result;} else {throw new IOException("Failed to get latitude and longitude: " + json.getString("info"));}}public static void main(String[] args) {try {Map<String, Double> latLng = getLatLngByRegionCode("广东省广州市");System.out.println("Latitude: " +latLng.get("latitude"));System.out.println("Longitude: " +latLng.get("longitude"));} catch (IOException e) {e.printStackTrace();}}}以上代码通过向高德地图的地理编码API 发送HTTP 请求,获取到相应的经纬度信息。
Java数据转化为经纬度的方法一、背景介绍在开发过程中,经常会遇到需要将Java中的数据转化为经纬度的需求。
例如,在地图应用中,我们可能需要将某个地点的名称或地址转化为经纬度坐标,以便进行地图标记或路径规划等操作。
本文将详细介绍如何使用Java来实现这一功能。
二、使用Geocoding API实现地址转经纬度1. Geocoding API简介Google提供了一个强大的Geocoding API,可以将地址或地名转化为经纬度坐标。
我们可以通过Java代码调用该API,并解析返回的JSON数据得到经纬度信息。
2. 引入相关依赖库在使用Geocoding API之前,我们需要先引入相应的依赖库。
可以使用Maven或Gradle来管理依赖。
以下是一个使用Maven的示例:<dependency><groupId>com.google.maps</groupId><artifactId>google-maps-services</artifactId><version>0.2.11</version></dependency>3. 编写Java代码下面是一个简单的示例代码,演示如何使用Geocoding API将地址转化为经纬度:import com.google.maps.*;import com.google.maps.errors.ApiException;import com.google.maps.model.GeocodingResult;public class GeocodingExample {public static void main(String[] args) {GeoApiContext context = new GeoApiContext.Builder().apiKey("your_api_key").build();GeocodingResult[] results = null;try {results = GeocodingApi.geocode(context,"1600 Amphitheatre Parkway, Mountain View, CA 94043").awai t();} catch (ApiException | InterruptedException | IOException e) {e.printStackTrace();}if (results != null && results.length > 0) {double lat = results[0]t;double lng = results[0].geometry.location.lng;System.out.println("Latitude: " + lat);System.out.println("Longitude: " + lng);}}}在上述代码中,我们首先创建了一个GeoApiContext对象,并传入了我们获取到的API密钥。
提取⾏政区边界经纬度坐标(⾼德+百度)前⾔近来由于⼯作需要,需要提取某些城市的经纬度坐标,稍微搜索了⼀下,发现百度地图和⾼德地图都提供了相关的函数和例⼦.那么剩余的⼯作也就⽐较简单了,保存坐标,然后转换为WGS坐标,这样才能和现有的GPS数据以及地图匹配.主要问题和解决⽅法本地保存⽂件跨浏览器⽀持由于安全的原因,JavaScript本地保存⽂件的⽅式通常都只有IE⽀持的ActiveXObject/Open⽅法,每次都要提⽰不安全和允许运⾏,⾮常⿇烦.好在其他浏览器⽬前都⽀持<a>标签实现⽂件下载的⽅法.经测试最新的Google Chrome, Mozilla Firefox,百度浏览器,360浏览器下都可以运⾏.不说废话,直接上代码:function Download() {// IEif(/msie/i.test(erAgent)) {var w = window.open("", "导出", "height=0,width=0,toolbar=no,menubar=no,scrollbars=no,resizable=on,location=no,status=no");var filename = document.getElementById("filename").value ;var content = document.getElementById("content").value;w.document.charset = "UTF-8";w.document.write(content);w.document.execCommand("SaveAs", false, filename+'.txt');w.close();}// Firefox/Chrome/Safari/Operaelse {var filename = document.getElementById("filename").value ;var content = document.getElementById("content").value;str = encodeURIComponent(content);document.getElementById("SaveChrome").download = filename+'.txt';var aLink = document.getElementById("SaveChrome") ;aLink.href = "data:text/csv;charset=utf-8,"+str;aLink.click();}}跨浏览器保存⽂件经纬度转换这个话题感兴趣的朋友可以⾃⼰搜索⽕星坐标相关转换,精度在1m范围的⽹上提供有服务可以免费使⽤.⾃写程序经验证精度在6m 以内.百度地图⽅法关键函数是 BMap.Boundary() ⽣成的类,调⽤它的⽅法get就可以通过名称获得县或市级以上的⾏政区域.function getBoundary() {var bdary = new BMap.Boundary();var name = document.getElementById("districtName").value;bdary.get(name, function (rs) { //获取⾏政区域var fileName = "";var newFileObject = fso.CreateTextFile(folderName + "\\" + name + ".txt", true);map.clearOverlays(); //清除地图覆盖物var count = rs.boundaries.length; //⾏政区域的点有多少个for (var i = 0; i < count; i++) {var ply = new BMap.Polygon(rs.boundaries[i], { strokeWeight: 2, strokeColor: "#ff0000" }); //建⽴多边形覆盖物map.addOverlay(ply); //添加覆盖物map.setViewport(ply.getPath()); //调整视野}newFileObject.write(rs.boundaries[0]);newFileObject.Close();});}百度提取⽅法⾼德地图关键代码通过阅读⽰例⽂件可以发现在下拉列表返回⾥⾯有边界值的出现.amapAdcode.search = function(adcodeLevel, keyword, selectId) {//查询⾏政区划列表并⽣成相应的下拉列表var me = this;if (adcodeLevel == 'district'||adcodeLevel == 'city') {//第三级时查询边界点this._district.setExtensions('all');} else {this._district.setExtensions('base');}this._district.setLevel(adcodeLevel); //⾏政区级别this._district.search(keyword, function(status, result) {//注意,api返回的格式不统⼀,在下⾯⽤三个条件分别处理var districtData = result.districtList[0];if (districtData.districtList) {me.createSelectList(selectId, districtData.districtList);} else if (districtData.districts) {me.createSelectList(selectId, districtData.districts);} else {document.getElementById(selectId).innerHTML = '';}map.setCenter(districtData.center);me.clearMap();me.addPolygon(districtData.boundaries);⾼德提取⽅法其中的districtData.boundaries 就是我们需要的.调试了⼀下,⼤胆猜测果然是实现了Tostring() ⽅法的⼀个对象."104.639106,26.863388,104.644771,26.861842,104.64767,26.854997,104.647748..." 很明显的就是我们需要的gcj坐标.总结⾄此,基本也就没有什么问题了,剩余的⼯作就是解析得到的⽂件.需要提取全国的数据也就是循环读取全国城市列表⽂件了.(通常搜索cityname,电脑⾥⾯都会找到的,原因,呵呵,猜测是迅雷,QQ之类的IP定位需要吧.)重要的⼀点,推荐使⽤⾼德地图,原因就是百度地图得到的⾏政规划有问题,不包含县级市.最典型的就是贵州省,很多地市都是分离的,是带岛或洞的复杂多边形.百度在这⾥完败.关于怎么处理这⾥复杂的多边形以⽀持在MapWinGIS显⽰和处理,下次会写⼀篇笔记.。
Java根据百度经纬度(坐标)获取中国街道、街道编码做同步第三⽅数据项⽬的时候,其中就有百度经纬度、街道字段,已知的是百度经纬度,只需要知道街道、街道⾏政编码即可。
第⼆步:稍作改动,再根据已经写好的http⼯具类进⾏改动/**** @param lat* @param lon* @return*/private JSONObject getTownByLonAndLat(String lat,String lon){Map<String,String> map = getMap();//参数map.put("ak", "SfrwGH7INvjPq7BwCrYrioBQZm9XXxrR");//申请百度开放平台KEY(ak)map.put("output", "json");// 输出Json数据map.put("extensions_town", "true");// ⾏政区划返回乡镇级数据(town),仅国内召回乡镇数据map.put("coordtype", "wgs84ll"); // GPS 经纬度类型map.put("location", lat+","+lon+"");//百度经纬度String url = "/reverse_geocoding/v3/";List<Header> headers = new ArrayList<>();//headerString str = HttpUtil.getResult(url,map,headers);JSONObject jsonObject = JSONObject.parseObject(str);return jsonObject.getJSONObject("result").getJSONObject("addressComponent");}HttpUtil http⼯具⽅法/*** get请求** @param url 请求地址* @param map 参数集* @return String*/public static String getResult(String url, Map<String, String> map, List<Header> headers) {String entityStr = null;try {entityStr = getRequestMethod(map, url, HttpGet.METHOD_NAME, headers);} catch (IOException e) {log.error("IO异常");e.printStackTrace();}return entityStr;}/*** 获取请求结果** @param map 参数集* @param url 请求地址* @param method 请求⽅式* @return String* @throws IOException*/public static String getRequestMethod(Map<String, String> map, String url, String method, List<Header> headers) throws IOException {List<NameValuePair> params = new ArrayList<>(4);Set<Map.Entry<String, String>> entrySet = map.entrySet();for (Map.Entry<String, String> e : entrySet) {String name = e.getKey();String value = e.getValue();NameValuePair pair = new BasicNameValuePair(name, value);params.add(pair);}HttpClient client = getConnection();HttpResponse response = client.execute(getRequestMethod(params, url, method, headers));if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();return EntityUtils.toString(entity, StandardCharsets.UTF_8);} else {log.error("请求失败 {}", url);}HttpEntity entity = response.getEntity();return EntityUtils.toString(entity, StandardCharsets.UTF_8); }。
竭诚为您提供优质文档/双击可除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;。