1. 程式人生 > >火星座標(gcj02)、國測局座標(GPS)和百度座標(bd0911)互轉

火星座標(gcj02)、國測局座標(GPS)和百度座標(bd0911)互轉

火星座標轉百度座標

/**
 * 火星轉百度
 * 
 * @param bd_lat 百度座標緯度
 * @param bd_lon 百度座標經度
 */
public void bd_encrypt(double gg_lat, double gg_lon) {
    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.0128;//百度座標的經度
    double bd_lat = z * Math.sin(theta) + 0.0075;//百度座標的緯度
    LatLng lalng = new LatLng(bd_lat, bd_lon);
    latlonList.add(lalng);
}

 

百度座標轉火星座標

/**
 * 百度轉火星
 * 
 * @param bd_lat 百度座標緯度
 * @param bd_lon 百度座標經度
 */
public void bd_decrypt(double bd_lat, double bd_lon) {
	double x = bd_lon - 0.0126, y = bd_lat - 0.0080;
	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);
	System.out.println("經度x=" + x + "--緯度y=" + y + "--轉換後的z=" + z
	+ "--得出的theta=" + theta);
	double gcj02_lat = z * Math.sin(theta);//火星座標緯度
	double gcj02_lon = z * Math.cos(theta);//火星座標經度
	LatLng lalng = new LatLng(gcj02_lat, gcj02_lon);
	gcj02List.add(lalng);
	Log.d("百度座標-->火星座標", "經緯度:" + lalng);
}

 

GPS轉百度座標

/**
 * GPS轉百度
 * 
 * @param sourceLatLng
 * @return
 */
public LatLng convertGPSToBaidu(LatLng sourceLatLng) {
	// 將GPS裝置採集的原始GPS座標轉換成百度座標
	CoordinateConverter converter = new CoordinateConverter();
	converter.from(CoordType.GPS);
	// sourceLatLng待轉換座標
	converter.coord(sourceLatLng);
	LatLng desLatLng = converter.convert();
	return desLatLng;
}

 

百度座標轉GPS

/**
 * Baidu to GPS  百度轉GPS
 * 
 * @param sourceLatLng
 * @return
 */
public LatLng convertBaiduToGPS(LatLng sourceLatLng) {
	// 將GPS裝置採集的原始GPS座標轉換成百度座標
	CoordinateConverter converter = new CoordinateConverter();
	converter.from(CoordType.GPS);
	// sourceLatLng待轉換座標
	converter.coord(sourceLatLng);
	LatLng desLatLng = converter.convert();
	double latitude = 2 * sourceLatLng.latitude - desLatLng.latitude;
	double longitude = 2 * sourceLatLng.longitude - desLatLng.longitude;
	BigDecimal bdLatitude = new BigDecimal(latitude);
	bdLatitude = bdLatitude.setScale(6, BigDecimal.ROUND_HALF_UP);
	BigDecimal bdLongitude = new BigDecimal(longitude);
	bdLongitude = bdLongitude.setScale(6, BigDecimal.ROUND_HALF_UP);
	return new LatLng(bdLatitude.doubleValue(), bdLongitude.doubleValue());
}