美文网首页
高德地图百度地图坐标相互转换

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

作者: F_Young | 来源:发表于2018-04-11 13:42 被阅读0次

    / **

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

    }

    }

    相关文章

      网友评论

          本文标题:高德地图百度地图坐标相互转换

          本文链接:https://www.haomeiwen.com/subject/pawahftx.html