经纬度坐标系转换 http://blog.csdn.net/ma969070578/article/details/41013547

来源:互联网 发布:淘宝买家秀的福利网站 编辑:程序博客网 时间:2024/06/14 19:31

WGS84,GCJ02, BD09坐标转换

32696人阅读 评论(11)收藏举报
本文章已收录于:
分类:
作者同类文章X
    作者同类文章X
    • 关于百度地图 java.lang.NoSuchMethodError: com.baidu.location.BDLocation.getAddress
    • at com.baidu.mapapi.map.BaiduMap.clear(Unknown Source)
    • JSP 火星坐标及GPS坐标 转百度坐标
    • 坐标转换 搜狗与实际经纬度工具类
    [java] view plain copy
    print?在CODE上查看代码片派生到我的代码片
    1. public class Gps {  
    2.   
    3.     private double wgLat;  
    4.     private double wgLon;  
    5.   
    6.     public Gps(double wgLat, double wgLon) {  
    7.         setWgLat(wgLat);  
    8.         setWgLon(wgLon);  
    9.     }  
    10.   
    11.     public double getWgLat() {  
    12.         return wgLat;  
    13.     }  
    14.   
    15.     public void setWgLat(double wgLat) {  
    16.         this.wgLat = wgLat;  
    17.     }  
    18.   
    19.     public double getWgLon() {  
    20.         return wgLon;  
    21.     }  
    22.   
    23.     public void setWgLon(double wgLon) {  
    24.         this.wgLon = wgLon;  
    25.     }  
    26.   
    27.     @Override  
    28.     public String toString() {  
    29.         return wgLat + "," + wgLon;  
    30.     }  
    31. }  




    [java] view plain copy
    print?在CODE上查看代码片派生到我的代码片
    1. /** 
    2.  * 各地图API坐标系统比较与转换; 
    3.  * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, 
    4.  * 谷歌地图采用的是WGS84地理坐标系(中国范围除外); 
    5.  * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。 
    6.  * 谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系; BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系; 
    7.  * 搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的。 chenhua 
    8.  */  
    9. public class PositionUtil {  
    10.       
    11.     public static final String BAIDU_LBS_TYPE = "bd09ll";  
    12.       
    13.     public static double pi = 3.1415926535897932384626;  
    14.     public static double a = 6378245.0;  
    15.     public static double ee = 0.00669342162296594323;  
    16.   
    17.     /** 
    18.      * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System 
    19.      *  
    20.      * @param lat 
    21.      * @param lon 
    22.      * @return 
    23.      */  
    24.     public static Gps gps84_To_Gcj02(double lat, double lon) {  
    25.         if (outOfChina(lat, lon)) {  
    26.             return null;  
    27.         }  
    28.         double dLat = transformLat(lon - 105.0, lat - 35.0);  
    29.         double dLon = transformLon(lon - 105.0, lat - 35.0);  
    30.         double radLat = lat / 180.0 * pi;  
    31.         double magic = Math.sin(radLat);  
    32.         magic = 1 - ee * magic * magic;  
    33.         double sqrtMagic = Math.sqrt(magic);  
    34.         dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);  
    35.         dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  
    36.         double mgLat = lat + dLat;  
    37.         double mgLon = lon + dLon;  
    38.         return new Gps(mgLat, mgLon);  
    39.     }  
    40.   
    41.     /** 
    42.      * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return 
    43.      * */  
    44.     public static Gps gcj_To_Gps84(double lat, double lon) {  
    45.         Gps gps = transform(lat, lon);  
    46.         double lontitude = lon * 2 - gps.getWgLon();  
    47.         double latitude = lat * 2 - gps.getWgLat();  
    48.         return new Gps(latitude, lontitude);  
    49.     }  
    50.   
    51.     /** 
    52.      * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 
    53.      *  
    54.      * @param gg_lat 
    55.      * @param gg_lon 
    56.      */  
    57.     public static Gps gcj02_To_Bd09(double gg_lat, double gg_lon) {  
    58.         double x = gg_lon, y = gg_lat;  
    59.         double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi);  
    60.         double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi);  
    61.         double bd_lon = z * Math.cos(theta) + 0.0065;  
    62.         double bd_lat = z * Math.sin(theta) + 0.006;  
    63.         return new Gps(bd_lat, bd_lon);  
    64.     }  
    65.   
    66.     /** 
    67.      * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param 
    68.      * bd_lat * @param bd_lon * @return 
    69.      */  
    70.     public static Gps bd09_To_Gcj02(double bd_lat, double bd_lon) {  
    71.         double x = bd_lon - 0.0065, y = bd_lat - 0.006;  
    72.         double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi);  
    73.         double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi);  
    74.         double gg_lon = z * Math.cos(theta);  
    75.         double gg_lat = z * Math.sin(theta);  
    76.         return new Gps(gg_lat, gg_lon);  
    77.     }  
    78.   
    79.     /** 
    80.      * (BD-09)-->84 
    81.      * @param bd_lat 
    82.      * @param bd_lon 
    83.      * @return 
    84.      */  
    85.     public static Gps bd09_To_Gps84(double bd_lat, double bd_lon) {  
    86.   
    87.         Gps gcj02 = PositionUtil.bd09_To_Gcj02(bd_lat, bd_lon);  
    88.         Gps map84 = PositionUtil.gcj_To_Gps84(gcj02.getWgLat(),  
    89.                 gcj02.getWgLon());  
    90.         return map84;  
    91.   
    92.     }  
    93.   
    94.     public static boolean outOfChina(double lat, double lon) {  
    95.         if (lon < 72.004 || lon > 137.8347)  
    96.             return true;  
    97.         if (lat < 0.8293 || lat > 55.8271)  
    98.             return true;  
    99.         return false;  
    100.     }  
    101.   
    102.     public static Gps transform(double lat, double lon) {  
    103.         if (outOfChina(lat, lon)) {  
    104.             return new Gps(lat, lon);  
    105.         }  
    106.         double dLat = transformLat(lon - 105.0, lat - 35.0);  
    107.         double dLon = transformLon(lon - 105.0, lat - 35.0);  
    108.         double radLat = lat / 180.0 * pi;  
    109.         double magic = Math.sin(radLat);  
    110.         magic = 1 - ee * magic * magic;  
    111.         double sqrtMagic = Math.sqrt(magic);  
    112.         dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);  
    113.         dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  
    114.         double mgLat = lat + dLat;  
    115.         double mgLon = lon + dLon;  
    116.         return new Gps(mgLat, mgLon);  
    117.     }  
    118.   
    119.     public static double transformLat(double x, double y) {  
    120.         double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y  
    121.                 + 0.2 * Math.sqrt(Math.abs(x));  
    122.         ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;  
    123.         ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;  
    124.         ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;  
    125.         return ret;  
    126.     }  
    127.   
    128.     public static double transformLon(double x, double y) {  
    129.         double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1  
    130.                 * Math.sqrt(Math.abs(x));  
    131.         ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;  
    132.         ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;  
    133.         ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0  
    134.                 * pi)) * 2.0 / 3.0;  
    135.         return ret;  
    136.     }  
    137.   
    138.     public static void main(String[] args) {  
    139.   
    140.         // 北斗芯片获取的经纬度为WGS84地理坐标 31.426896,119.496145  
    141.         Gps gps = new Gps(31.426896119.496145);  
    142.         System.out.println("gps :" + gps);  
    143.         Gps gcj = gps84_To_Gcj02(gps.getWgLat(), gps.getWgLon());  
    144.         System.out.println("gcj :" + gcj);  
    145.         Gps star = gcj_To_Gps84(gcj.getWgLat(), gcj.getWgLon());  
    146.         System.out.println("star:" + star);  
    147.         Gps bd = gcj02_To_Bd09(gcj.getWgLat(), gcj.getWgLon());  
    148.         System.out.println("bd  :" + bd);  
    149.         Gps gcj2 = bd09_To_Gcj02(bd.getWgLat(), bd.getWgLon());  
    150.         System.out.println("gcj :" + gcj2);  
    151.     }  
    152. }  




    10
    0
     
     

    我的同类文章

    http://blog.csdn.net
    • 谈谈java中的WeakReference2017-03-21
    • 微信开放平台-管理中心-应用删除2015-06-10
    • Java并发编程:Callable、Future和FutureTask2015-06-09
    • 接口汇总2015-03-12
    • 面向对象设计的SOLID原则2015-03-05
    • Android Studio关联SVN相关操作2016-03-18
    • java.util.concurrent.locks.LockSupport2015-06-09
    • JAVA定时器 配置org.springframework.scheduling.quartz.CronTriggerBean2015-05-11
    • Eclipse中10个最有用的快捷键组合2015-03-05
    • Java 时间格式化2014-08-08
    更多文章
    0 0
    原创粉丝点击