WGS84,GCJ02, BD09坐标转换
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坐标转换的更多相关文章
- GIS坐标系测绘原理:大地水准面/基准面/参考椭球体/EPSG/SRI/WKT
预热文章系列:<GIS历史概述与WebGis应用开发技术浅解>.<GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换>.<OGC标准WMTS ...
- BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换
BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换 http://www.cnphp6.com/archives/24822 by root ⋅ Leave a ...
- 坐标转换——GCJ-02
WGS84(World Geodetic System 1984),是为GPS 全球定位系统 使用而建立的坐标系统GCJ-02,我国在WGS84的基础上加密得到BD-09,百度坐标在GCJ-02基础上 ...
- wgs84坐标系与gcj02坐标系转换误差分布图 | Mapping the Error in Transformation between WGS84 and GCJ02 Coordinations
国际上通用的是wgs84坐标系,而我国对于境内的坐标进行了加密,采用了gcj02坐标系,或者称为火星坐标系.亢孟军老师带的一门课<多媒体电子地图设计>要求我们从wgs84坐标系转换为gcj ...
- java中WGS84坐标(ios)转换BD-09坐标(百度坐标)
iPhone的GPS定位(CLLocationManager)获得的经纬坐标是基于WGS-84坐标系(世界标准),Google地图使用的是GCJ-02坐标系(中国特色的火星坐标系),百度的经纬坐标在G ...
- 简谈百度坐标反转至WGS84的三种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...
- 各类坐标系相互之间的转换(84互转GC02,GC02互转BD09)
在遥感行业我们经常会用到各类的坐标系相互之间的转换,常见的度分秒转化为度很简单,直接上代码: //经纬度 ////118度48分54.152秒=118+(48/60)+(54.152/3600)=11 ...
- 【PHP版】火星坐标系 (GCJ-02) 与百度坐标系 (BD-09ll)转换算法
首先感谢java版作者@宋宋宋伟,java版我是看http://blog.csdn.net/coolypf/article/details/8569813 然后根据java代码修改成了php代码. & ...
- 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换
[摘 要] 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤. [关键词] ArcGIS 坐标转换 投影变换 1 坐标转换 ...
随机推荐
- P2257 YY的GCD--洛谷luogu
传送门 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不 ...
- Nginx服务器的使用与反向代理负载均衡
目录 Nginx服务器 一:什么是Nginx? 什么是Nginx - Nginx与其他服努器的性能比较 二:如何在Linux中搭建Nginx服务器? 常见的错误 三:Nginx的反向代理和负载均衡 什 ...
- HBase篇(4)-你不知道的HFile
[每日五分钟搞定大数据]系列,HBase第四篇 这一篇你可以知道, HFile的内部结构? HBase读文件细粒度的过程? HBase随机读写快除了MemStore之外的原因? 上一篇中提到了Hbas ...
- 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解
本文我们来梳理一下Spring的那些注解,如下图所示,大概从几方面列出了Spring的一些注解: 如果此图看不清楚也没事,请运行下面的代码输出所有的结果. Spring目前的趋势是使用注解结合Java ...
- 什么是CLOS架构?
Clos架构,诞生于1952年,是由一位叫Charles Clos的人提出的,所以它并不是一个新的概念. 这个架构主要描述了一种多级电路交换网络的结构.Clos最大的优点就是对Crossbar结构的改 ...
- Python-递归初识-50
#递归函数 # 了解什么是递归 : 在函数中调用自身函数 # 最大递归深度默认是997/998 —— 是python从内存角度出发做得限制 # 能看懂递归 # 能知道递归的应用场景 # 初识递归 —— ...
- H5 70-清除浮动方式五
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python文件、文件夹的移动、复制、删除、重命名
import os.path ,shutil shutil.copytree("G://qqfile","G://new_qqfile")# 第一个是原来的文件 ...
- p76泛函 有限维空间真子空间不可能在全空间稠密
连续函数 然后多项式函数是稠密的 多项式子空间是无穷维的 多项式空间就是在全体连续函数的线性空间中稠密 有限维子空间是闭的 多项式空间也不是有限维 2的地方说 有限维真子空间必不稠密 那是对的啊 有 ...
- python 的内存回收,及深浅Copy详解
一.python中的变量及引用 1.1 python中的不可变类型: 数字(num).字符串(str).元组(tuple).布尔值(bool<True,False>) 接下来我们讲完后你就 ...