Android 定位地理坐标体系
参考:
地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02)百度坐标系 (BD-09) 的转换算法
火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
1. 中国国测局地理坐标(GCJ-02)<即火星坐标>
谷歌中国地图、搜搜中国地图、高德地图采用的是GCJ02(其中苹果地图在大陆的数据源是高德)地理坐标系
2. 世界标准地理坐标(WGS-84)
谷歌地图采用的是WGS84地理坐标系(中国范围除外)。
3. 百度地理坐标(BD-09)
百度定位SDK可以返回三种坐标系,分别是bd09, bd09ll(默认)和gcj02,其中bd09ll能无偏差地显示在百度地图上。
而设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,所以我们要根据得到的经纬度的坐标类型和地图厂商类型在地图上标点,否则会出现获取的位置误差。
注意:
后缀ll=经纬度球面坐标,mc=墨卡托平面坐标。当定位SDK中输入gcj02时,默认为经纬度坐标,输入bd09时,默认为墨卡托平面坐标。
百度地图api中采用两种坐标体系,经纬度坐标系和墨卡托投影坐标系。前者单位是度,后者单位是米,具体定义可以参见百科词条解释: http://baike.baidu.com/view/61394.htm和http://baike.baidu.com/view/301981.htm 。
以百度地图为例
百度地图采用的是自己的BD09坐标。如果我们通过GPS获取的坐标,也就是WGS84坐标,那么我们首先要将WGS坐标转换成BD09坐标。
转换成百度坐标下的经纬度即可有在地图上标点,当然,百度获取的文字详情不如高德,有时想要获取位置详情,需要调用高德的接口,而高德采用的标准是 GCJ02,因此,如果拿到百度地图的经纬度或是GPS经纬度,则要转成国测局的标准,以获取位置详细信息。
相互间的单位转换如下:
(1)世界标准地理坐标(WGS-84) 转换成 中国国测局地理坐标(GCJ-02)<火星坐标>
static double jzA = 6378245.0;
static double jzEE = 0.00669342162296594323;
static double pi = 3.14159265358979324;
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) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
return ret;
} 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 float[] gcj02Encrypt(double ggLat, double ggLon) {
float[] resPoint = new float[2];
double mgLat;
double mgLon;
double dLat = transformLat(ggLon - 105.0, ggLat - 35.0);
double dLon = transformLon(ggLon - 105.0, ggLat - 35.0);
double radLat = ggLat / 180.0 * Math.PI;
double magic = Math.sin(radLat);
magic = 1 - jzEE * magic * magic;
double sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((jzA * (1 - jzEE)) / (magic * sqrtMagic) * Math.PI);
dLon = (dLon * 180.0) / (jzA / sqrtMagic * Math.cos(radLat) * Math.PI);
mgLat = ggLat + dLat;
mgLon = ggLon + dLon; resPoint[0] = (float) mgLat;
resPoint[1] = (float) mgLon;
return resPoint;
}
(2)中国国测局地理坐标(GCJ-02) 转换成 世界标准地理坐标(WGS-84)
*******接口有1-2米左右的误差,需要精确定位情景慎用*****
public static float[] gcj02Decrypt(double gjLat, double gjLon) {
float[] gPt = gcj02Encrypt(gjLat, gjLon);
double dLon = gPt[1] - gjLon;
double dLat = gPt[0] - gjLat;
float[] pt = new float[2];
pt[0] = (float) (gjLat - dLat);
pt[1] = (float) (gjLon - dLon);
return pt;
}
(3)世界标准地理坐标(WGS-84) 转换成 百度地理坐标(BD-09)
// 首先转换获取到GCJ-02的坐标
float[] gcj02Pt = gcj02Encrypt(latitude,longitude);
// 传入中国国测局地理的坐标
public static float[] bd09Encrypt(double ggLat, double ggLon) {
float[] bdPt = new float[2];
double x = ggLon, y = ggLat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * Math.PI);
bdPt[1] = (float) (z * Math.cos(theta) + 0.0065);
bdPt[0] = (float) (z * Math.sin(theta) + 0.006);
return bdPt;
}
(4)中国国测局地理坐标(GCJ-02)<火星坐标> 转换成 百度地理坐标(BD-09)
// 用以上办法
public static float[] bd09Encrypt(double ggLat, double ggLon)
(5)百度地理坐标(BD-09) 转换成 中国国测局地理坐标(GCJ-02)<火星坐标>
public static float[] bd09Decrypt(double bdLat, double bdLon) {
float[] gcjPt = new float[2];
double x = bdLon - 0.0065, y = bdLat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);
gcjPt[1] = (float) (z * Math.cos(theta));
gcjPt[0] = (float) (z * Math.sin(theta));
return gcjPt;
}
(6)百度地理坐标(BD-09) 转换成 世界标准地理坐标(WGS-84)
*******接口有1-2米左右的误差,需要精确定位情景慎用*****
// 先将百度坐标 转换成 中国国测局坐标
float[] gcj02 = bd09ToGcj02(latitude,longitude);
// 再传入 中国国测局坐标 返回 世界标准地理坐标
gcj02Decrypt(gcj02[0], gcj02[1]);
Android 定位地理坐标体系的更多相关文章
- android 定位的四种方式
[原文] 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面总结了一下网络中现有对于介绍android定位的4种方式,希望对大家有帮助: android 定 ...
- Android定位功能
不说废话,直接说说实现android定位有关的API吧. 这些API都在android.location包下,一共有三个接口和八个类.它们配合使用即可实现定位功能. 三个接口: GpsStatus.L ...
- Android定位功能(二)
在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息.但是前文是基于Criteria定制了一个标准,通过getBestProvide ...
- 打造自己的Android常用知识体系
前言 Android常用知识体系是什么鬼?所谓常用知识体系,就是指对项目中重复使用率较高的功能点进行梳理.注意哦,不是Android知识体系. 古语道:学而不思则罔,思而不学则殆.如果将做项目类比为“ ...
- Android定位测试(深坑)
问题:我们是一个海外app,市场部去马来西亚打开那边的市场,发现了一个问题,就是我们的app定位有问题,还是成都的定位,主要原因是在马来西亚使用这个app,请求中带的经纬度参数是成都的,导致服务器返回 ...
- android 定位的几种方式介绍
[地理位置] android 定位的几种方式介绍 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络 ...
- 六 APPIUM Android 定位方式
文本转自:http://www.cnblogs.com/sundalian/p/5629500.html APPIUM Android 定位方式 1.定位元素应用元素 1.1通过id定位元素 An ...
- 发现最新版百度Android 定位SDK v6.1.3 网络定位bug
对于百度地图已经实在忍无可忍了,实验室两年以前的一个项目用到了百度地图,以前师兄毕业了,我来维护这个破项目,百度地图推出新版本出来后,老版本的api不能用了,不能做到向下兼容吗?换掉少量的api也就算 ...
- Android 开发知识体系
知识体系 1.Unix/Linux平台技术:基本命令,Linux下的开发环境 2.企业级数据库技术:SQL语言.SQL语句调优.Oracle数据库技术 3.Java 语言核心技术:Java语言基础.J ...
随机推荐
- Thinkphp3.2中的模板继承
1:模板继承: 是3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比 类的继承一样,模板也可以定义一个基础模板( ...
- AlwaysOn的认识与相关理解
AlwaysOn技术的简要说明: SQL Server2012所支持的AlwaysOn技术集中了故障转移群集.数据库镜像和日志传送三者的优点,但又不相同.故障转移群集的单位是SQL实例,数据库镜像和日 ...
- Spring学习笔记—装配Bean
在Spring中,对象无需自己负责查找或创建与其关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象.创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入的本质. ...
- 二叉树学习笔记之B树、B+树、B*树
动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ), 都是典型的 ...
- PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...
- WebRTC之带宽控制部分学习(1) ------基本demo的介绍
转自:http://blog.csdn.net/u013160228/article/details/46392037 WebRTC的代码真是非常之大啊,下载以及编译了我好几天才搞完..... 可以看 ...
- office excel 装Visual Studio后报错解决方案
安装完vs后,vs会向office安装COM加载项,但是在启动Excel时会发生弹出此加载项安装出错的消息,如下图. 名称: 从: file:///D:/Program Files (x86)/Mic ...
- matlab练习程序(Moravec算子)
这个算子算是图像历史上第一个特征点提取算法了,1977年提出的,很简单,拿来练手很合适. 算法原理如下: 1.选取一个合理的邻域遍历图像,这里是5*5邻域的.在邻域中依次计算,垂直,水平,对角与反对角 ...
- Android 开发工具之Codota
Codota 的特性 的确,正如codota 官方所说,的确是精品,他的搜索源,不仅只有Github,而且还有知名博客和开发者网站,让你搜索一个东西,不用在找上半天: 除了搜索功能,首页的下方还罗列比 ...
- LoadRunner 脚本学习 -- 读取文件内容
随便创建个txt文档 输入点内容,例如 读取文件内前N个字符: Action() { long myfile; ; ]; char *filename = "E:\\kkk.txt&quo ...