國內(nèi)各地圖API坐標(biāo)系統(tǒng)比較與轉(zhuǎn)換(做LBS的朋友請轉(zhuǎn))

開發(fā)LBS的朋友看看

一、各個坐標(biāo)系的概況

眾所周知地球是一個不規(guī)則橢圓體,GIS中的坐標(biāo)系定義由基準(zhǔn)面和地圖投影兩組參數(shù)確定,而基準(zhǔn)面的定義則由特定橢球體及其對應(yīng)的轉(zhuǎn)換參數(shù)確定。 基準(zhǔn)面是利用特定橢球體對特定地區(qū)地球表面的逼近,因此每個國家或地區(qū)均有各自的基準(zhǔn)面?;鶞?zhǔn)面是在橢球體基礎(chǔ)上建立的,橢球體可以對應(yīng)多個基準(zhǔn)面,而基準(zhǔn)面只能對應(yīng)一個橢球體。意思就是無論是谷歌地圖、搜搜地圖還是高德地圖、百度地圖區(qū)別只是針對不同的大地地理坐標(biāo)系標(biāo)準(zhǔn)制作的經(jīng)緯度,不存在準(zhǔn)不準(zhǔn)的問題,大家都是準(zhǔn)的只是參照物或者說是標(biāo)準(zhǔn)不一樣。谷歌地圖采用的是WGS84地理坐標(biāo)系(中國范圍除外),谷歌中國地圖和搜搜中國地圖采用的是GCJ02地理坐標(biāo)系,百度采用的是BD09坐標(biāo)系,而設(shè)備一般包含GPS芯片或者北斗芯片獲取的經(jīng)緯度為WGS84地理坐標(biāo)系,為什么不統(tǒng)一用WGS84地理坐標(biāo)系這就是國家地理測繪總局對于出版地圖的要求,出版地圖必須符合GCJ02坐標(biāo)系標(biāo)準(zhǔn)了,也就是國家規(guī)定不能直接使用WGS84地理坐標(biāo)系。所以定位大家感覺不準(zhǔn)確很多又叫出版地圖為火星地圖其實只是坐標(biāo)系不一樣而已。這就是為什么設(shè)備采集的經(jīng)緯度在地圖上顯示的時候經(jīng)常有很大的偏差,遠遠超出民用GPS 10米偏移量的技術(shù)規(guī)范。

以上參考自:haotsp.com

總結(jié):

WGS84坐標(biāo)系:即地球坐標(biāo)系,國際上通用的坐標(biāo)系。

GCJ02坐標(biāo)系:即火星坐標(biāo)系,WGS84坐標(biāo)系經(jīng)加密后的坐標(biāo)系。

BD09坐標(biāo)系:即百度坐標(biāo)系,GCJ02坐標(biāo)系經(jīng)加密后的坐標(biāo)系。

搜狗坐標(biāo)系、圖吧坐標(biāo)系等,估計也是在GCJ02基礎(chǔ)上加密而成的。


二、各個地圖API采用的坐標(biāo)系

API坐標(biāo)系

百度地圖API百度坐標(biāo)

騰訊搜搜地圖API火星坐標(biāo)

搜狐搜狗地圖API搜狗坐標(biāo)*

阿里云地圖API火星坐標(biāo)

圖吧MapBar地圖API圖吧坐標(biāo)

高德MapABC地圖API火星坐標(biāo)

靈圖51ditu地圖API火星坐標(biāo)

注1:百度地圖使用百度坐標(biāo),支持從地球坐標(biāo)和火星坐標(biāo)導(dǎo)入成百度坐標(biāo),但無法導(dǎo)出。并且批量坐標(biāo)轉(zhuǎn)換一次只能轉(zhuǎn)換20個(待驗證)。

注2:搜狗地圖支持直接顯示地球坐標(biāo),支持地球坐標(biāo)、火星坐標(biāo)、百度坐標(biāo)導(dǎo)入成搜狗坐標(biāo),同樣,搜狗坐標(biāo)也無法導(dǎo)出。

