移動端地圖開發技術分享交流會PPT
投影
做地圖,投影
的概念很重要。我們的地球是圓形的,地球的座標是一個球面座標,球面座標是三維座標(x、y、z),而我們的地圖是是二維的(x、y),需要將球面的三維座標轉換為平面的二維座標。
座標轉換久用到了投影
的概念,常用的投影
有:圓柱投影
、圓錐投影
、方位投影
,而在我們地圖導航中使用墨卡託投影
。
墨卡託投影
墨卡託投影
百度、高德、Google都使用墨卡託投影
,墨卡託投影
有一個很大的弊端,就是在高緯度(南緯
、北緯
)地區產生巨大的變形。變形比較嚴重的地方在於俄羅斯、格林蘭島、非洲、南極洲等高緯度地區。
墨卡託投影
上面五個國家分別是:俄羅斯、澳大利亞、中國、巴西、加拿大
我們將這五個國家放在一個緯度
,來比較這五個國家,發現相差並不太大。但是如果放在上面那張圖中,俄羅斯頂好幾個中國大小。
國外開發者開發了一個網站,這個網站可以將不同國家拉到同一個緯度
,這時候就能顯示出真正比例的國家面積。
網站地址:http://thetruesize.com/
古德投影
古德投影
古德投影
可以避免地圖變形的問題,這種投影
將地圖分為幾個部分,然後沿赤道將幾個部分連線在一起。我們發現上面的格林蘭島已經被分為兩部分,這種投影
並不適合用於開發,而且看起來效果也不太好看。金字塔模型
把一張世界地圖顯示到手機裡是不可能的,所以就引入了金字塔模型
的概念(也就是比例尺
),我們可以根據不同的縮放比例,顯示不同的解析度。
在地圖應用中,我們用手指縮放和放大地圖,地圖顯示大小的變換,都是基於金字塔模型
來組織瓦片圖的。
瓦片座標系
瓦片座標系
和金字塔模型
配合使用的就是瓦片座標系
,在不同的縮放等級下,同一塊區域瓦片
個數也是不一樣的。
瓦片
越多就代表這一區域顯示越詳細,縮放比例也就越大。瓦片座標系
在2D和3D的場景下都會被使用,我們在網路不好的情況下可以看到地圖瓦片
的載入過程以及瓦片
的大小、位置。
座標加密
CLLocationManager
中的經緯度加密(WGS-84
)MKMapView
中的經緯度加密(GCJ-02
)- 高德SDK中的經緯度加密(
GCJ-02
) - 百度SDK中的經緯度加密(使用
GCJ-02
再次加密,叫做BD-09
)
根據中國法律規定,地圖提供商必須對地圖經緯度進行偏移,國測局制定了一套加密標準,就是常用的GCJ-02
。經緯度座標
加密主要有兩種格式,GPS座標系 (WGS-84
GCJ-02
) ,加密演算法是開源的,可以搜尋到。國際經緯度座標標準為WGS-84
,國內必須至少使用國測局制定的GCJ-02
,對地理位置進行首次加密。由於每家導航SDK提供方加密都不統一,所以百度、高德、谷歌多家地圖資料並不統一,需要再次進行轉換。
地圖定位
地圖定位移動端定位方式主要有三種:GPS
、Wi-Fi
、基站
,但是android
和iOS
還不太一樣,android
可以讓使用者選擇和設定那種定位方式,但是iOS
是由系統為我們選擇的,我們沒有操作定位方式的許可權。iOS
不允許有第三方定位,所以現在地圖應用都是對系統定位進行的封裝。如果有GPS
訊號,iOS
系統會優先選擇GPS
方式定位,然後是Wi-Fi
定位,如果Wi-Fi
訊號不好就會選擇基站
定位。
在定位中精確度最高的是Google
,Google
利用大資料分析,記錄每一次利用Google
地圖的定位。下次再次定位時,直接根據Mac地址
等資訊進行分析,提高定位精確度。
比較悲催的一個問題就是,有一些比較老的iOS
機器,沒有GPS
定位模組,例如一些老版本iPad
,這種裝置在沒有Wi-Fi
的情況下是無法定位的。
地理編碼和逆地理編碼
示例圖片地理編碼
:即地理解析,由詳細的結構化地址得到對應的經緯度資訊,例如北京市海淀區中關村南大街27號
的地址,就可以獲取到一個唯一的經緯度資訊。
逆地理編碼
:即逆地理解析,由一個經緯度資訊獲取一個結構化地址資訊,例如lng:116.31985,lat:39.959836
經緯度,就可以獲取到類似於上面的地理資訊。
在iOS
系統API、高德SDK、百度SDK中,都為我們提供了地理編碼
和逆地理編碼
API,但是需要注意經緯度的轉換,不同地圖SDK返回的經緯度加密方式不同,我們在傳入經緯度引數和接收經緯度引數時,都需要做轉換。
地圖資料來源
高德
四維圖新
國內比較活躍的資料採集商主要是高德和四維圖新兩家,百度沒有資料採集資質(最近收購了道道通),所以資料主要依賴於四維圖新。
四維圖新和國家測繪局合作比較密切,資料來源主要是國家測繪局提供,也有部分自己測繪的資料。高德測繪和航拍能力還不錯,主要自己測繪資料,部分資料也依賴國測局提供。資料測繪單位互相之間都有合作,會相互購買自己沒有的資料。
在中國,谷歌地圖或蘋果地圖等地圖開發商,資料來源幾乎都是這兩家公司。
POI資料
POI
資料是一種向量資料,包括美食、商店、銀行、加油站等都是POI
資料,在地圖上一般都以氣泡或大頭針表示。
資料採集可以通過車載GPS
攝像機採集,或從服務性網際網路企業抓取或購買,由於百度和高德提供了對外的SDK,通過使用者使用地圖SDK也可以獲取一些資料。
百度的地圖資料主要依賴於四維圖新和道道通,高德地圖主要以自採為主。一般這些資料也會和大眾點評、攜程、口碑等網際網路服務商購買,相互之間也會購買POI
資料。
柵格-2D地圖
珊格圖
珊格圖
2D場景:輕地圖應用,簡單的位置分享、興趣點標註、線路展示等。2D模型
展示效果不太好,在縮放比例較小的情況下,看起來比較模糊(縮放比例大一些看起來清晰度還可以)。
柵格模型
對於某一個地方的描述,是通過很多層圖片疊加組成的,每層代表不同資訊(例如道路)。柵格模型
一般都會先渲染一個底圖,然後是在底圖的基礎上疊加路況、POI
等圖層。
珊格圖都是在伺服器預處理的圖片,從伺服器下載處理好的圖片到本地進行拼接即可,由於下載到本地是圖片,本地不能再對圖層進行更改。對於效能上來說,伺服器進行圖片合成效能消耗較大,但是客戶端效能消耗比較小,記憶體佔用也比較小,用起來會比較流暢。
向量-3D地圖
向量地圖向量地圖3D場景:重地圖應用,以LBS
為核心功能,需要離線地圖、更好的渲染效果、app內導航的。比如打車應用、出行導航類應用,3D模型
渲染後的效果比較好,一般使用導航功能都必須用這個3D模型
。
向量資料是從伺服器將地圖資料下載下來,然後在客戶端進行合成繪製的,所以我們可以對地圖的顯示進行控制,可定製性更強。向量圖
看起來更佳清晰,渲染效果比較好。但是向量圖
對手機效能消耗很厲害,手機記憶體佔用比較高,CPU
、GPU
消耗都很大。對於伺服器效能消耗就比2D場景
效能小一些,因為伺服器只是載入原始資料和向客戶端進行傳輸,將合成繪製等這些圖層渲染的繪製處理交給客戶端來做。提高了客戶端靈活性和更好的效果,犧牲了客戶端的效能,有利有弊。
三維地圖
三維地圖
三維地圖
是以三維地圖資料為基礎開發的,三維地圖
看起來更佳立體化,地圖上可以呈現出立體建築及陰影的效果,而且地圖隨著使用者的操作,樓宇的角度、陰影等效果也會隨之發生變化。
在三維地圖
過渡過程中,也出現過假三維地圖
。這種地圖只能進行平面平移,不能進行旋轉操作,是資料平面地圖
和三維地圖
過渡的產物。
國外地圖
國外地圖百度地圖目前已經可以支援部分國家的國外地圖服務,例如新加坡、韓國、日本、泰國等國家。可以在最新的百度地圖app上直接檢視、搜尋這些國家的一些POI
,以及使用導航等功能。
目前為止只有百度一家支援國外地圖服務,高德暫時不支援這項服務。在百度和高德不支援的地方,由於伺服器沒有資料,所以不會做渲染,看起來白白的一片。
實景地圖
實景地圖實景地圖
最開始是Google
研發的,這項技術需要軟體和硬體相互的配合,以及大量的資料處理才能完成。
採集實景需要各式實景採集工具,包括汽車採集、自行車採集、人力採集等,這主要是由於需要應對各種採集地點。採集時將資料實時繫結GPS
位置,這樣就清楚是在哪個位置採集的。
資料採集後需要工程師將資料進行復雜處理,才能形成我們看到的實景資料。實景資料
一般都是靜態的,而且不是實時更新的。實景資料
為了保護被採集人的使用者隱私,需要對關鍵部位進行模糊處理,例如臉、車牌照等。
室內地圖
室內地圖
室內定位
是一種結合3D定位
的定位模式,這種定位可以在室內進行定位。室內定位直接定位某個商鋪在幾樓的某個位置,而且可以選擇樓層。
在傳統的定位中,樓內由於是多層,會導致定位重疊的問題,而且樓內GPS
訊號也不太好甚至沒有。所以出現了一些新技術來實現樓內定位:AGPS
(輔助全球衛星定位系統)、Wi-Fi指紋
定位、zigbee晶片
定位、RFID智慧標籤技術
、以及蘋果推出的ibeacon
,其中高德使用的是Wi-Fi指紋定位
技術。
百度熱力圖
百度熱力圖
首先是由百度率先支援熱力圖
功能,熱力圖
功能預示著大資料時代越來越近。熱力圖是根據百度地圖移動客戶端和SDK在這些地區的使用情況推斷出來的,這些推斷資料可以是網路請求、開啟次數等,通過這些資料推斷出人員分佈。通過之前百度在CCTV
的報道來看,通過這些資料甚至可以預測景區擁堵,防止大型踩踏等群體性事件。
熱力圖
隨著同一區域的密集程度變化,顏色隨之變深。但是由於統計方式的特點,統計的資料並不太準確,例如白天和夜間就有很大區別,只是當作參考。
地圖SDK架構
高德SDK結構
高德SDK結構
Annotation
:單點標註,繼承自UIView
,可以使用UIView
的一些基礎屬性,引入了重用機制(百度也是同樣的實現,包括一些打車軟體的小車,都是使用Annotation
實現)。
Overlay
:多點標註,引擎直接渲染,可以通過SDK的API自定義UI,多點標註用於標識路線或某一個區域。
Other
:雲搜尋,地理編碼和逆地理編碼,導航路徑規劃,定位,POI
搜尋等。
MapKit和高德SDK區別
對比
右邊圖片的高德logo是黑色,並且顯示在右下角,這是iOS
系統的MapKit.framework
左邊圖片的高德logo是藍色,並且顯示在左下角,這是高德自己的SDK。
蘋果的MapKit
只是使用了高德的資料,但是API是蘋果自己開發的。
百度地圖SDK框架
百度地圖SDK框架
百度SDK主要模組劃分:
- 地圖(基礎功能,地圖顯示以及操作和各種覆蓋物圖層)
- 檢索(
POI
,地理編碼、路徑規劃等) - 定位(提供獨立定位模組,經緯度根據國測局二次加密)
- 工具(呼叫百度客戶端,座標轉換等)
- 周邊雷達(檢索使用者資訊,查詢附近的人,主要用於社交)
- LBS雲(區域檢索,百度伺服器儲存資料,可以自己操作,屬於開發者自有資料)
百度SDK分為六個大的模組,可以按照需求下載對應的模組,這樣使下載下來的SDK體積變小。
百度鑑權認證策略:使用者可以通過兩種方式與百度開放雲進行互動,包括認證方式
和匿名方式
。在SDK中很多地方都用到了鑑權認證
,例如載入地圖時認證不通過不會顯示地圖,百度比較看重SDK的鑑權
。
圖層渲染
圖層渲染
百度地圖渲染分為多個圖層渲染,每個圖層渲染的目標也不一樣,地圖上自定義標註和覆蓋物統稱為地圖覆蓋物,多個圖層疊加起來形成向量圖
。百度地圖SDK地圖等級目前為19級,可以根據縮放等級的不同渲染建築物、道路、河流、學校、公園等內容。
百度地圖支援多點觸控、雙擊放大、多點縮小、旋轉等手勢操作。並且支援畫點、折線、圓、多邊形等操作,並且可以自定義熱力圖
、瓦片圖
等。
百度個性化地圖
百度個性化地圖
百度地圖在16年1月份推出了
個性化地圖
,SDK提供了個性化地圖模版,通過地圖模版更改底圖顏色和樣式。從百度開發者平臺下載到模版,通過地圖模版可以修改地面、水系、草地、道路、鐵路、地鐵、POI
等顏色和樣式,然後呼叫SDK提供的方法讀取該模版即可。地圖產業鏈
地圖產業鏈
活躍統計
第一張圖是一份14年的統計報告,這份統計報告統計不太全面,部分導航應用沒有被包含在內。
在這份統計報告中,我們發現高德是唯一一個覆蓋整條產業鏈的企業,在產業鏈的每個環節都存在高德的身影。
2014年4月,阿里對高德完成了15億美元的收購,高德成為阿里旗下全資子公司。