(轉)關於百度地圖和高德地圖,關於地圖座標系

原文作者: 深白Andy
原文地址: [url]http://my.eoe.cn/gueryue/archive/15390.html[/url]

衆所周知地球是一個不規則橢圓體,GIS中的座標系定義由基準面和地圖投影兩組參數確定,而基準面的定義則由特定橢球體及其對應的轉換參數確定。 基準面是利用特定橢球體對特定地區地球表面的逼近,因此每個國家或地區均有各自的基準面。基準面是在橢球體基礎上建立的,橢球體可以對應多個基準面,而基準面只能對應一個橢球體。 意思就是無論是谷歌地圖、搜搜地圖還是高德地圖、百度地圖區別只是針對不同的大地地理座標系標準制作的經緯度,不存在準不準的問題,大家都是準的只是參照物或者說是標準不一樣。

谷歌地圖採用的是WGS84地理座標系(中國範圍除外),谷歌中國地圖和搜搜中國地圖採用的是GCJ02地理座標系,百度採用的是BD09座標系,而設備一般包含GPS芯片或者北斗芯片獲取的經緯度爲WGS84地理座標系,爲什麼不統一用WGS84地理座標系這就是國家地理測繪總局對於出版地圖的要求,出版地圖必須符合GCJ02座標系標準了,也就是國家規定不能直接使用WGS84地理座標系。所以定位大家感覺不準確很多又叫出版地圖爲火星地圖其實只是座標系不一樣而已。

這就是爲什麼設備採集的經緯度在地圖上顯示的時候經常有很大的偏差,遠遠超出民用GPS 10米偏移量的技術規範,於是我們就有了谷歌地圖糾偏 騰訊搜搜糾偏 混合地圖糾偏 百度谷歌互轉存在的價值。

那如何對谷歌地圖糾偏、搜搜soso地圖糾偏或者對百度地圖糾偏呢,如果用算法目前沒有太好的算法直接轉換,所以大家採用的都是比對的方法吧地球劃分成若干個小塊找到地圖的偏差量記錄下來,然後根據任意經緯度找尋最接近的偏差量加上偏差量就可以實現不同地圖之間的經緯度轉換。現在有0.01度糾偏經緯度信息,可以提供任意格式,可以直接把經緯度偏移量調整回來。

百度地圖糾偏信息包含中國海域一共29,699,997條糾偏數據,谷歌地圖只包含中國陸地一共12,597,551條糾偏數據,基站數據移動和聯通的共340萬數據。

移動聯通基站數據字段說明: MCC:國家 (460是中國) MNC:0是移動,1是聯通 LAC:小區號 CELL:基站號 LNG:緯度 LAT:經度 O_LNG:糾偏後的緯度(用於google地圖顯示) O_LAT:糾偏後的經度(用於google地圖顯示)PRECISION:基站半徑範圍單位米 ADDRESS:詳細地址中文描述 REGION:省份 CITY:城市 COUNTRY:國家

以上摘自http://www.haotsp.com/

之所以說這個是因爲前些日子做的項目有這樣的一個需求,展示的是百度地圖,然後想利用百度地圖上取到經緯度的點,用高德地圖的api逆地理編碼獲取當前位置的文字信息。一開始以爲全球的經緯度都是確定值的嘛,大家共用的。其實不然,由於每個地圖使用的座標系不同,我偉大的祖國爲了保密需要,規定不能直接使用WGS84地理座標系,於是應用於中國的各個地圖就會在原來座標的基礎上經過一個加密的加偏算法,把加偏過的座標呈現給你,而不同地圖的加偏算法又是不一樣的,有的甚至是多次加偏。也就是說同樣你是在人民廣場,用百度地圖和谷歌地圖取到的座標值是不一樣的。

經研究發現,百度地圖的座標系爲BD09,高德地圖座標爲GCJ02,這樣就存在不同座標系的座標之間轉換的問題了,查api吧,然後又發現無論百度地圖還是高德地圖,api列表裏都沒有提這個事情。但是上網一查,還是發現了他們都有個隱藏類:CoordinateConvert,但是這個類只提供了轉向他們自己座標系的方法,比如說:


//百度api
CoordinateConvert.fromGcjToBaidu(GeoPoint geoPoint);
//從gcj02座標系轉到bd09座標系
CoordinateConvert.fromWgs84ToBaidu(GeoPoint geoPoint);
//從wgs84座標系轉到bd09座標系

//高德api
//從wgs84座標系轉到gcj02座標系
CoordinateConvert.fromGpsToAMap(double arg0, double arg1);
CoordinateConvert.fromSeveralGpsToAMap(String arg0);
CoordinateConvert.fromSeveralGpsToAMap(String arg0);

而因爲我是展示的百度地圖,有要獲取百度地圖上的中心點的經緯度然後在作爲參數調用高德地圖api的需求,而百度地圖並未提供bd09座標系轉出的api(也可以理解,因爲如果這樣的話,相當於沒加密啊,自己將加密算法寫出來,再給個解密的api不是有毛病麼,不能不把國家的規定放眼裏嘛,百度也說有深層次的需求要以公司名義給他們發郵件什麼的,但是一般來說一個小安卓項目客戶不會那麼興師動衆,而且據羣衆反映,郵件的效果也不怎麼好),所以一時做了罷。

但是柳暗花明又一村了,雖然無法將百度地圖上的任意點轉爲gcj02座標系的點,但是百度地圖還是在他們的定位api裏提供了方法,使得應用在獲取當前位置的時候,可以獲取以“gcj02”爲座標系的點:

LocationClientOption option = new LocationClientOption();
option.setCoorType("gcj02");//設置座標類型

這樣以來,就可以用高德地圖獲取位置信息了,雖然說只能有當前位置這一個點是取成gcj02座標的點是比較囧的o(╯□╰)o ,還有,別忘了,取得的當前點要轉化成bd09的座標系之後,再展示在百度地圖上,不然是會有偏差的。

另外比較一下百度地圖和高德地圖(因爲害怕谷歌地圖在大陸地區的服務受限問題等等,所以沒考慮使用谷歌地圖,也就沒怎麼研究)。

百度地圖在頁面上的展示方面做的還是很好的,包括頁面的縮放,信息的標註等等,相比之下高德地圖就會在某些安卓版本的某些機器上出現在放縮的時候地圖信息展示的不夠清晰不夠明確的情況,而且在定位時,百度的地位相對準確,因爲我們公司的網絡服務器不在公司辦公所在地,所以高德地圖有時候定位就定位到服務器的地址去了,百度從我使用至今還沒出現過這樣的錯誤。

但是百度地圖在poi搜索這一塊,在我看來是相對薄弱的,百度地圖的poi搜索在不輸入關鍵字的時候,是不能做模糊搜索的,而且也不能根據類型搜索(比如僅搜索飲食,搜索學校之類的),而在高德地圖裏這些就做到了。而且在逆地理編碼時,高德地圖獲取的結果是相對比百度地圖更豐富的。

最後,此篇文章僅基於我個人在最近的短時間內的研究,如有遺漏或者錯誤之處,還請看到文章的各位指出,大家共同進步,謝謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章