Qiitaに投稿した記事のコピーになります。
iOS 7 で追加された MKDirections が面白そうだったので、試しに六本木から渋谷へのルートを検索してみました。
まずは、出発点と到着点を CLLocationCoordinate2D
で作成します。
// 六本木 CLLocationCoordinate2D fromCoordinate = CLLocationCoordinate2DMake(35.665213, 139.730011); // 渋谷 CLLocationCoordinate2D toCoordinate = CLLocationCoordinate2DMake(35.658987, 139.702776);
ここで作成した CLLocationCoordinate2D
をセットした MKPlacemark
を生成します。
// CLLocationCoordinate2D から MKPlacemark を生成 MKPlacemark *fromPlacemark = [[MKPlacemark alloc] initWithCoordinate:fromCoordinate addressDictionary:nil]; MKPlacemark *toPlacemark = [[MKPlacemark alloc] initWithCoordinate:toCoordinate addressDictionary:nil];
MKPlacemark
から MKMapItem
を生成します。
// MKPlacemark から MKMapItem を生成
MKMapItem *fromItem =
[[MKMapItem alloc] initWithPlacemark:fromPlacemark];
MKMapItem *toItem =
[[MKMapItem alloc] initWithPlacemark:toPlacemark];
MKMapItem
をセットして MKDirectionsRequest
を生成します。
requestsAlternateRoutes
に YES
を設定すると、複数のルートを検索できるようです。
// MKMapItem をセットして MKDirectionsRequest を生成 MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init]; request.source = fromItem; request.destination = toItem; request.requestsAlternateRoutes = YES;
MKDirectionsRequest
から MKDirections
を生成します。
// MKDirectionsRequest から MKDirections を生成
MKDirections *directions =
[[MKDirections alloc] initWithRequest:request];
ここでようやく経路検索を実行できます。
// 経路検索を実行 [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) { if (error) return; if ([response.routes count] > 0) { MKRoute *route = [response.routes objectAtIndex:0]; NSLog(@"distance: %.2f meter", route.distance); // 地図上にルートを描画 [self.mapView addOverlay:route.polyline]; } }];
ルート情報は MKRoute
クラスで返ってくるようです。このクラスには経路情報の他、移動にかかる予測時間や距離なども含まれるようです。
最後に、地図上に表示されるルートの色や線の太さなどを設定します。
// 地図上に描画するルートの色などを指定(これを実装しないと何も表示されない) - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay { if ([overlay isKindOfClass:[MKPolyline class]]) { MKPolyline *route = overlay; MKPolylineRenderer *routeRenderer = [[MKPolylineRenderer alloc] initWithPolyline:route]; routeRenderer.lineWidth = 5.0; routeRenderer.strokeColor = [UIColor redColor]; return routeRenderer; } else { return nil; } }
実行結果
▼こちらは複数のルートを検索してみた結果
今回は特に指定していませんが、経路検索条件に「徒歩」や「自動車」などの指定もできるようです。