API Reference 系列 之Mapkit解析

前言

最近要開發(fā)一個地圖相關的工具,于是去蘋果開發(fā)者官網(wǎng)查閱了資料怕膛。發(fā)現(xiàn)網(wǎng)站更新了API Reference 的文檔結(jié)構(gòu)庶溶,聚合了Framework的Guide和所有類,變得很清晰閱讀垒棋。

雖然官網(wǎng)的Guide解釋的已經(jīng)比較清楚卒煞,但是不夠直觀。于是結(jié)合官網(wǎng)資料叼架,對Mapkit做了一些思維導圖畔裕,并做了一些注解。

本文章適合有OC基礎乖订,但對Mapkit不了解的同學扮饶。另外,本文章只大概說明Mapkit的作用和相關類垢粮,不做具體API說明贴届。

概要

馬斯克在一次訪談中,談到他眼中的第一原理蜡吧,簡單來說就是從本質(zhì)一層層往上走毫蚓。

所以我們認識和學習一個事物,我覺得要從四個角度去考慮:

  • 這個事務是什么
  • 這個事務解決了什么問題
  • 具體是怎么解決的
  • 解決的詳細步驟是什么

本文章中主要針對Mapkit討論了前三個問題昔善,第四個問題則需要使用Mapkit的同學結(jié)合官網(wǎng)和其他網(wǎng)站上的Demo元潘,去自己實踐。即本文將要討論的三個問題:

  • Mapkit是什么
  • Mapkit解決了什么問題
  • Mapkit是怎么解決這些問題的

詳解

Mapkit是什么

我們先看下官網(wǎng)的簡要解釋:

Location-based information consists of two pieces: location services and maps. Location services are provided by the Core Location framework, which defines Objective-C interfaces for obtaining information about the user’s location and heading (the direction in which a device is pointing). Maps are provided by the Map Kit framework, which supports both the display and annotation of maps similar to those found in the Maps app. (To use the features of the Map Kit framework, you must turn on the Maps capability in your Xcode project.) Location services and maps are available on both iOS and OS X.

簡單來說就是 Location framework 提供了定位和設備方向服務君仆,MapKit提供了地圖的標注和地圖展示服務翩概。

Mapkit解決了什么問題

通過Mapkit,我們可以獲取當前定位返咱、地圖展示钥庇、標注、覆蓋物咖摹、地理編碼和反地理編碼评姨、位置檢測、設備方向判斷萤晴、獲取路線信息吐句、地理位置查詢等地圖相關的操作胁后。

Mapkit是怎么解決這些問題的

Mapkit有很多類,針對以上的功能嗦枢,畫了一個思維導圖攀芯,方便梳理。


地圖相關概念

定位

iOS中獲取用戶當前坐標的方式有兩種:

  • 通過Core Loation FrameworkCLLocationManager
  • 通過Mapkit的MKMapViewuserLocation獲取(需要設置showsUserLocation)

從iOS8 開始文虏,以上兩種方式獲取當前坐標時侣诺,都需要手動調(diào)用請求授權(quán)API:

  • 配置plist中的授權(quán)提示文案,key為 NSLocationWhenInUseUsageDescription (前臺) 或 NSLocationAlwaysUsageDescription(前臺择葡,后臺)
  • 手動調(diào)用CLLocationManagerrequestWhenInUseAuthorizationrequestAlwaysAuthorization紧武,進行定位授權(quán)

通過CLLocationManager進行定位的基本步驟:

  • 配置 CLLocationManager
  • 調(diào)用 requestWhenInUseAuthorizationrequestAlwaysAuthorization
  • 實現(xiàn)CLLocationManagerDelegate

通過Mapkit中獲取展示當前定位點的基本步驟:

  • 創(chuàng)建MKMapView
  • 設定showsUserLocation=YES
  • 實現(xiàn) MKMapViewDelegatemapView:didUpdateUserLocation:

