基础系列 09:GPS坐标系
GPS:Golbal Position System 是这么拼的吧,哈哈
现在主流APP都带个定位功能,定位第三方API:高德,百度,腾讯,不能用的google等等;一般举例时,想不到其他的了就来个等等等:)
定位就涉及坐标,坐标就能确定到地球上一个唯一点;网络太多介绍定位坐标类型的文字,大家就随手点开下面链接去入个门:
https://github.com/yang152412/GPSTransform
大致有几种类型:
- 地球坐标 (国际原始坐标WGS84)
- 火星坐标 (GCJ02,GCJ是国测局的首拼音字母;02代表02年测绘的),这个坐标系统是在地球坐标基础上进行一次加密后的;防止一米都不偏差的能逮到这个坐标的猎物;)
- 其他坐标 (比如:百度坐标,百度坐标是在GCJ02基础上二次加密后的坐标系统)
以上3种坐标中 使用火星坐标系统的产品有: 高德地图,腾讯地图,阿里云地图 百度使用的是百度坐标,但是定位的时候,可以指定定位类型,要么GCJ02,要么BD09ll,显示在百度地图上的肯定是BD09ll类型的坐标系
目前定位原理有如下几种
- GPS定位
- WIFI,基站定位
- AGPS定位
开发中,火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
public class GCJ02_BD09 {
public static double pi = 3.141592653589793 * 3000.0 / 180.0;
public static void main(String[] args) {
// GCJ02 ——> BD09
gcj02_To_Bd09(116.422954, 40.010749).print();
// BD09 ——> GCJ02
bd09_To_Gcj02(121.481085, 31.236173).print();
}
/**
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标
*
* @param gg_lat
* @param gg_lon
* @return
*/
public static Gps gcj02_To_Bd09(double gg_lon, double gg_lat) {
double x = gg_lon, y = gg_lat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi);
double bd_lon = z * Math.cos(theta) + 0.0065;
double bd_lat = z * Math.sin(theta) + 0.006;
return new Gps(bd_lon, bd_lat);
}
/**
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 BD-09 坐标转换成GCJ-02 坐标
*
* @param bd_lon
* @param bd_lat
* @return
*/
public static Gps bd09_To_Gcj02(double bd_lon, double bd_lat) {
double x = bd_lon - 0.0065, y = bd_lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi);
double gg_lon = z * Math.cos(theta);
double gg_lat = z * Math.sin(theta);
return new Gps(gg_lon, gg_lat);
}
//Gps类
public static class Gps {
public double lat;
public double lon;
public Gps(double lon, double lat) {
this.lat = lat;
this.lon = lon;
}
public void print() {
System.out.println(this.lon + "," + this.lat);
}
}
}
给个链接,大家自行去脑补吧
http://blog.csdn.net/jssongwei/article/details/52185698#
写的挺好的
参考文章
- 携程地图解决方案:
- miliyo解决方案:
-
- 登陆态,5分钟进行一次定位
-
- 定位成功,与上一次定位比较,距离大于1000m,上传到服务端
-
- 软件中及时定位,取消掉AlarmManager,定位完成后启动AlarmManager进行延时定位
-
- 如果及时定位时刻,AlarmManager触发的定位正在定位中,则返回定位信息给请求的全局callback
-
-