public class Gps {
private double wgLat;
private double wgLon;
public Gps(double wgLat, double wgLon) {
setWgLat(wgLat);
setWgLon(wgLon);
}
public double getWgLat() {
return wgLat;
}
public void setWgLat(double wgLat) {
this.wgLat = wgLat;
}
public double getWgLon() {
return wgLon;
}
public void setWgLon(double wgLon) {
this.wgLon = wgLon;
}
@Override
public String toString() {
return wgLat + "," + wgLon;
}
}
  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 =  - ee * magic * magic;
 33         double sqrtMagic = Math.sqrt(magic);
 34         dLat = (dLat * 180.0) / ((a * ( - 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 *  - gps.getWgLon();
 47         double latitude = lat *  - 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;
     }
 
     public static Gps transform(double lat, double lon) {
         if (outOfChina(lat, lon)) {
             return new Gps(lat, lon);
         }
         double dLat = transformLat(lon - 105.0, lat - 35.0);
         double dLon = transformLon(lon - 105.0, lat - 35.0);
         double radLat = lat / 180.0 * pi;
         double magic = Math.sin(radLat);
         magic =  - ee * magic * magic;
         double sqrtMagic = Math.sqrt(magic);
         dLat = (dLat * 180.0) / ((a * ( - ee)) / (magic * sqrtMagic) * pi);
         dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
         double mgLat = lat + dLat;
         double mgLon = lon + dLon;
         return new Gps(mgLat, mgLon);
     }
 
     public static double transformLat(double x, double y) {
         double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
                 + 0.2 * Math.sqrt(Math.abs(x));
         ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
         ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
         ret += (160.0 * Math.sin(y / 12.0 * pi) +  * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
         return ret;
     }
 
     public static double transformLon(double x, double y) {
         double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
                 * Math.sqrt(Math.abs(x));
         ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
         ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
         ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0
                 * pi)) * 2.0 / 3.0;
         return ret;
     }
 
     public static void main(String[] args) {
 
         // 北斗芯片获取的经纬度为WGS84地理坐标 31.426896,119.496145
         Gps gps = new Gps(31.426896, 119.496145);
         System.out.println("gps :" + gps);
         Gps gcj = gps84_To_Gcj02(gps.getWgLat(), gps.getWgLon());
         System.out.println("gcj :" + gcj);
         Gps star = gcj_To_Gps84(gcj.getWgLat(), gcj.getWgLon());
         System.out.println("star:" + star);
         Gps bd = gcj02_To_Bd09(gcj.getWgLat(), gcj.getWgLon());
         System.out.println("bd  :" + bd);
         Gps gcj2 = bd09_To_Gcj02(bd.getWgLat(), bd.getWgLon());
         System.out.println("gcj :" + gcj2);
     }

152 }

WGS84,GCJ02, BD09坐标转换的更多相关文章

  1. GIS坐标系测绘原理:大地水准面/基准面/参考椭球体/EPSG/SRI/WKT

    预热文章系列:<GIS历史概述与WebGis应用开发技术浅解>.<GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换>.<OGC标准WMTS ...

  2. BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换

    BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换 http://www.cnphp6.com/archives/24822 by root ⋅ Leave a ...

  3. 坐标转换——GCJ-02

    WGS84(World Geodetic System 1984),是为GPS 全球定位系统 使用而建立的坐标系统GCJ-02,我国在WGS84的基础上加密得到BD-09,百度坐标在GCJ-02基础上 ...

  4. wgs84坐标系与gcj02坐标系转换误差分布图 | Mapping the Error in Transformation between WGS84 and GCJ02 Coordinations

    国际上通用的是wgs84坐标系,而我国对于境内的坐标进行了加密,采用了gcj02坐标系,或者称为火星坐标系.亢孟军老师带的一门课<多媒体电子地图设计>要求我们从wgs84坐标系转换为gcj ...

  5. java中WGS84坐标(ios)转换BD-09坐标(百度坐标)

    iPhone的GPS定位(CLLocationManager)获得的经纬坐标是基于WGS-84坐标系(世界标准),Google地图使用的是GCJ-02坐标系(中国特色的火星坐标系),百度的经纬坐标在G ...

  6. 简谈百度坐标反转至WGS84的三种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...

  7. 各类坐标系相互之间的转换(84互转GC02,GC02互转BD09)

    在遥感行业我们经常会用到各类的坐标系相互之间的转换,常见的度分秒转化为度很简单,直接上代码: //经纬度 ////118度48分54.152秒=118+(48/60)+(54.152/3600)=11 ...

  8. 【PHP版】火星坐标系 (GCJ-02) 与百度坐标系 (BD-09ll)转换算法

    首先感谢java版作者@宋宋宋伟,java版我是看http://blog.csdn.net/coolypf/article/details/8569813 然后根据java代码修改成了php代码. & ...

  9. 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换

    [摘 要] 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤. [关键词] ArcGIS 坐标转换 投影变换 1 坐标转换 ...

随机推荐

  1. 【CTF杂项】常见文件文件头文件尾格式总结及各类文件头

    文件头文件尾总结 JPEG (jpg), 文件头:FFD8FF 文件尾:FF D9PNG (png), 文件头:89504E47 文件尾:AE 42 60 82GIF (gif), 文件头:47494 ...

  2. 5238-整数校验器-洛谷3月赛gg祭

    传送门 题目描述 有些时候需要解决这样一类问题:判断一个数 x是否合法. x合法当且仅当其满足如下条件: x格式合法,一个格式合法的整数要么是 0,要么由一个可加可不加的负号,一个 1到 9 之间的数 ...

  3. AI 概率图模型

    概率图模型(Probabilistic Graphical Model) 有向图模型 信念网络 贝叶斯网络 无向模型 马尔科夫随机场 马尔科夫网络

  4. ASp.Net Mvc Core 重定向

    在之前老版本的MVC中.重定向直接写 HttpContext.Response.Redirect("/404.html") 就好了,程序走到这里会自动返回302然后跳转了, 但是这 ...

  5. 七、xadmin 编辑界面实现二级联动

    很多时候,我们会遇到这种需求,通过一个select框中选择的值,去动态的加载另一个下拉框中的内容 对于前端的同学来讲,这个本应该是一个很简单的需求,获取第一个下拉框的值然后通过ajax去动态加载即可. ...

  6. Django的model form组件

    前言 首先对于form组件通过全面的博客介绍,对于form我们应该知道了它的大致用法,这里我们需要明确的一点是,我们定义的form与model其实没有什么关系,只是在逻辑上定义form的时候字段名期的 ...

  7. Latex(数学)

    目录 字体 罗马字体 \mathrm{} 斜体 \mathit{} 粗体 \mathbf{} 无衬线-f \mathsf{} 打字机字体 \mathtt{} 书法字体 \mathcal{} 黑板粗体 ...

  8. (第十三周)评论Final发布I

    本人所在组:奋斗吧兄弟 按课上展示的顺序对每组进行点评: 1.  Nice 项目:约跑软件 展示的时候使用了摄像头投影,提高了演示效果,软件的背景进行了美化,表现好了很好.解决了我们组提出的文字多挤没 ...

  9. iOS --- Touch ID指纹解锁

    https://www.cnblogs.com/ljmaque/p/TouchID.html 最近在项目中刚好用到了TouchId指纹解锁功能,之前也没有接触过,立马百度看看究竟是要如何使用,发现其实 ...

  10. Python_编写UDP通信编解码类、文件的上传、远程执行命令、黏包

    1.UDP通信编解码类 (1) 类 # ------------------UDP通信解码编码类------------------------ from socket import * class ...