百度、高德、Googe经纬度转换

由于google、高德、腾讯、图吧地图、图吧导航使用的经纬度坐标是同一种坐标协议gcj02 百度、搜狗使用的是另外一种坐标协议bd09(一个一个测试出来的),故有些时候拿到的数据坐标不一定是需要的,需要做一下转换,否则在地图上会有很大偏差的。
纠偏方法如下:
	private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

	/**
	 * 中国正常坐标系GCJ02协议的坐标,转到 百度地图对应的 BD09 协议坐标
	 * 
	 * @param lat
	 * @param lng
	 */
	public static void Convert_GCJ02_To_BD09(double lat, double lng) {
		double x = lng, y = lat;
		double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
		double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
		lng = z * Math.cos(theta) + 0.0065;
		lat = z * Math.sin(theta) + 0.006;
	}

	public static double Convert_GCJ02_To_BD09_Lat(double lat, double lng) {
		double x = lng, y = lat;
		double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
		double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
		lng = z * Math.cos(theta) + 0.0065;
		lat = z * Math.sin(theta) + 0.006;
		return lat;
	}

	public static double Convert_GCJ02_To_BD09_Lng(double lat, double lng) {
		double x = lng, y = lat;
		double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
		double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
		lng = z * Math.cos(theta) + 0.0065;
		lat = z * Math.sin(theta) + 0.006;
		return lng;
	}

	/**
	 * 百度地图对应的 BD09 协议坐标,转到 中国正常坐标系GCJ02协议的坐标
	 * 
	 * @param lat
	 * @param lng
	 */
	public static void Convert_BD09_To_GCJ02(double lat, double lng) {
		double x = lng - 0.0065, y = lat - 0.006;
		double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
		double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
		lng = z * Math.cos(theta);
		lat = z * Math.sin(theta);
	}
如果哪位大神有更好的纠偏方法,可以拿出来让大家共同验证一下

你可能感兴趣的:(Android,Java,地图,ANDROID,高德,百度地图,google,纠偏)