iOS7の MapKit に追加された MKDirections という経路検索の機能を使う機会があったので、
MKDirections の使い方を備忘録がてらまとめておきます。
使い方を知るために作成したサンプルはGitHubにあります。
豊橋駅周辺にピンを落として、タップした順に駅からのルートを表示するサンプルになっています。
経路検索の方法
MKDirections を使用した経路検索の方法は次のようになります。
- ルートの始点と終点の座標を用意
- 移動手段を選択
- 座標を元にルートをリクエスト
- レスポンスのルートを地図にオーバーレイ
1. ルートの始点と終点の座標を用意
ルート検索では2点間の検索になりますので、その始点と終点の座標が必要になります。
座標はApple Mapsの座標系なので世界測地系緯度経度になりますので、
サンプルではブラウザ版Google Mapsの「この場所について」から座標をとって使用しています。
// 豊橋駅
let sourcePosition = CLLocationCoordinate2D(34.763653, 137.383003)
// 豊橋市役所
let destinationPosition = CLLocationCoordinate2D(34.769192, 137.391473)
2. 移動手段を選択
ルート検索では移動手段を選択することができます。選択できる移動手段は次の3種類になります。
ソースコード上では移動手段を識別するために MKDirectionsTransportType 列挙体を使用します。
No | 移動手段 | 対応する列挙値 |
---|---|---|
1 | 車 | MKDirectionsTransportTypeAutomobile |
2 | 徒歩 | MKDirectionsTransportTypeWalking |
3 | どちらでも | MKDirectionsTransportTypeAny |
ルート検索のデフォルトでは3番の「どちらでも」が設定されています。
3. 座標を元にルートをリクエスト
用意した座標を元にルート検索する場合、 MKDirectionsRequest クラスを使用してアップルのサーバーへ
リクエストを送信する必要があります。リクエストを作成する際に次のクラスを使用します。
No | クラス | 説明 |
---|---|---|
1 | MKPlacemark | Placemark(目印)でルート検索の地点の座標・住所を格納するクラス |
2 | MKMapItem | 地図上のポイント情報を格納するクラス |
ルート検索のリクエストには最終的に 'MKMapItem' の形で座標をセットします。
これらのクラスと用意した座標を元にルート検索リクエストを作成・送信します。
let request = MKDirectionsRequest()
request.setSource(MKMapItem(placemark:sourcePlacemark))
request.setDestination(MKMapItem(placemark:destinationPlacemark))
request.transportType = MKDirectionsTransportTypeAutomobile
// 複数のルートを検索する場合
// request.requestsAlternateRoutes = YES
// ルート検索のためのリクエストを送る。
let directions = MKDirections(request:request)
directions.calculateDirectionsWithCompletionHandler({
(response:MKDirectionsResponse!, error:NSError!) -> Void in
// ルート検索後に呼ばれる処理
})
4. レスポンスのルートを地図にオーバーレイ
最後にルート検索で得られる結果を地図上に重ねて表示します。
レスポンスで得られるルートにはポリラインが含まれているのでそれを MapView のオーバーレイに重ねて表示します。
let directions = MKDirections(request:request)
directions.calculateDirectionsWithCompletionHandler({
(response:MKDirectionsResponse!, error:NSError!) -> Void in
// ルート検索後に呼ばれる処理
if (error? || response.routes.isEmpty) {
return
}
let route: MKRoute = response.routes[0] as MKRoute
// 複数存在する場合
// for route in response.routes {
// self.mapView.addOverlay(route.polyline!)
// }
self.mapView.addOverlay(route.polyline!)
})
地図上にオーバーレイ表示するルートの外観を調整する場合はデリゲートのメソッドを実装します。
// 経路検索のルート表示設定
func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
let route: MKPolyline = overlay as MKPolyline
let routeRenderer = MKPolylineRenderer(polyline:route)
routeRenderer.lineWidth = 5.0
routeRenderer.strokeColor = UIColor.redColor()
return routeRenderer
}
これで地図上にルート検索した結果をオーバーレイ表示できるようになります。