該文章屬于劉小壯原創(chuàng)膀跌,轉載請注明:劉小壯
本人現就職于國內某地圖導航公司掠剑,這篇文章是我前段時間在公司組織技術分享的一個PPT,文章內容也主要由這個PPT的內容為主兄猩,通過這篇文章可以很好的幫你了解地圖導航這個行業(yè)的相關技術掌栅。
PPT內容主要包括地圖相關專業(yè)知識本涕、百度和高德SDK整體框架、數據來源收津、行業(yè)概覽等組成饿这。其中關于地圖引擎相關的技術知識浊伙,我向公司地圖引擎開發(fā)同事求證過,這個PPT也給他們看過长捧,也幫忙指出了其中的一些問題嚣鄙。
這篇文章主要用于分享,其中如果有什么問題串结,還請多多指出哑子,謝謝!
地圖開發(fā)專業(yè)知識
經緯度
經緯度是一種地理坐標系統(tǒng)肌割,主要用來表示地球的球面坐標系卧蜓,經緯度可以定位地球的任何一個位置。南北方向的稱為緯度
把敞,東西方向稱為經度
弥奸。
緯度:赤道緯度
周長最長,離赤道越遠緯度
周長越短奋早,也就更加靠近南北極盛霎。赤道以南稱為南緯
,赤道以北稱為北緯
伸蚯。緯度
取值范圍是0-90摩渺,赤道緯度
最小為0,兩級最大剂邮。
經度:經度
也叫子午線摇幻,任意兩條經線長度相等,起始點都在南北極挥萌。經度
以本初子午線為區(qū)分绰姻,以東稱為東經
,以西稱為西經
引瀑,東經
為正數狂芋,西經
為負數。經度
取值范圍在0-180憨栽,本初子午線為0帜矾。東經
180度也就是西經
180度就是白令海峽,白令海峽就是國際換日線屑柔,日期相差一天屡萤。
按照經度
,地球被分為24個時區(qū)掸宛,每個時區(qū)又有分死陆,分又包含秒。
投影
做地圖唧瘾,投影
的概念很重要措译。我們的地球是圓形的别凤,地球的坐標是一個球面坐標,球面坐標是三維坐標(x领虹、y规哪、z),而我們的地圖是是二維的(x掠械、y)由缆,需要將球面的三維坐標轉換為平面的二維坐標。
坐標轉換久用到了投影
的概念猾蒂,常用的投影
有:圓柱投影
均唉、圓錐投影
、方位投影
肚菠,而在我們地圖導航中使用墨卡托投影
舔箭。
墨卡托投影
百度、高德蚊逢、Google都使用墨卡托投影
层扶,墨卡托投影
有一個很大的弊端,就是在高緯度(南緯
烙荷、北緯
)地區(qū)產生巨大的變形镜会。變形比較嚴重的地方在于俄羅斯、格林蘭島终抽、非洲戳表、南極洲等高緯度地區(qū)。
上面五個國家分別是:俄羅斯昼伴、澳大利亞匾旭、中國、巴西圃郊、加拿大
我們將這五個國家放在一個緯度
价涝,來比較這五個國家,發(fā)現相差并不太大持舆。但是如果放在上面那張圖中色瘩,俄羅斯頂好幾個中國大小。
國外開發(fā)者開發(fā)了一個網站逸寓,這個網站可以將不同國家拉到同一個緯度
居兆,這時候就能顯示出真正比例的國家面積∠玻可以Google
搜一下,簡書不讓放地址汹买。
古德投影
古德投影
可以避免地圖變形的問題佩伤,這種投影
將地圖分為幾個部分聊倔,然后沿赤道將幾個部分連接在一起。我們發(fā)現上面的格林蘭島已經被分為兩部分生巡,這種投影
并不適合用于開發(fā)耙蔑,而且看起來效果也不太好看。
金字塔模型
把一張世界地圖顯示到手機里是不可能的孤荣,所以就引入了金字塔模型
的概念(也就是比例尺
)甸陌,我們可以根據不同的縮放比例,顯示不同的分辨率盐股。
在地圖應用中钱豁,我們用手指縮放和放大地圖,地圖顯示大小的變換疯汁,都是基于金字塔模型
來組織瓦片圖的牲尺。
瓦片坐標系
和金字塔模型
配合使用的就是瓦片坐標系
,在不同的縮放等級下幌蚊,同一塊區(qū)域瓦片
個數也是不一樣的谤碳。
瓦片
越多就代表這一區(qū)域顯示越詳細伶棒,縮放比例也就越大叮称。瓦片坐標系
在2D和3D的場景下都會被使用辣垒,我們在網絡不好的情況下可以看到地圖瓦片
的加載過程以及瓦片
的大小充尉、位置业岁。
坐標加密
-
CLLocationManager
中的經緯度加密(WGS-84
) -
MKMapView
中的經緯度加密(GCJ-02
) - 高德SDK中的經緯度加密(
GCJ-02
) - 百度SDK中的經緯度加密(使用
GCJ-02
再次加密辣辫,叫做BD-09
)
根據中國法律規(guī)定兽掰,地圖提供商必須對地圖經緯度進行偏移肌似,國測局制定了一套加密標準讯赏,就是常用的GCJ-02
垮兑。經緯度坐標
加密主要有兩種格式,GPS坐標系 (WGS-84
) 和火星坐標系 (GCJ-02
) 漱挎,加密算法是開源的系枪,可以搜索到。
國際經緯度坐標標準為WGS-84
磕谅,國內必須至少使用國測局制定的GCJ-02
私爷,對地理位置進行首次加密。由于每家導航SDK提供方加密都不統(tǒng)一膊夹,所以百度衬浑、高德、谷歌多家地圖數據并不統(tǒng)一放刨,需要再次進行轉換工秩。
地圖定位
移動端定位方式主要有三種:GPS
、Wi-Fi
、基站
助币,但是android
和iOS
還不太一樣浪听,android
可以讓用戶選擇和設置那種定位方式,但是iOS
是由系統(tǒng)為我們選擇的眉菱,我們沒有操作定位方式的權限迹栓。iOS
不允許有第三方定位,所以現在地圖應用都是對系統(tǒng)定位進行的封裝俭缓。如果有GPS
信號克伊,iOS
系統(tǒng)會優(yōu)先選擇GPS
方式定位,然后是Wi-Fi
定位华坦,如果Wi-Fi
信號不好就會選擇基站
定位愿吹。
在定位中精確度最高的是Google
,Google
利用大數據分析季春,記錄每一次利用Google
地圖的定位洗搂。下次再次定位時,直接根據Mac地址
等信息進行分析载弄,提高定位精確度耘拇。
比較悲催的一個問題就是,有一些比較老的iOS
機器宇攻,沒有GPS
定位模塊惫叛,例如一些老版本iPad
,這種設備在沒有Wi-Fi
的情況下是無法定位的逞刷。
地理編碼和逆地理編碼
地理編碼
:即地理解析嘉涌,由詳細的結構化地址得到對應的經緯度信息,例如北京市海淀區(qū)中關村南大街27號
的地址夸浅,就可以獲取到一個唯一的經緯度信息仑最。
逆地理編碼
:即逆地理解析,由一個經緯度信息獲取一個結構化地址信息帆喇,例如lng:116.31985,lat:39.959836
經緯度警医,就可以獲取到類似于上面的地理信息。
在iOS
系統(tǒng)API坯钦、高德SDK预皇、百度SDK中,都為我們提供了地理編碼
和逆地理編碼
API婉刀,但是需要注意經緯度的轉換吟温,不同地圖SDK返回的經緯度加密方式不同,我們在傳入經緯度參數和接收經緯度參數時突颊,都需要做轉換鲁豪。
地圖數據來源
國內比較活躍的數據采集商主要是高德和四維圖新兩家潘悼,百度沒有數據采集資質(最近收購了道道通),所以數據主要依賴于四維圖新爬橡。
四維圖新和國家測繪局合作比較密切挥等,數據來源主要是國家測繪局提供,也有部分自己測繪的數據堤尾。高德測繪和航拍能力還不錯,主要自己測繪數據迁客,部分數據也依賴國測局提供郭宝。數據測繪單位互相之間都有合作,會相互購買自己沒有的數據掷漱。
在中國粘室,谷歌地圖或蘋果地圖等地圖開發(fā)商,數據來源幾乎都是這兩家公司卜范。
POI數據
POI
數據是一種矢量數據衔统,包括美食、商店海雪、銀行锦爵、加油站等都是POI
數據,在地圖上一般都以氣泡或大頭針表示奥裸。
數據采集可以通過車載GPS
攝像機采集险掀,或從服務性互聯網企業(yè)抓取或購買,由于百度和高德提供了對外的SDK湾宙,通過用戶使用地圖SDK也可以獲取一些數據樟氢。
百度的地圖數據主要依賴于四維圖新和道道通,高德地圖主要以自采為主侠鳄。一般這些數據也會和大眾點評埠啃、攜程、口碑等互聯網服務商購買伟恶,相互之間也會購買POI
數據碴开。
柵格-2D地圖
2D場景:輕地圖應用,簡單的位置分享知押、興趣點標注叹螟、線路展示等。2D模型
展示效果不太好台盯,在縮放比例較小的情況下罢绽,看起來比較模糊(縮放比例大一些看起來清晰度還可以)。
柵格模型
對于某一個地方的描述静盅,是通過很多層圖片疊加組成的良价,每層代表不同信息(例如道路)寝殴。柵格模型
一般都會先渲染一個底圖,然后是在底圖的基礎上疊加路況明垢、POI
等圖層蚣常。
珊格圖都是在服務器預處理的圖片,從服務器下載處理好的圖片到本地進行拼接即可痊银,由于下載到本地是圖片抵蚊,本地不能再對圖層進行更改。對于性能上來說溯革,服務器進行圖片合成性能消耗較大贞绳,但是客戶端性能消耗比較小,內存占用也比較小致稀,用起來會比較流暢冈闭。
矢量-3D地圖
3D場景:重地圖應用,以LBS
為核心功能抖单,需要離線地圖萎攒、更好的渲染效果、app內導航的矛绘。比如打車應用耍休、出行導航類應用,3D模型
渲染后的效果比較好货矮,一般使用導航功能都必須用這個3D模型
羹应。
矢量數據是從服務器將地圖數據下載下來,然后在客戶端進行合成繪制的次屠,所以我們可以對地圖的顯示進行控制园匹,可定制性更強。矢量圖
看起來更佳清晰劫灶,渲染效果比較好裸违。但是矢量圖
對手機性能消耗很厲害,手機內存占用比較高本昏,CPU
供汛、GPU
消耗都很大。對于服務器性能消耗就比2D場景
性能小一些涌穆,因為服務器只是加載原始數據和向客戶端進行傳輸怔昨,將合成繪制等這些圖層渲染的繪制處理交給客戶端來做。提高了客戶端靈活性和更好的效果宿稀,犧牲了客戶端的性能趁舀,有利有弊。
三維地圖
三維地圖
是以三維地圖數據為基礎開發(fā)的祝沸,三維地圖
看起來更佳立體化矮烹,地圖上可以呈現出立體建筑及陰影的效果越庇,而且地圖隨著用戶的操作,樓宇的角度奉狈、陰影等效果也會隨之發(fā)生變化卤唉。
在三維地圖
過渡過程中,也出現過假三維地圖
仁期。這種地圖只能進行平面平移桑驱,不能進行旋轉操作,是數據平面地圖
和三維地圖
過渡的產物跛蛋。
國外地圖
百度地圖目前已經可以支持部分國家的國外地圖服務碰纬,例如新加坡、韓國问芬、日本、泰國等國家寿桨〈诵疲可以在最新的百度地圖app上直接查看、搜索這些國家的一些POI
亭螟,以及使用導航等功能挡鞍。
目前為止只有百度一家支持國外地圖服務,高德暫時不支持這項服務预烙。在百度和高德不支持的地方墨微,由于服務器沒有數據,所以不會做渲染扁掸,看起來白白的一片翘县。
實景地圖
實景地圖
最開始是Google
研發(fā)的,這項技術需要軟件和硬件相互的配合谴分,以及大量的數據處理才能完成锈麸。
采集實景需要各式實景采集工具,包括汽車采集牺蹄、自行車采集忘伞、人力采集等,這主要是由于需要應對各種采集地點沙兰。采集時將數據實時綁定GPS
位置氓奈,這樣就清楚是在哪個位置采集的。
數據采集后需要工程師將數據進行復雜處理鼎天,才能形成我們看到的實景數據舀奶。實景數據
一般都是靜態(tài)的,而且不是實時更新的斋射。實景數據
為了保護被采集人的用戶隱私伪节,需要對關鍵部位進行模糊處理光羞,例如臉、車牌照等怀大。
室內地圖
室內定位
是一種結合3D定位
的定位模式纱兑,這種定位可以在室內進行定位。室內定位直接定位某個商鋪在幾樓的某個位置化借,而且可以選擇樓層潜慎。
在傳統(tǒng)的定位中,樓內由于是多層蓖康,會導致定位重疊的問題铐炫,而且樓內GPS
信號也不太好甚至沒有。所以出現了一些新技術來實現樓內定位:AGPS
(輔助全球衛(wèi)星定位系統(tǒng))蒜焊、Wi-Fi指紋
定位倒信、zigbee芯片
定位、RFID智能標簽技術
泳梆、以及蘋果推出的ibeacon
鳖悠,其中高德使用的是Wi-Fi指紋定位
技術。
百度熱力圖
首先是由百度率先支持熱力圖
功能优妙,熱力圖
功能預示著大數據時代越來越近乘综。熱力圖是根據百度地圖移動客戶端和SDK在這些地區(qū)的使用情況推斷出來的,這些推斷數據可以是網絡請求套硼、打開次數等卡辰,通過這些數據推斷出人員分布。通過之前百度在CCTV
的報道來看邪意,通過這些數據甚至可以預測景區(qū)擁堵九妈,防止大型踩踏等群體性事件。
熱力圖
隨著同一區(qū)域的密集程度變化雾鬼,顏色隨之變深允蚣。但是由于統(tǒng)計方式的特點,統(tǒng)計的數據并不太準確呆贿,例如白天和夜間就有很大區(qū)別嚷兔,只是當作參考。
地圖SDK架構
高德SDK結構
Annotation
:單點標注做入,繼承自UIView
冒晰,可以使用UIView
的一些基礎屬性,引入了重用機制(百度也是同樣的實現竟块,包括一些打車軟件的小車壶运,都是使用Annotation
實現)。
Overlay
:多點標注浪秘,引擎直接渲染蒋情,可以通過SDK的API自定義UI埠况,多點標注用于標識路線或某一個區(qū)域。
Other
:云搜索棵癣,地理編碼和逆地理編碼辕翰,導航路徑規(guī)劃,定位狈谊,POI
搜索等喜命。
MapKit和高德SDK區(qū)別
右邊圖片的高德logo是黑色,并且顯示在右下角河劝,這是iOS
系統(tǒng)的MapKit.framework
左邊圖片的高德logo是藍色壁榕,并且顯示在左下角,這是高德自己的SDK赎瞎。
蘋果的MapKit
只是使用了高德的數據牌里,但是API是蘋果自己開發(fā)的。
百度地圖SDK框架
跨平臺引擎:
- 百度地圖的地圖引擎使用
openGLES
繪制 - 能夠運行于支持
C++
的手機系統(tǒng)平臺 - 不同平臺對應用層保持一致的API接口
- 提供能夠滿足應用層的基礎數據結構
- 盡量少的依賴系統(tǒng)接口务甥,提高可移植性
- 靈活性和可擴展性
百度地圖對于高德地圖來說牡辽,增加了一些實用性的功能,例如熱力圖缓呛、騎行、個性化地圖等杭隙。這些功能都是高德所沒有的哟绊,當然高德也有一些很不錯的功能,兩者各有優(yōu)點痰憎。
百度地圖和高德地圖都有2D和3D功能票髓,2D純平面展示,沒有樓宇拔高效果铣耘。
百度地圖SDK框架
百度SDK主要模塊劃分:
- 地圖(基礎功能洽沟,地圖顯示以及操作和各種覆蓋物圖層)
- 檢索(
POI
,地理編碼蜗细、路徑規(guī)劃等) - 定位(提供獨立定位模塊裆操,經緯度根據國測局二次加密)
- 工具(調用百度客戶端,坐標轉換等)
- 周邊雷達(檢索用戶信息炉媒,查找附近的人踪区,主要用于社交)
- LBS云(區(qū)域檢索,百度服務器存儲數據吊骤,可以自己操作缎岗,屬于開發(fā)者自有數據)
百度SDK分為六個大的模塊,可以按照需求下載對應的模塊白粉,這樣使下載下來的SDK體積變小传泊。
百度鑒權認證策略:用戶可以通過兩種方式與百度開放云進行交互鼠渺,包括認證方式
和匿名方式
。在SDK中很多地方都用到了鑒權認證
眷细,例如加載地圖時認證不通過不會顯示地圖拦盹,百度比較看重SDK的鑒權
。
圖層渲染
百度地圖渲染分為多個圖層渲染薪鹦,每個圖層渲染的目標也不一樣掌敬,地圖上自定義標注和覆蓋物統(tǒng)稱為地圖覆蓋物,多個圖層疊加起來形成矢量圖
池磁。百度地圖SDK地圖等級目前為19級奔害,可以根據縮放等級的不同渲染建筑物、道路地熄、河流华临、學校、公園等內容端考。
百度地圖支持多點觸摸雅潭、雙擊放大、多點縮小却特、旋轉等手勢操作扶供。并且支持畫點、折線裂明、圓椿浓、多邊形等操作,并且可以自定義熱力圖
闽晦、瓦片圖
等扳碍。
百度個性化地圖
百度地圖在16年1月份推出了個性化地圖
,SDK提供了個性化地圖模版仙蛉,通過地圖模版更改底圖顏色和樣式笋敞。從百度開發(fā)者平臺下載到模版,通過地圖模版可以修改地面荠瘪、水系夯巷、草地、道路哀墓、鐵路鞭莽、地鐵、POI
等顏色和樣式麸祷,然后調用SDK提供的方法讀取該模版即可澎怒。
地圖產業(yè)鏈
第一張圖是一份14年的統(tǒng)計報告,這份統(tǒng)計報告統(tǒng)計不太全面,部分導航應用沒有被包含在內喷面。
在這份統(tǒng)計報告中星瘾,我們發(fā)現高德是唯一一個覆蓋整條產業(yè)鏈的企業(yè),在產業(yè)鏈的每個環(huán)節(jié)都存在高德的身影惧辈。
2014年4月琳状,阿里對高德完成了15億美元的收購,高德成為阿里旗下全資子公司盒齿。
這篇文章是我在公司內部組織的一次技術分享念逞,也可以說是技術分析。當時是通過一份PDF進行分享的边翁,我將PDF發(fā)在這里翎承,大家可以下載看看,通過PDF看更加直觀符匾。
下載地址
密碼:9hsc