前言
最近要開發(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 Framework
的CLLocationManager
- 通過Mapkit的
MKMapView
中userLocation
獲取(需要設置showsUserLocation
)
從iOS8 開始文虏,以上兩種方式獲取當前坐標時侣诺,都需要手動調(diào)用請求授權(quán)API:
- 配置plist中的授權(quán)提示文案,key為
NSLocationWhenInUseUsageDescription
(前臺) 或NSLocationAlwaysUsageDescription
(前臺择葡,后臺) - 手動調(diào)用
CLLocationManager
的requestWhenInUseAuthorization
或requestAlwaysAuthorization
紧武,進行定位授權(quán)
通過CLLocationManager
進行定位的基本步驟:
- 配置
CLLocationManager
- 調(diào)用
requestWhenInUseAuthorization
或requestAlwaysAuthorization
- 實現(xiàn)
CLLocationManagerDelegate
通過Mapkit中獲取展示當前定位點的基本步驟:
- 創(chuàng)建
MKMapView
- 設定
showsUserLocation=YES
- 實現(xiàn)
MKMapViewDelegate
的mapView:didUpdateUserLocation:
注:
-
CLLocationManager
獲得的坐標類型是WGS84坐標(即真實的地理坐標),MKMapView獲得的坐標類型為GCJ02(即國測局經(jīng)緯度坐標,高德用該坐標系) - 從iOS8以后敏储,
MKMapView
只有展示后上才會啟動定位,單獨alloc一個MKMapView
朋鞍,并不會啟動定位已添。 - 相關的類:
CLLocationManager
,MKMapView
地圖展示
展示地圖是通過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ù) - 使用
MKMapView
的addAnnotation:
方法添加到地圖 - 實現(xiàn)
mapView:viewForAnnotation:
代理方法 - 在代理內(nèi)定義
MKPinAnnotationView
對象
通過上面幾個步驟蔼囊,即可顯示標準的大頭針焚志。如果要顯示自定義標注衣迷,把MKPointAnnotation
對象替換為自定義MKAnnotation
,把MKPinAnnotationView
替換為自定義的MKAnnotationView
即可酱酬。
另外壶谒,在這塊還有一個點是Callout,即自定義氣泡膳沽,如下圖是一個標準的Callout展示汗菜。通過MKAnnotationView
的canShowCallout
、rightCalloutAccessoryView
挑社、leftCalloutAccessoryView
三個屬性控制陨界。
覆蓋物 Overlay
簡單來說,覆蓋物就是在地圖上畫的線痛阻,圓菌瘪,矩形等等。覆蓋物的設計也遵循數(shù)據(jù)與View分離的原則阱当。一個Overlay對象對應一個OverlayRenderer對象俏扩。
- Overlay 對象,通過實現(xiàn)
MKOverlay
協(xié)議弊添,定義數(shù)據(jù)÷嫉現(xiàn)有的Overlay對象有:MKPolyline
、MKPolygon
油坝、MKCircle
以及MATileOverlay
嫉戚。 - Overlay 渲染器,通過繼承
MKOverlayRenderer
澈圈,用于在地圖顯示 Overlay彬檀。以上Overlay對應的渲染器對象有:MKPolylineRenderer
、MKPolygonRenderer
极舔、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)