基础系列 09:GPS坐标系

Published: 30 Jun 2017 Category: 基础

GPS:Golbal Position System 是这么拼的吧,哈哈

现在主流APP都带个定位功能,定位第三方API:高德,百度,腾讯,不能用的google等等;一般举例时,想不到其他的了就来个等等等:)

定位就涉及坐标,坐标就能确定到地球上一个唯一点;网络太多介绍定位坐标类型的文字,大家就随手点开下面链接去入个门:

https://github.com/yang152412/GPSTransform

大致有几种类型:

  1. 地球坐标 (国际原始坐标WGS84)
  2. 火星坐标 (GCJ02,GCJ是国测局的首拼音字母;02代表02年测绘的),这个坐标系统是在地球坐标基础上进行一次加密后的;防止一米都不偏差的能逮到这个坐标的猎物;)
  3. 其他坐标 (比如:百度坐标,百度坐标是在GCJ02基础上二次加密后的坐标系统)

以上3种坐标中 使用火星坐标系统的产品有: 高德地图,腾讯地图,阿里云地图 百度使用的是百度坐标,但是定位的时候,可以指定定位类型,要么GCJ02,要么BD09ll,显示在百度地图上的肯定是BD09ll类型的坐标系

目前定位原理有如下几种

  1. GPS定位
  2. WIFI,基站定位
  3. 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#

写的挺好的

参考文章

  1. 携程地图解决方案:
  2. miliyo解决方案:
      1. 登陆态,5分钟进行一次定位
      1. 定位成功,与上一次定位比较,距离大于1000m,上传到服务端
      1. 软件中及时定位,取消掉AlarmManager,定位完成后启动AlarmManager进行延时定位
      1. 如果及时定位时刻,AlarmManager触发的定位正在定位中,则返回定位信息给请求的全局callback