2014年1月28日 星期二

iOS 7 中 MapKit 相關的類別及擴充



上圖是筆者大略整理的類別圖。由於並沒有完全遵照 UML 語法,所以這裡的圖僅利於理解物件工作原理哦。

1. 首先,撰寫程式碼時,我們會使用到 MapKit.framework 這個 library,請記得先加入並 import。

2. 上圖中,我們從 MKMapView 著眼:可以透過它的 userLocation 取得 MKUserLocation 實體,再透過其 location 取得 CLLocation 實體,然後其再往圖的右方,直至取得 CLLocationCoordinate2D 的實體。這條引用路徑頗長,目的說穿了就是取得使用者所在地的經緯度。

3. 接下來,我們要用這個經緯度要做的事情是:計算兩個地方之間的導航路徑。

首先,兩個地方,一者為出發地 (source) ,另一者就是目的地 (destination) 囉。用於表示這兩個地點的類別是 MKMapItem。

MKMapItem 用於表示地圖上的某個東西,要建立它的實體,需要在初始化時傳入 MKPlacemark 的實體。MKPlacemark 則用於封裝座標(就是 CLLocationCoordinate2D 物件囉)及國家代碼。

也就是說,我們可以透過 MKMapView 取得使用者位置的座標,然後建立 MKPlacemark 物件,再然後就可以建立 MKMapItem 物件了。

MKMapItem 除了透過 MKPlacemark 物件裝載了座標位置外,還提供了 name、phoneNumber、url …等 property,所以再明顯不過:它用於封裝了在地圖上某點其上的相關資訊:叫什麼名字、聯絡的方式、提供的資訊…等等。

要取得兩個地點之間的路徑,就是要取得 MKDirections;MKDirections 物件的取得則是透過 MKDirectionsRequest 。MKDirectionsRequest 要做的事是:裝載了來源地(source)、目的地(destination)以及交通方式(transportType,包括走路、騎車或任何種類)…等資訊後,作為 MKDirections 的初始化參數傳入。

MKDirections 這個類別取名就是複數,很明顯地它包括多個路徑,這個路徑是以 MKRoute 這個類別來表示。傳送 calculateDirectionsWithCompletionHandler 訊息給 MKDirections 的實體後,透過 block 語法會回傳 MKDirectionsResponse 的實體,該實體有一個 routes 的 property 可以存取;明顯示 routes 是一個集合(正確來說是 NSArray),每個元素是一個 MKRoute。

最後,透過 MKMapView 物件的 addOverlay 方法就可以把 MKRoute 物件的 ployLine property 加到地圖上囉。

請大家參見上圖,一步步跟著走,大概就不難理解其工作原理了。


沒有留言:

張貼留言