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 ...
随机推荐
- 并发用户数与 TPS 之间的关系
1. 背景 在做性能测试的时候,很多人都用并发用户数来衡量系统的性能,觉得系统能支撑的并发用户数越多,系统的性能就越好:对TPS不是非常理解,也根本不知道它们之间的关系,因此非常有必要进行解释. 2 ...
- 【openGL】画圆
#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...
- JAVA 堆栈知识和Volatile关键字
栈内存:存放基本类型的变量和对象的引用 堆内存:存放用new创建的对象和数组 栈帧:保存了局部变量表,操作数栈,方法的返回地址以及其它的附加信息 volatile修饰的变量,jvm虚拟机只是保证从主内 ...
- 【leetcode】Remove Duplicates from Sorted Array
题目描述: Given a sorted array, remove the duplicates in place such that each element appear only once a ...
- java 存储对象
一.存储区域: 1)寄存器.这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何 ...
- Linux系统启动流程及安装命令行版本
Debian安装 之前也安装过很多次linux不同版本的系统,但安装后都是直接带有桌面开发环境的版本,直接可以使用,正好最近项目不是很忙,想一直了解下Linux的整个启动流程,以及如何从命令行模式系统 ...
- Intent传递对象的两种方法(Serializable,Parcelable) (转)
今天讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcela ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- Java利用Preferences设置个人偏好
Java利用Preferences设置个人偏好 Preferences的中文意思即偏好或喜好的意思,也就是说同一个程序在每次运行完后,可以通过Preferences来记录用户的偏好,下次启动时,程序会 ...
- 【maven 报错】maven项目执行maven install时报错Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
在使用maven新建的web项目中,执行 执行如上的这两个操作,报错: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-co ...