使用第三方定位API的目的是穩(wěn)定快速旨椒,在沒有GPS信號時也能通過WIFI及移動信號準確定位壳鹤,但是因為政策問題盟劫,國內的地圖會偏移航缀,多半采用GCJ-02坐標系商架,百度采用BD-09坐標系,倒是我沒想到谬盐,高德的定位API竟然也返回GCJ-02坐標系甸私。
而且诚些,setCoordType()不會有任何效果飞傀,就是說在國內不提供WGS84的坐標數(shù)據(jù)。
網(wǎng)上有很多關于把GCJ02轉換成WGS84的算法诬烹,不過不得不說砸烦,都是垃圾,想當年我還辛辛苦苦把搜到的java代碼重寫成JavaScript代碼绞吁,然后一點點調參數(shù)試的肝腸寸斷幢痘。就算網(wǎng)上最靠譜的簡單算法,最多也只能在部分區(qū)域適用家破。聽我一個在百度的師姐說他們在全國范圍內采了2000多萬個控制點用來轉換的颜说,不知是真是假。
很幸運汰聋,高德SDK提供了一個CoordinateConverter工具類门粪,用于將阿里云、百度坐標烹困、谷歌坐標玄妈、圖盟坐標、圖吧坐標髓梅、搜搜坐標轉換成高德地圖坐標(不支持反算)拟蜻。不過他不支持反算,但是我們可以手動反算枯饿。
反算有一個默認的前提:GCJ-02和WGS84在同一個點的坐標值通常差別不會特別大酝锅,一般都是小數(shù)點后面三位起,也就是我們明知定位得到的結果是GCJ02坐標系的奢方,但是就算是把他當成WGS84搔扁,這個誤差也不會特別大,反應在地圖上一般在500米以內袱巨。
假設所在的點P用高德定位出來的數(shù)據(jù)(Xgcj,Ygcj)阁谆,那么在這個點500米的范圍內,一定存在一個點P',他的WGS84的坐標值與P點的GCJ02的坐標值一致愉老,即:
X'wgs = Xgcj
Y'wgs = Ygcj
我們把P'的WGS84的坐標值丟進CoordinateConverter正算一次场绿,那就得到了P'點GCJ02的坐標值(X'gcj,Y'gcj)。P'點的WGS84坐標值和GCJ02的坐標值當然有一個差值:
dx' = X'gcj - X'wgs
dy' = Y'gcj - Y'wgs
又因為P點和P'點相距非常近嫉入,所以我們可以認為:
dx ≈ dx'
dy ≈ dy'
即:
Xwgs≈Xgcj - dx'
Ywgs≈Ygcj - dy'
代碼就比較簡單了:
double longitude = amapLocation.getLongitude();
double latitude = amapLocation.getLatitude();
//初始化坐標轉換類
CoordinateConverter converter = new CoordinateConverter(getApplicationContext());
converter.from(CoordinateConverter.CoordType.GPS);
//設置需要轉換的坐標
converter.coord(new DPoint(latitude,longitude));
//轉換成高德坐標
DPoint destPoint = converter.convert();
double dx = destPoint.getLongitude() -longitude;
double dy = destPoint.getLatitude() -latitude;
longitude = longitude - dx;
latitude = latitude - dy;