
一、各個坐標(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)
圖吧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/
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)換

推薦閱讀: