移動端地圖技術分享

該文章屬于劉小壯原創(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)一放刨,需要再次進行轉換工秩。

地圖定位
地圖定位

移動端定位方式主要有三種:GPSWi-Fi基站助币,但是androidiOS還不太一樣浪听,android可以讓用戶選擇和設置那種定位方式,但是iOS是由系統(tǒng)為我們選擇的眉菱,我們沒有操作定位方式的權限迹栓。iOS不允許有第三方定位,所以現在地圖應用都是對系統(tǒng)定位進行的封裝俭缓。如果有GPS信號克伊,iOS系統(tǒng)會優(yōu)先選擇GPS方式定位,然后是Wi-Fi定位华坦,如果Wi-Fi信號不好就會選擇基站定位愿吹。

在定位中精確度最高的是GoogleGoogle利用大數據分析季春,記錄每一次利用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數據是一種矢量數據衔统,包括美食、商店海雪、銀行锦爵、加油站等都是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結構
高德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框架
百度地圖SDK框架
跨平臺引擎:
  • 百度地圖的地圖引擎使用openGLES繪制
  • 能夠運行于支持C++的手機系統(tǒng)平臺
  • 不同平臺對應用層保持一致的API接口
  • 提供能夠滿足應用層的基礎數據結構
  • 盡量少的依賴系統(tǒng)接口务甥,提高可移植性
  • 靈活性和可擴展性

百度地圖對于高德地圖來說牡辽,增加了一些實用性的功能,例如熱力圖缓呛、騎行、個性化地圖等杭隙。這些功能都是高德所沒有的哟绊,當然高德也有一些很不錯的功能,兩者各有優(yōu)點痰憎。

百度地圖和高德地圖都有2D和3D功能票髓,2D純平面展示,沒有樓宇拔高效果铣耘。

百度地圖SDK框架
百度地圖SDK框架

百度SDK主要模塊劃分:

  • 地圖(基礎功能洽沟,地圖顯示以及操作和各種覆蓋物圖層)
  • 檢索(POI,地理編碼蜗细、路徑規(guī)劃等)
  • 定位(提供獨立定位模塊裆操,經緯度根據國測局二次加密)
  • 工具(調用百度客戶端,坐標轉換等)
  • 周邊雷達(檢索用戶信息炉媒,查找附近的人踪区,主要用于社交)
  • LBS云(區(qū)域檢索,百度服務器存儲數據吊骤,可以自己操作缎岗,屬于開發(fā)者自有數據)

百度SDK分為六個大的模塊,可以按照需求下載對應的模塊白粉,這樣使下載下來的SDK體積變小传泊。

百度鑒權認證策略:用戶可以通過兩種方式與百度開放云進行交互鼠渺,包括認證方式匿名方式。在SDK中很多地方都用到了鑒權認證眷细,例如加載地圖時認證不通過不會顯示地圖拦盹,百度比較看重SDK的鑒權

圖層渲染
圖層渲染

百度地圖渲染分為多個圖層渲染薪鹦,每個圖層渲染的目標也不一樣掌敬,地圖上自定義標注和覆蓋物統(tǒng)稱為地圖覆蓋物,多個圖層疊加起來形成矢量圖池磁。百度地圖SDK地圖等級目前為19級奔害,可以根據縮放等級的不同渲染建筑物、道路地熄、河流华临、學校、公園等內容端考。

百度地圖支持多點觸摸雅潭、雙擊放大、多點縮小却特、旋轉等手勢操作扶供。并且支持畫點、折線裂明、圓椿浓、多邊形等操作,并且可以自定義熱力圖闽晦、瓦片圖等扳碍。

百度個性化地圖
百度個性化地圖

百度地圖在16年1月份推出了個性化地圖,SDK提供了個性化地圖模版仙蛉,通過地圖模版更改底圖顏色和樣式笋敞。從百度開發(fā)者平臺下載到模版,通過地圖模版可以修改地面荠瘪、水系夯巷、草地、道路哀墓、鐵路鞭莽、地鐵、POI等顏色和樣式麸祷,然后調用SDK提供的方法讀取該模版即可澎怒。


地圖產業(yè)鏈

地圖產業(yè)鏈
活躍統(tǒng)計

第一張圖是一份14年的統(tǒng)計報告,這份統(tǒng)計報告統(tǒng)計不太全面,部分導航應用沒有被包含在內喷面。

在這份統(tǒng)計報告中星瘾,我們發(fā)現高德是唯一一個覆蓋整條產業(yè)鏈的企業(yè),在產業(yè)鏈的每個環(huán)節(jié)都存在高德的身影惧辈。

2014年4月琳状,阿里對高德完成了15億美元的收購,高德成為阿里旗下全資子公司盒齿。


這篇文章是我在公司內部組織的一次技術分享念逞,也可以說是技術分析。當時是通過一份PDF進行分享的边翁,我將PDF發(fā)在這里翎承,大家可以下載看看,通過PDF看更加直觀符匾。

下載地址
密碼:9hsc

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末叨咖,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子啊胶,更是在濱河造成了極大的恐慌甸各,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焰坪,死亡現場離奇詭異趣倾,居然都是意外死亡,警方通過查閱死者的電腦和手機某饰,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門儒恋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人露乏,你說我怎么就攤上這事碧浊⊥垦” “怎么了瘟仿?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長比勉。 經常有香客問我劳较,道長,這世上最難降的妖魔是什么浩聋? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任观蜗,我火速辦了婚禮,結果婚禮上衣洁,老公的妹妹穿的比我還像新娘墓捻。我一直安慰自己,他們只是感情好坊夫,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布砖第。 她就那樣靜靜地躺著撤卢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梧兼。 梳的紋絲不亂的頭發(fā)上放吩,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音羽杰,去河邊找鬼渡紫。 笑死,一個胖子當著我的面吹牛考赛,可吹牛的內容都是我干的惕澎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欲虚,長吁一口氣:“原來是場噩夢啊……” “哼集灌!你這毒婦竟也來了?” 一聲冷哼從身側響起复哆,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤欣喧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梯找,有當地人在樹林里發(fā)現了一具尸體唆阿,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年锈锤,在試婚紗的時候發(fā)現自己被綠了驯鳖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡久免,死狀恐怖浅辙,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情阎姥,我是刑警寧澤记舆,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站呼巴,受9級特大地震影響泽腮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜衣赶,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一诊赊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧府瞄,春花似錦碧磅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敲街。三九已至,卻和暖如春严望,著一層夾襖步出監(jiān)牢的瞬間多艇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工像吻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峻黍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓拨匆,卻偏偏與公主長得像姆涩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惭每,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容