注:

  1. CLLocationManager獲得的坐標類型是WGS84坐標(即真實的地理坐標),MKMapView獲得的坐標類型為GCJ02(即國測局經(jīng)緯度坐標,高德用該坐標系)
  2. 從iOS8以后敏储,MKMapView只有展示后上才會啟動定位,單獨alloc一個MKMapView朋鞍,并不會啟動定位已添。
  3. 相關的類:CLLocationManagerMKMapView

地圖展示

展示地圖是通過MKMapView類滥酥,初始化MKMapView更舞,即可展示普通地圖或衛(wèi)星地圖。這里不細說MKMapView類坎吻,相關的資料很多缆蝉,主要提幾個點。

這里有三種坐標系

  • 地球的經(jīng)緯度坐標瘦真。通過結(jié)構(gòu)CLLocationCoordinate2D表示
  • 墨卡托坐標刊头。即地圖上的點,通過MKMapPoint表示
  • view上的坐標诸尽。即iOS的view坐標系原杂,通過CGPoint表示

三種坐標系的相關類見下面的思維導圖:


三種坐標系

有些情況,不需要展示一個完整的MKMapView您机,只需要展示a map image即可穿肄。則可以通過MKMapSnapshotter異步生成一個 static map image

  • 配置MKMapSnapshotOptions
  • 初始化MKMapSnapshotter
  • 調(diào)用startWithCompletionHandler:異步獲得地圖圖片

標注 Annotation

Annotation际看,就是地圖上的常見的大頭針等標注咸产。Annotation的設計遵循數(shù)據(jù)與View分離的原則,數(shù)據(jù)為符合MKAnnotation協(xié)議的類仲闽,View為MKAnnotationView的子類脑溢,添加的基本步驟如下:

  • 定義一個 MKPointAnnotation 對象,添加數(shù)據(jù)
  • 使用 MKMapViewaddAnnotation: 方法添加到地圖
  • 實現(xiàn) mapView:viewForAnnotation: 代理方法
  • 在代理內(nèi)定義 MKPinAnnotationView 對象

通過上面幾個步驟蔼囊,即可顯示標準的大頭針焚志。如果要顯示自定義標注衣迷,把MKPointAnnotation對象替換為自定義MKAnnotation,把MKPinAnnotationView替換為自定義的MKAnnotationView即可酱酬。

另外壶谒,在這塊還有一個點是Callout,即自定義氣泡膳沽,如下圖是一個標準的Callout展示汗菜。通過MKAnnotationViewcanShowCalloutrightCalloutAccessoryView挑社、leftCalloutAccessoryView三個屬性控制陨界。

Callout

覆蓋物 Overlay

簡單來說,覆蓋物就是在地圖上畫的線痛阻,圓菌瘪,矩形等等。覆蓋物的設計也遵循數(shù)據(jù)與View分離的原則阱当。一個Overlay對象對應一個OverlayRenderer對象俏扩。

  • Overlay 對象,通過實現(xiàn) MKOverlay 協(xié)議弊添,定義數(shù)據(jù)÷嫉現(xiàn)有的Overlay對象有:MKPolylineMKPolygon油坝、 MKCircle以及 MATileOverlay嫉戚。
  • Overlay 渲染器,通過繼承 MKOverlayRenderer澈圈,用于在地圖顯示 Overlay彬檀。以上Overlay對應的渲染器對象有:MKPolylineRendererMKPolygonRenderer极舔、MKCircleRenderer以及 MKTileOverlayRenderer凤覆。

更加復雜的自定義可以詳見Location and Maps Programming Guide中的解釋。

Geocoding and reverse-geocoding

geocoding拆魏,地理編碼盯桦,即通過地理位置信息轉(zhuǎn)化為坐標點。reverse-geocoding,反地理編碼渤刃,即通過坐標點轉(zhuǎn)化為地理位置信息拥峦。主要通過CLGeocoder實現(xiàn)。

Region Monitoring And iBeacon

