/ **
*百度坐标(BD09),国测局坐标(火星坐标,GCJ02)和WGS84坐标系之间的转换的工具
*
*参考https://github.com/wandergis/coordtransform实现的Java版本
* @作者feihong
* /
公共类CoordinateTransformUtil {
static double x_pi = 3.14159265358979324 * 3000.0 / 180.0 ;
// π
static double pi = 3.1415926535897932384626 ;
//长半轴
静态double a = 6378245.0 ;
//扁率
静态双 ee = 0.00669342162296594323 ;
/ **
*百度坐标系(BD-09)转WGS坐标
*
* @param lng百度坐标纬度
* @param lat百度坐标经度
* @返回 WGS84坐标数组
* /
public static double [] bd09towgs84(double lng,double lat){
double [] gcj = bd09togcj02(lng,lat);
double [] wgs84 = gcj02towgs84(gcj [ 0 ],gcj [ 1 ]);
返回 wgs84;
}
/ **
* WGS坐标转百度坐标系(BD-09)
*
* @param lng WGS84坐标系的经度
* @param lat WGS84坐标系的纬度
* @return百度坐标数组
* /
public static double [] wgs84tobd09(double lng,double lat){
double [] gcj = wgs84togcj02(lng,lat);
double [] bd09 = gcj02tobd09(gcj [ 0 ],gcj [ 1 ]);
返回 bd09;
}
/ **
*火星坐标系(GCJ-02)转百度坐标系(BD-09)
*
*谷歌,高德 - >百度
* @param lng火星坐标经度
* @param lat火星坐标纬度
* @return百度坐标数组
* /
public static double [] gcj02tobd09(double lng,double lat){
双 z = 数学。sqrt(lng * lng + lat * lat)+ 0.00002 * Math 。sin(lat * x_pi);
double theta = 数学。atan2(lat,lng)+ 0.000003 * Math 。cos(lng * x_pi);
double bd_lng = z * Math 。cos(θ)+ 0.0065 ;
double bd_lat = z * Math 。罪(THETA)+ 0.006 ;
返回新的double [] {bd_lng,bd_lat};
}
/ **
*百度坐标系(BD-09)转火星坐标系(GCJ-02)
*
*百度 - >谷歌,高德
* @param bd_lon百度坐标纬度
* @param bd_lat百度坐标经度
* @return火星坐标数组
* /
public static double [] bd09togcj02(double bd_lon,double bd_lat){
双 X = bd_lon - 0.0065 ;
double y = bd_lat - 0.006 ;
双 z = 数学。sqrt(x * x + y * y)- 0.00002 * Math 。sin(y * x_pi);
double theta = 数学。atan2(y,x)- 0.000003 * Math 。cos(x * x_pi);
double gg_lng = z * Math 。COS(THETA);
double gg_lat = z * Math 。罪(THETA);
返回新的double [] {gg_lng,gg_lat};
}
/ **
* WGS84转GCJ02(火星坐标系)
*
* @param lng WGS84坐标系的经度
* @param lat WGS84坐标系的纬度
* @return火星坐标数组
* /
public static double [] wgs84togcj02(double lng,double lat){
if(out_of_china(lng,lat)){
返回新的double [] {lng,lat};
}
double dlat = transformlat(lng - 105.0,lat - 35.0);
double dlng = transformlng(lng - 105.0,lat - 35.0);
double radlat = lat / 180.0 * pi;
双重魔法= 数学。罪(radlat);
魔法= 1 - EE *魔*魔;
double sqrtmagic = Math 。SQRT(魔术);
dlat =(dlat * 180.0)/((a *(1 - ee))/(magic * sqrtmagic)* pi);
DLNG =(DLNG * 180.0)/(A / sqrtmagic * 数学。 COS(radlat)* PI);
double mglat = lat + dlat;
双 mglng = lng + dlng;
返回新的double [] {mglng,mglat};
}
/ **
* GCJ02(火星坐标系)转GPS84
*
* @param lng火星坐标系的经度
* @param lat火星坐标系纬度
* @返回 WGS84坐标数组
* /
public static double [] gcj02towgs84(double lng,double lat){
if(out_of_china(lng,lat)){
返回新的double [] {lng,lat};
}
double dlat = transformlat(lng - 105.0,lat - 35.0);
double dlng = transformlng(lng - 105.0,lat - 35.0);
double radlat = lat / 180.0 * pi;
双重魔法= 数学。罪(radlat);
魔法= 1 - EE *魔*魔;
double sqrtmagic = Math 。SQRT(魔术);
dlat =(dlat * 180.0)/((a *(1 - ee))/(magic * sqrtmagic)* pi);
DLNG =(DLNG * 180.0)/(A / sqrtmagic * 数学。 COS(radlat)* PI);
double mglat = lat + dlat;
双 mglng = lng + dlng;
返回新的double [] {lng * 2 - mglng,lat * 2 - mglat};
}
/ **
*纬度转换
*
* @param lng
* @param lat
* @返回
* /
public static double transformlat(double lng,double lat){
double ret = - 100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math 。SQRT(数学。 ABS(LNG));
RET + =(20.0 * 数学。 SIN(6.0 * LNG * PI)+ 20.0 * 数学。 SIN(2.0 * LNG * PI))* 2.0 / 3.0 ;
RET + =(20.0 * 数学。罪(LAT * PI)+ 40.0 * 数学。罪(LAT / 3.0 * PI))* 2.0 / 3.0 ;
RET + =(160.0 * 数学。罪(LAT / 12.0 * PI)+ 320 * 数学。罪(LAT * PI / 30.0))* 2.0 / 3.0 ;
返回 ret;
}
/ **
*经度转换
*
* @param lng
* @param lat
* @返回
* /
public static double transformlng(double lng,double lat){
double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math 。SQRT(数学。 ABS(LNG));
RET + =(20.0 * 数学。 SIN(6.0 * LNG * PI)+ 20.0 * 数学。 SIN(2.0 * LNG * PI))* 2.0 / 3.0 ;
RET + =(20.0 * 数学。罪(LNG * PI)+ 40.0 * 数学。罪(LNG / 3.0 * PI))* 2.0 / 3.0 ;
RET + =(150.0 * 数学。罪(LNG / 12.0 * PI)+ 300.0 * 数学。罪(LNG / 30.0 * PI))* 2.0 / 3.0 ;
返回 ret;
}
/ **
*判断是否在国内,不在国内不做偏移
*
* @param lng
* @param lat
* @返回
* /
public static boolean out_of_china(double lng,double lat){
如果(lng < 72.004 || lng > 137.8347){
返回true ;
} else if(lat < 0.8293 || lat > 55.8271){
返回true ;
}
返回false ;
}
}