<簡書 — 劉小壯> http://www.jianshu.com/p/41179be5893aandroid
本人現就任於國內某地圖導航公司,這篇文章是我前段時間在公司組織技術分享的一個PPT,文章內容也主要由這個PPT的內容爲主,經過這篇文章能夠很好的幫你瞭解地圖導航這個行業的相關技術。算法
PPT內容主要包括地圖相關專業知識、百度和高德SDK總體框架、數據來源、行業概覽等組成。其中關於地圖引擎相關的技術知識,我向公司地圖引擎開發同事求證過,這個PPT也給他們看過,也幫忙指出了其中的一些問題。服務器
這篇文章主要用於分享,其中若是有什麼問題,還請多多指出,謝謝!網絡
經緯度是一種地理座標系統,主要用來表示地球的球面座標系,經緯度能夠定位地球的任何一個位置。南北方向的稱爲緯度
,東西方向稱爲經度
。數據結構
緯度:赤道緯度
周長最長,離赤道越遠緯度
周長越短,也就更加靠近南北極。赤道以南稱爲南緯
,赤道以北稱爲北緯
。緯度
取值範圍是0-90,赤道緯度
最小爲0,兩級最大。架構
經度:經度
也叫子午線,任意兩條經線長度相等,起始點都在南北極。經度
以本初子午線爲區分,以東稱爲東經
,以西稱爲西經
,東經
爲正數,西經
爲負數。經度
取值範圍在0-180,本初子午線爲0。東經
180度也就是西經
180度就是白令海峽,白令海峽就是國際換日線,日期相差一天。app
按照經度
,地球被分爲24個時區,每一個時區又有分,分又包含秒。框架
作地圖,投影
的概念很重要。咱們的地球是圓形的,地球的座標是一個球面座標,球面座標是三維座標(x、y、z),而咱們的地圖是是二維的(x、y),須要將球面的三維座標轉換爲平面的二維座標。工具
座標轉換久用到了投影
的概念,經常使用的投影
有:圓柱投影
、圓錐投影
、方位投影
,而在咱們地圖導航中使用墨卡託投影
。性能
百度、高德、Google都使用墨卡託投影
,墨卡託投影
有一個很大的弊端,就是在高緯度(南緯
、北緯
)地區產生巨大的變形。變形比較嚴重的地方在於俄羅斯、格林蘭島、非洲、南極洲等高緯度地區。
上面五個國家分別是:俄羅斯、澳大利亞、中國、巴西、加拿大 咱們將這五個國家放在一個緯度
,來比較這五個國家,發現相差並不太大。可是若是放在上面那張圖中,俄羅斯頂好幾個中國大小。
國外開發者開發了一個網站,這個網站能夠將不一樣國家拉到同一個緯度
,這時候就能顯示出真正比例的國家面積。 網站地址:http://thetruesize.com/
古德投影
能夠避免地圖變形的問題,這種投影
將地圖分爲幾個部分,而後沿赤道將幾個部分鏈接在一塊兒。咱們發現上面的格林蘭島已經被分爲兩部分,這種投影
並不適合用於開發,並且看起來效果也不太好看。
把一張世界地圖顯示到手機裏是不可能的,因此就引入了金字塔模型
的概念(也就是比例尺
),咱們能夠根據不一樣的縮放比例,顯示不一樣的分辨率。
在地圖應用中,咱們用手指縮放和放大地圖,地圖顯示大小的變換,都是基於金字塔模型
來組織瓦片圖的。
和金字塔模型
配合使用的就是瓦片座標系
,在不一樣的縮放等級下,同一塊區域瓦片
個數也是不同的。
瓦片
越多就表明這一區域顯示越詳細,縮放比例也就越大。瓦片座標系
在2D和3D的場景下都會被使用,咱們在網絡很差的狀況下能夠看到地圖瓦片
的加載過程以及瓦片
的大小、位置。
CLLocationManager
中的經緯度加密(WGS-84
)MKMapView
中的經緯度加密(GCJ-02
)GCJ-02
)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
數據,在地圖上通常都以氣泡或大頭針表示。
數據採集能夠經過車載GPS
攝像機採集,或從服務性互聯網企業抓取或購買,因爲百度和高德提供了對外的SDK,經過用戶使用地圖SDK也能夠獲取一些數據。
百度的地圖數據主要依賴於四維圖新和道道通,高德地圖主要以自採爲主。通常這些數據也會和大衆點評、攜程、口碑等互聯網服務商購買,相互之間也會購買POI
數據。
2D場景:輕地圖應用,簡單的位置分享、興趣點標註、線路展現等。2D模型
展現效果不太好,在縮放比例較小的狀況下,看起來比較模糊(縮放比例大一些看起來清晰度還能夠)。
柵格模型
對於某一個地方的描述,是經過不少層圖片疊加組成的,每層表明不一樣信息(例如道路)。柵格模型
通常都會先渲染一個底圖,而後是在底圖的基礎上疊加路況、POI
等圖層。
珊格圖都是在服務器預處理的圖片,從服務器下載處理好的圖片到本地進行拼接便可,因爲下載到本地是圖片,本地不能再對圖層進行更改。對於性能上來講,服務器進行圖片合成性能消耗較大,可是客戶端性能消耗比較小,內存佔用也比較小,用起來會比較流暢。
3D場景:重地圖應用,以LBS
爲核心功能,須要離線地圖、更好的渲染效果、app內導航的。好比打車應用、出行導航類應用,3D模型
渲染後的效果比較好,通常使用導航功能都必須用這個3D模型
。
矢量數據是從服務器將地圖數據下載下來,而後在客戶端進行合成繪製的,因此咱們能夠對地圖的顯示進行控制,可定製性更強。矢量圖
看起來更佳清晰,渲染效果比較好。可是矢量圖
對手機性能消耗很厲害,手機內存佔用比較高,CPU
、GPU
消耗都很大。對於服務器性能消耗就比2D場景
性能小一些,由於服務器只是加載原始數據和向客戶端進行傳輸,將合成繪製等這些圖層渲染的繪製處理交給客戶端來作。提升了客戶端靈活性和更好的效果,犧牲了客戶端的性能,有利有弊。
三維地圖
是以三維地圖數據爲基礎開發的,三維地圖
看起來更佳立體化,地圖上能夠呈現出立體建築及陰影的效果,並且地圖隨着用戶的操做,樓宇的角度、陰影等效果也會隨之發生變化。
在三維地圖
過渡過程當中,也出現過假三維地圖
。這種地圖只能進行平面平移,不能進行旋轉操做,是數據平面地圖
和三維地圖
過渡的產物。
百度地圖目前已經能夠支持部分國家的國外地圖服務,例如新加坡、韓國、日本、泰國等國家。能夠在最新的百度地圖app上直接查看、搜索這些國家的一些POI
,以及使用導航等功能。
目前爲止只有百度一家支持國外地圖服務,高德暫時不支持這項服務。在百度和高德不支持的地方,因爲服務器沒有數據,因此不會作渲染,看起來白白的一片。
實景地圖
最開始是Google
研發的,這項技術須要軟件和硬件相互的配合,以及大量的數據處理才能完成。
採集實景須要各式實景採集工具,包括汽車採集、自行車採集、人力採集等,這主要是因爲須要應對各類採集地點。採集時將數據實時綁定GPS
位置,這樣就清楚是在哪一個位置採集的。
數據採集後須要工程師將數據進行復雜處理,才能造成咱們看到的實景數據。實景數據
通常都是靜態的,並且不是實時更新的。實景數據
爲了保護被採集人的用戶隱私,須要對關鍵部位進行模糊處理,例如臉、車牌照等。
室內定位
是一種結合3D定位
的定位模式,這種定位能夠在室內進行定位。室內定位直接定位某個商鋪在幾樓的某個位置,並且能夠選擇樓層。
在傳統的定位中,樓內因爲是多層,會致使定位重疊的問題,並且樓內GPS
信號也不太好甚至沒有。因此出現了一些新技術來實現樓內定位:AGPS
(輔助全球衛星定位系統)、Wi-Fi指紋
定位、zigbee芯片
定位、RFID智能標籤技術
、以及蘋果推出的ibeacon
,其中高德使用的是Wi-Fi指紋定位
技術。
首先是由百度率先支持熱力圖
功能,熱力圖
功能預示着大數據時代愈來愈近。熱力圖是根據百度地圖移動客戶端和SDK在這些地區的使用狀況推斷出來的,這些推斷數據能夠是網絡請求、打開次數等,經過這些數據推斷出人員分佈。經過以前百度在CCTV
的報道來看,經過這些數據甚至能夠預測景區擁堵,防止大型踩踏等羣體性事件。
熱力圖
隨着同一區域的密集程度變化,顏色隨之變深。可是因爲統計方式的特色,統計的數據並不太準確,例如白天和夜間就有很大區別,只是看成參考。
Annotation
:單點標註,繼承自UIView
,可使用UIView
的一些基礎屬性,引入了重用機制(百度也是一樣的實現,包括一些打車軟件的小車,都是使用Annotation
實現)。
Overlay
:多點標註,引擎直接渲染,能夠經過SDK的API自定義UI,多點標註用於標識路線或某一個區域。
Other
:雲搜索,地理編碼和逆地理編碼,導航路徑規劃,定位,POI
搜索等。
右邊圖片的高德logo是黑色,而且顯示在右下角,這是iOS
系統的MapKit.framework
左邊圖片的高德logo是藍色,而且顯示在左下角,這是高德本身的SDK。
蘋果的MapKit
只是使用了高德的數據,可是API是蘋果本身開發的。
openGLES
繪製C++
的手機系統平臺百度地圖對於高德地圖來講,增長了一些實用性的功能,例如熱力圖、騎行、個性化地圖等。這些功能都是高德所沒有的,固然高德也有一些很不錯的功能,二者各有優勢。
百度地圖和高德地圖都有2D和3D功能,2D純平面展現,沒有樓宇拔高效果。
百度SDK主要模塊劃分:
POI
,地理編碼、路徑規劃等)百度SDK分爲六個大的模塊,能夠按照需求下載對應的模塊,這樣使下載下來的SDK體積變小。
百度鑑權認證策略:用戶能夠經過兩種方式與百度開放雲進行交互,包括認證方式
和匿名方式
。在SDK中不少地方都用到了鑑權認證
,例如加載地圖時認證不經過不會顯示地圖,百度比較看重SDK的鑑權
。
百度地圖渲染分爲多個圖層渲染,每一個圖層渲染的目標也不同,地圖上自定義標註和覆蓋物統稱爲地圖覆蓋物,多個圖層疊加起來造成矢量圖
。百度地圖SDK地圖等級目前爲19級,能夠根據縮放等級的不一樣渲染建築物、道路、河流、學校、公園等內容。
百度地圖支持多點觸摸、雙擊放大、多點縮小、旋轉等手勢操做。而且支持畫點、折線、圓、多邊形等操做,而且能夠自定義熱力圖
、瓦片圖
等。
百度地圖在16年1月份推出了個性化地圖
,SDK提供了個性化地圖模版,經過地圖模版更改底圖顏色和樣式。從百度開發者平臺下載到模版,經過地圖模版能夠修改地面、水系、草地、道路、鐵路、地鐵、POI
等顏色和樣式,而後調用SDK提供的方法讀取該模版便可。
第一張圖是一份14年的統計報告,這份統計報告統計不太全面,部分導航應用沒有被包含在內。
在這份統計報告中,咱們發現高德是惟一一個覆蓋整條產業鏈的企業,在產業鏈的每一個環節都存在高德的身影。
2014年4月,阿里對高德完成了15億美圓的收購,高德成爲阿里旗下全資子公司。
這篇文章是我在公司內部組織的一次技術分享,也能夠說是技術分析。當時是經過一份PDF進行分享的,我將PDF發在這裏,你們能夠下載看看,經過PDF看更加直觀。
下載地址 密碼:9hsc