LoginSignup
13
11

More than 5 years have passed since last update.

MKDirectionsを一年遅れで使ってみた

Posted at

iOS7の MapKit に追加された MKDirections という経路検索の機能を使う機会があったので、
MKDirections の使い方を備忘録がてらまとめておきます。

使い方を知るために作成したサンプルはGitHubにあります。
豊橋駅周辺にピンを落として、タップした順に駅からのルートを表示するサンプルになっています。

経路検索の方法

MKDirections を使用した経路検索の方法は次のようになります。

  1. ルートの始点と終点の座標を用意
  2. 移動手段を選択
  3. 座標を元にルートをリクエスト
  4. レスポンスのルートを地図にオーバーレイ

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
}

これで地図上にルート検索した結果をオーバーレイ表示できるようになります。

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11