區(qū)域檢測用于監(jiān)測固定區(qū)域內(nèi)的定位變化卖子,在iOS上有兩種方式略号,第一種是通過CLLocationManager監(jiān)控指定區(qū)域(circular Region),另一種是通過藍牙區(qū)域檢測(Beacon Region)。其中藍牙參見Core Bluetooth framework

Heading

通過CLLocationManager可以獲取當前設備的方向玄柠。

Direction

Mapkit可以通過MKDirections獲取指定的路線信息

地理信息查詢

Mapkit支持用戶查詢地理位置信息突梦,主要步驟為:

  • 初始化MKLocalSearchRequest,配置查詢參數(shù)
  • 初始化MKLocalSearch
  • 調(diào)用startWithCompletionHandler:獲取查詢結(jié)果

后記

本篇文章主要梳理了地圖功能羽利,并未詳細分析API的使用宫患,只作為地圖框架參考,具體使用請查詢相關API資料这弧,并結(jié)合Demo進行練習娃闲。

附錄

第一原理

馬斯克在訪談中表述他眼中的第一原理:

我們運用「第一原理思維」而不是「比較思維」去思考問題是非常重要的。我們在生活中總是傾向于比較——別人已經(jīng)做過了或者正在做這件事情匾浪,我們就也去做皇帮。這樣的結(jié)果是只能產(chǎn)生細小的迭代發(fā)展〉氨玻「第一原理」的思考方式是用物理學的角度看待世界的方法属拾,也就是說一層層剝開事物的表象,看到里面的本質(zhì)冷溶,然后再從本質(zhì)一層層往上走捌年。這要消耗大量的腦力。

更多解釋參見馬斯克的「第一原理」到底是什么挂洛?

火星坐標

簡單來說就是對GPS坐標進行偏移后得到的坐標,就是所謂的火星坐標眠砾。國測局要求國內(nèi)地圖上的坐標都要經(jīng)過偏移虏劲,即國內(nèi)地圖上的坐標都是火星坐標。下面是幾種國內(nèi)的經(jīng)緯度褒颈。

  • wgs84柒巫,GPS經(jīng)緯度
  • gcj02,國測局經(jīng)緯度偏移坐標谷丸,高德用該坐標系
  • bd09堡掏,百度經(jīng)緯度坐標,百度在gcj02的基礎上再次進行了偏移

這里需要注意的是CLLocationManager進行定位獲得坐標是GPS坐標刨疼。

參考資料

MapKit API Reference
Location and Maps Programming Guide
高度地圖
百度地圖
Core Location Manager Changes in iOS 8
Core Location 最佳實踐 (WWDC 2016 - session716)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泉唁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子揩慕,更是在濱河造成了極大的恐慌亭畜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迎卤,死亡現(xiàn)場離奇詭異拴鸵,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吐限,你說我怎么就攤上這事溢豆。” “怎么了彬犯?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我溶耘,道長,這世上最難降的妖魔是什么服鹅? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任凳兵,我火速辦了婚禮,結(jié)果婚禮上企软,老公的妹妹穿的比我還像新娘庐扫。我一直安慰自己,他們只是感情好仗哨,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布形庭。 她就那樣靜靜地躺著,像睡著了一般厌漂。 火紅的嫁衣襯著肌膚如雪萨醒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天苇倡,我揣著相機與錄音富纸,去河邊找鬼。 笑死旨椒,一個胖子當著我的面吹牛晓褪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播综慎,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼涣仿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了示惊?” 一聲冷哼從身側(cè)響起好港,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涝涤,沒想到半個月后媚狰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡阔拳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年崭孤,在試婚紗的時候發(fā)現(xiàn)自己被綠了类嗤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辨宠,死狀恐怖遗锣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嗤形,我是刑警寧澤精偿,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站赋兵,受9級特大地震影響笔咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霹期,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一叶组、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧历造,春花似錦甩十、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至臣淤,卻和暖如春橄霉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邑蒋。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工酪劫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寺董。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像刻剥,于是被迫代替她去往敵國和親遮咖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容