一.相關(guān)的坐標(biāo)系
1)GPS以及iOS系統(tǒng)定位獲得的坐標(biāo)是地理坐標(biāo)系WGS1984;
2)Web地圖一般用的坐標(biāo)細(xì)是投影坐標(biāo)系WGS 1984 Web Mercator;
3)國內(nèi)出于相關(guān)法律法規(guī)要求,對(duì)國內(nèi)所有GPS設(shè)備及地圖數(shù)據(jù)都進(jìn)行了加密偏移處理,代號(hào)GCJ-02,這樣GPS定位獲得的坐標(biāo)與地圖上的位置剛好對(duì)應(yīng)上;
4)特殊的是百度地圖在這基礎(chǔ)上又進(jìn)行一次偏移,通稱Bd-09;
所以以在處理系統(tǒng)定位坐標(biāo)及相關(guān)地圖SDK坐標(biāo)時(shí)需要轉(zhuǎn)換處理下,根據(jù)網(wǎng)絡(luò)資源,目前有一些公開的轉(zhuǎn)換算法。
二.iOS地圖開發(fā)
1)<CoreLocation/CoreLocation.h> 中提供的CLLocationManager類獲取的坐標(biāo)是WGS1984坐標(biāo),這種坐標(biāo)顯示在原生地圖(國內(nèi)iOS原生地圖也是用的高德)、谷歌地圖或高德地圖需要進(jìn)行WGS1984轉(zhuǎn)GCJ-02計(jì)算,蘋果地圖及谷歌地圖用的都是高德地圖的數(shù)據(jù),所以這三種情況坐標(biāo)處理方法一樣,即
將WGS1984坐標(biāo)轉(zhuǎn)換成偏移后的GCJ-02才可以在地圖上正確顯示位置。
2)在高德地圖中獲取的坐標(biāo)是已經(jīng)轉(zhuǎn)換成GCJ-02的坐標(biāo),這時(shí)候的坐標(biāo)無需轉(zhuǎn)換可以直接顯示到地圖上的正確位置。
注意點(diǎn):若此時(shí)要對(duì)獲取的坐標(biāo)使用CLGeocoder類提供的方法- (void)reverseGeocodeLocation:(CLLocation*)location completionHandler:(CLGeocodeCompletionHandler)completionHandler轉(zhuǎn)碼成中文地理位置,就得先將GCJ-02的坐標(biāo)轉(zhuǎn)換成WGS1984坐標(biāo),然后再進(jìn)行中文地址轉(zhuǎn)碼,因?yàn)镃LGeocoder也是CoreLocation中的類,同樣使用的是WGS1984坐標(biāo)。
3)同理,百度地圖顯示需要先將坐標(biāo)轉(zhuǎn)換為Bd-09坐標(biāo)。
代碼GitHub地址(感謝作者開源):https://github.com/JackZhouCn/JZLocationConverter
從設(shè)備獲取經(jīng)緯度(GPS)坐標(biāo)
如果使用的是百度sdk那么可以獲得百度坐標(biāo)(bd09)或者火星坐標(biāo)(GCJ02),默認(rèn)是bd09
如果使用的是ios的原生定位庫,那么獲得的坐標(biāo)是WGS84
如果使用的是高德sdk,那么獲取的坐標(biāo)是GCJ02
互聯(lián)網(wǎng)在線地圖使用的坐標(biāo)系
火星坐標(biāo)系:iOS地圖(其實(shí)是高德)Gogole地圖搜搜、阿里云、高德地圖
百度坐標(biāo)系:當(dāng)然只有百度地圖
WGS84坐標(biāo)系:國際標(biāo)準(zhǔn),谷歌國外地圖、osm地圖等國外的地圖一般都是這個(gè)