高德地图百度地图坐标相互转换

2018-04-11  本文已影响0人  F_Young

/ **

*百度坐标(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 ]);

返回 wgs​​84;

}

/ **

* WGS坐标转百度坐标系(BD-09)

*

* @param lng WGS84坐标系的经度

* @param lat WGS84坐标系的纬度

* @return百度坐标数组

* /

public static double [] wgs​​84tobd09(double lng,double lat){

double [] gcj = wgs​​84togcj02(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 [] 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;

双重魔法= 数学。罪(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 [] {m​​glng,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 ;

}

}

上一篇下一篇

猜你喜欢

热点阅读