個人認為:采用自家坐標(biāo)體系,而不采用國內(nèi)通用的火星坐標(biāo)體系,實在是自尋短處。當(dāng)然,百度是因為做的足夠大、足夠好,所以很霸道,也為以后一統(tǒng)天下而不讓別人瓜分之而做準(zhǔn)備吧。搜狗雖然用自家坐標(biāo)體系,但能將地球坐標(biāo)直接導(dǎo)入,此舉也屬唯一。而圖吧地圖不知道學(xué)什么加密方式,以前用地球坐標(biāo)用的好好的,現(xiàn)在用圖吧自己的坐標(biāo),難道是因為給百度做過所以也來了這么一招?或者沿用百度?不得而知。

本文的目的在于:做地圖開發(fā)的時候,不希望被一家地圖API遷就,所以采用火星坐標(biāo)是正確的選擇,希望本文能夠?qū)x擇使用誰家API的開發(fā)者提供一點幫助吧。就我個人而言,我絕不會使用非火星坐標(biāo)系統(tǒng)的地圖API,雖然百度地圖API很好很強大確實很吸引我。

以上參考自:http://rovertang.com/labs/map-compare/


三、各個坐標(biāo)系的相互轉(zhuǎn)換

1.火星坐標(biāo)系 (GCJ-02) 與百度坐標(biāo)系 (BD-09) 的轉(zhuǎn)換算法,其中bd_encrypt將 GCJ-02 坐標(biāo)轉(zhuǎn)換成 BD-09 坐標(biāo),bd_decrypt反之。




2.地球坐標(biāo)系 (WGS-84) 到火星坐標(biāo)系 (GCJ-02) 的轉(zhuǎn)換算法

WGS-84?到?GCJ-02?的轉(zhuǎn)換(即?GPS?加偏)算法


以上參考自:http://www.xue5.com/Mobile/iOS/679842.html


3.百度在線轉(zhuǎn)換API


請求之后會返回一串Json


什么情況,經(jīng)緯度居然還加密?那接下來也只好見招拆招了


到這里也差不多好了,主要的代碼都寫出來了,其他的您就自己寫吧。

以上參考自:http://scalpel.me/archives/136/


四、重點啊,原來百度有內(nèi)置轉(zhuǎn)換方法,這下可以不局限于百度定位SDK了

在百度地圖中取得WGS-84坐標(biāo),調(diào)用如下方法:

BMapManager.getLocationManager().setLocationCoordinateType(MKLocationManager.MK_COORDINATE_WGS84);

這樣從百度api中取得的坐標(biāo)就是WGS-84了,可是這種坐標(biāo)如果顯示到百度地圖上就會偏移,也就是說取出一個坐標(biāo),原封不動的顯示上去就偏移了,所以為了顯示也是正常就需要在繪制到百度地圖上之前轉(zhuǎn)換成BD-09。

轉(zhuǎn)換成BD-09,調(diào)用方法:

GeoPoint wgs84;

GeoPoint bd09 = CoordinateConvert.bundleDecode(CoordinateConvert.fromWgs84ToBaidu(wgs84));

這里實在不明白為何要設(shè)計成CoordinateConvert.fromWgs84ToBaidu(wgs84)返回了一個Bundle,所以還需要CoordinateConvert.bundleDecode()再轉(zhuǎn)成GeoPoint。


IOS端進行的轉(zhuǎn)換



推薦閱讀:

Facebook Paper使用的第三方庫(強烈推薦)

iOS/Mac 開發(fā)博客列表(不斷更新中)

作為一個iOS開發(fā)要看的網(wǎng)站,一定對你有用的,相信我!

提高iOS開發(fā)效率的方法和工具

IM系統(tǒng)架構(gòu)設(shè)計之淺見

nil、Nil、NULL和NSNull的理解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容