一、各個坐標系的概況
眾所周知地球是一個不規則橢圓體,GIS中的坐標系定義由基準面和地圖投影兩組參數確定,而基準面的定義則由特定橢球體及其對應的轉換參數確定。 基準面是利用特定橢球體對特定地區地球表面的逼近,因此每個國家或地區均有各自的基準面。基準面是在橢球體基礎上建立的,橢球體可以對應多個基準面,而基準面只能對應一個橢球體。意思就是無論是谷歌地圖、搜搜地圖還是高德地圖、百度地圖區別只是針對不同的大地地理坐標系標準制作的經緯度,不存在準不準的問題,大家都是準的只是參照物或者說是標準不一樣。谷歌地圖采用的是WGS84地理坐標系(中國范圍除外),谷歌中國地圖和搜搜中國地圖采用的是GCJ02地理坐標系,百度采用的是BD09坐標系,而設備一般包含GPS芯片或者北斗芯片獲取的經緯度為WGS84地理坐標系,為什么不統一用WGS84地理坐標系這就是國家地理測繪總局對于出版地圖的要求,出版地圖必須符合GCJ02坐標系標準了,也就是國家規定不能直接使用WGS84地理坐標系。所以定位大家感覺不準確很多又叫出版地圖為火星地圖其實只是坐標系不一樣而已。這就是為什么設備采集的經緯度在地圖上顯示的時候經常有很大的偏差,遠遠超出民用GPS 10米偏移量的技術規范。
以上參考自:haotsp.com
總結:
WGS84坐標系:即地球坐標系,國際上通用的坐標系。
GCJ02坐標系:即火星坐標系,WGS84坐標系經加密后的坐標系。
BD09坐標系:即百度坐標系,GCJ02坐標系經加密后的坐標系。
搜狗坐標系、圖吧坐標系等,估計也是在GCJ02基礎上加密而成的。
API坐標系
百度地圖API百度坐標
騰訊搜搜地圖API火星坐標
搜狐搜狗地圖API搜狗坐標*
阿里云地圖API火星坐標
圖吧MapBar地圖API圖吧坐標
高德MapABC地圖API火星坐標
靈圖51ditu地圖API火星坐標
注1:百度地圖使用百度坐標,支持從地球坐標和火星坐標導入成百度坐標,但無法導出。并且批量坐標轉換一次只能轉換20個(待驗證)。
注2:搜狗地圖支持直接顯示地球坐標,支持地球坐標、火星坐標、百度坐標導入成搜狗坐標,同樣,搜狗坐標也無法導出。
個人認為:采用自家坐標體系,而不采用國內通用的火星坐標體系,實在是自尋短處。當然,百度是因為做的足夠大、足夠好,所以很霸道,也為以后一統天下而不讓別人瓜分之而做準備吧。搜狗雖然用自家坐標體系,但能將地球坐標直接導入,此舉也屬唯一。而圖吧地圖不知道學什么加密方式,以前用地球坐標用的好好的,現在用圖吧自己的坐標,難道是因為給百度做過所以也來了這么一招?或者沿用百度?不得而知。
本文的目的在于:做地圖開發的時候,不希望被一家地圖API遷就,所以采用火星坐標是正確的選擇,希望本文能夠對選擇使用誰家API的開發者提供一點幫助吧。就我個人而言,我絕不會使用非火星坐標系統的地圖API,雖然百度地圖API很好很強大確實很吸引我。
以上參考自:http://rovertang.com/labs/map-compare/
1.火星坐標系 (GCJ-02) 與百度坐標系 (BD-09) 的轉換算法,其中bd_encrypt將 GCJ-02 坐標轉換成 BD-09 坐標,bd_decrypt反之。
2.地球坐標系 (WGS-84) 到火星坐標系 (GCJ-02) 的轉換算法
WGS-84?到?GCJ-02?的轉換(即?GPS?加偏)算法
以上參考自:http://www.xue5.com/Mobile/iOS/679842.html
3.百度在線轉換API
請求之后會返回一串Json
什么情況,經緯度居然還加密?那接下來也只好見招拆招了
到這里也差不多好了,主要的代碼都寫出來了,其他的您就自己寫吧。
以上參考自:http://scalpel.me/archives/136/
四、重點啊,原來百度有內置轉換方法,這下可以不局限于百度定位SDK了
在百度地圖中取得WGS-84坐標,調用如下方法:
BMapManager.getLocationManager().setLocationCoordinateType(MKLocationManager.MK_COORDINATE_WGS84);
這樣從百度api中取得的坐標就是WGS-84了,可是這種坐標如果顯示到百度地圖上就會偏移,也就是說取出一個坐標,原封不動的顯示上去就偏移了,所以為了顯示也是正常就需要在繪制到百度地圖上之前轉換成BD-09。
轉換成BD-09,調用方法:
GeoPoint wgs84;
GeoPoint bd09 = CoordinateConvert.bundleDecode(CoordinateConvert.fromWgs84ToBaidu(wgs84));
這里實在不明白為何要設計成CoordinateConvert.fromWgs84ToBaidu(wgs84)返回了一個Bundle,所以還需要CoordinateConvert.bundleDecode()再轉成GeoPoint。
IOS端進行的轉換
推薦閱讀: