百度地圖坐標(biāo)和高德地圖坐標(biāo)轉(zhuǎn)換代碼 Java實(shí)現(xiàn)
最近做項(xiàng)目需要百度地圖坐標(biāo)轉(zhuǎn)換到高德地圖坐標(biāo)穷娱,高德官方也給出了轉(zhuǎn)換接口(百度地圖也給出了轉(zhuǎn)換接口)
http://lbs.amap.com/api/javascript-api/reference/lnglat-to-address#t1
但是還想想直接通過(guò)后臺(tái)一次性處理好坐標(biāo),因此需要找到坐標(biāo)轉(zhuǎn)換算法运沦,封裝起來(lái)調(diào)用泵额。
1 百度官方對(duì)百度坐標(biāo)為何有偏移的解釋
國(guó)際經(jīng)緯度坐標(biāo)標(biāo)準(zhǔn)為WGS-84,國(guó)內(nèi)必須至少使用國(guó)測(cè)局制定的GCJ-02,對(duì)地理位置進(jìn)行首次加密。百度坐標(biāo)在此基礎(chǔ)上携添,進(jìn)行了BD-09二次加密措施,更加保護(hù)了個(gè)人隱私嫁盲。百度對(duì)外接口的坐標(biāo)系并不是GPS采集的真實(shí)經(jīng)緯度,需要通過(guò)坐標(biāo)轉(zhuǎn)換接口進(jìn)行轉(zhuǎn)換。
2 火星坐標(biāo)系?(GCJ-02)?與百度坐標(biāo)系?(BD-09)?的轉(zhuǎn)換算法
GCJ-02(火星坐標(biāo))?和?BD-09?(百度坐標(biāo))
算法代碼如下羞秤,其中?bd_encrypt?將?GCJ-02?坐標(biāo)轉(zhuǎn)換成?BD-09?坐標(biāo)缸托,?bd_decrypt?反之。
封裝經(jīng)緯度:
/** 經(jīng)緯度點(diǎn)封裝
* Created by 明明如月 on 2017-03-22.
*/
@Data
public class LngLat {
private double longitude;//經(jīng)度
? ? private double lantitude;//維度
? ? public LngLat() {
}
public LngLat(double longitude, double lantitude) {
this.longitude = longitude;
? ? ? ? this.lantitude = lantitude;
? ? }
}
/** 百度地圖坐標(biāo)和火星坐標(biāo)轉(zhuǎn)換
* Created by qiuw.
*/
public class CoodinateCovertor {
? ? private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
/**
* 將百度坐標(biāo)轉(zhuǎn)變成火星坐標(biāo)
*
* @param lngLat_bd 百度坐標(biāo)(百度地圖坐標(biāo))
* @return 火星坐標(biāo)(高德 瘾蛋、騰訊地圖等)
*/
static LngLatbd_decrypt(LngLatlngLat_bd) {
double x = lngLat_bd.getLongitude() -0.0065, y = lngLat_bd.getLantitude() -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);
? ? return new LngLat(dataDigit(z * Math.cos(theta)), dataDigit(z * Math.sin(theta)));
}
/**
* 對(duì)double類(lèi)型數(shù)據(jù)保留小數(shù)點(diǎn)后多少位
* 高德地圖轉(zhuǎn)碼返回的就是 小數(shù)點(diǎn)后6位俐镐,為了統(tǒng)一封裝一下
*
* @param in 輸入
* @return 保留小數(shù)位后的數(shù)
*/
static double dataDigit(double in) {
return new BigDecimal(in).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}