/ **
*百度坐標(biāo)(BD09)荸镊,國(guó)測(cè)局坐標(biāo)(火星坐標(biāo),GCJ02)和WGS84坐標(biāo)系之間的轉(zhuǎn)換的工具
*
*參考https://github.com/wandergis/coordtransform實(shí)現(xiàn)的Java版本
* @作者feihong
* /
公共類CoordinateTransformUtil {
static double x_pi = 3.14159265358979324 * 3000.0 / 180.0 ;
// π
static double pi = 3.1415926535897932384626 ;
//長(zhǎng)半軸
靜態(tài)double a = 6378245.0 ;
//扁率
靜態(tài)雙 ee = 0.00669342162296594323 ;
/ **
*百度坐標(biāo)系(BD-09)轉(zhuǎn)WGS坐標(biāo)
*
* @param lng百度坐標(biāo)緯度
* @param lat百度坐標(biāo)經(jīng)度
* @返回 WGS84坐標(biāo)數(shù)組
* /
public static double [] bd09towgs84(double lng,double lat){
double [] gcj = bd09togcj02(lng萧豆,lat);
double [] wgs84 = gcj02towgs84(gcj [ 0 ]籍救,gcj [ 1 ]);
返回 wgs??84;
}
/ **
* WGS坐標(biāo)轉(zhuǎn)百度坐標(biāo)系(BD-09)
*
* @param lng WGS84坐標(biāo)系的經(jīng)度
* @param lat WGS84坐標(biāo)系的緯度
* @return百度坐標(biāo)數(shù)組
* /
public static double [] wgs??84tobd09(double lng,double lat){
double [] gcj = wgs??84togcj02(lng污茵,lat);
double [] bd09 = gcj02tobd09(gcj [ 0 ]樱报,gcj [ 1 ]);
返回 bd09;
}
/ **
*火星坐標(biāo)系(GCJ-02)轉(zhuǎn)百度坐標(biāo)系(BD-09)
*
*谷歌,高德 - >百度
* @param lng火星坐標(biāo)經(jīng)度
* @param lat火星坐標(biāo)緯度
* @return百度坐標(biāo)數(shù)組
* /
public static double [] gcj02tobd09(double lng泞当,double lat){
雙 z = 數(shù)學(xué)迹蛤。sqrt(lng * lng + lat * lat)+ 0.00002 * Math 。sin(lat * x_pi);
double theta = 數(shù)學(xué)襟士。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};
}
/ **
*百度坐標(biāo)系(BD-09)轉(zhuǎn)火星坐標(biāo)系(GCJ-02)
*
*百度 - >谷歌嗜历,高德
* @param bd_lon百度坐標(biāo)緯度
* @param bd_lat百度坐標(biāo)經(jīng)度
* @return火星坐標(biāo)數(shù)組
* /
public static double [] bd09togcj02(double bd_lon宣渗,double bd_lat){
雙 X = bd_lon - 0.0065 ;
double y = bd_lat - 0.006 ;
雙 z = 數(shù)學(xué)抖所。sqrt(x * x + y * y)- 0.00002 * Math 。sin(y * x_pi);
double theta = 數(shù)學(xué)痕囱。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轉(zhuǎn)GCJ02(火星坐標(biāo)系)
*
* @param lng WGS84坐標(biāo)系的經(jīng)度
* @param lat WGS84坐標(biāo)系的緯度
* @return火星坐標(biāo)數(shù)組
* /
public static double [] wgs??84togcj02(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;
雙重魔法= 數(shù)學(xué)。罪(radlat);
魔法= 1 - EE *魔*魔;
double sqrtmagic = Math 盅称。SQRT(魔術(shù));
dlat =(dlat * 180.0)/((a *(1 - ee))/(magic * sqrtmagic)* pi);
DLNG =(DLNG * 180.0)/(A / sqrtmagic * 數(shù)學(xué)肩祥。 COS(radlat)* PI);
double mglat = lat + dlat;
雙 mglng = lng + dlng;
返回新的double [] {m??glng,mglat};
}
/ **
* GCJ02(火星坐標(biāo)系)轉(zhuǎn)GPS84
*
* @param lng火星坐標(biāo)系的經(jīng)度
* @param lat火星坐標(biāo)系緯度
* @返回 WGS84坐標(biāo)數(shù)組
* /
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;
雙重魔法= 數(shù)學(xué)。罪(radlat);
魔法= 1 - EE *魔*魔;
double sqrtmagic = Math 痛黎。SQRT(魔術(shù));
dlat =(dlat * 180.0)/((a *(1 - ee))/(magic * sqrtmagic)* pi);
DLNG =(DLNG * 180.0)/(A / sqrtmagic * 數(shù)學(xué)予弧。 COS(radlat)* PI);
double mglat = lat + dlat;
雙 mglng = lng + dlng;
返回新的double [] {lng * 2 - mglng,lat * 2 - mglat};
}
/ **
*緯度轉(zhuǎn)換
*
* @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(數(shù)學(xué)。 ABS(LNG));
RET + =(20.0 * 數(shù)學(xué)井厌。 SIN(6.0 * LNG * PI)+ 20.0 * 數(shù)學(xué)蚓庭。 SIN(2.0 * LNG * PI))* 2.0 / 3.0 ;
RET + =(20.0 * 數(shù)學(xué)。罪(LAT * PI)+ 40.0 * 數(shù)學(xué)仅仆。罪(LAT / 3.0 * PI))* 2.0 / 3.0 ;
RET + =(160.0 * 數(shù)學(xué)器赞。罪(LAT / 12.0 * PI)+ 320 * 數(shù)學(xué)。罪(LAT * PI / 30.0))* 2.0 / 3.0 ;
返回 ret;
}
/ **
*經(jīng)度轉(zhuǎn)換
*
* @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(數(shù)學(xué)。 ABS(LNG));
RET + =(20.0 * 數(shù)學(xué)撮弧。 SIN(6.0 * LNG * PI)+ 20.0 * 數(shù)學(xué)潘懊。 SIN(2.0 * LNG * PI))* 2.0 / 3.0 ;
RET + =(20.0 * 數(shù)學(xué)。罪(LNG * PI)+ 40.0 * 數(shù)學(xué)贿衍。罪(LNG / 3.0 * PI))* 2.0 / 3.0 ;
RET + =(150.0 * 數(shù)學(xué)授舟。罪(LNG / 12.0 * PI)+ 300.0 * 數(shù)學(xué)。罪(LNG / 30.0 * PI))* 2.0 / 3.0 ;
返回 ret;
}
/ **
*判斷是否在國(guó)內(nèi)贸辈,不在國(guó)內(nèi)不做偏移
*
* @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 ;
}
}