1.獲取路線信息,拿到地名然後地理編碼拿到CLPlaceMark,然後調用以下方法:
- (void)startDirectionsWithstartCLPlacemark:(CLPlacemark *)startCLPlacemark endCLPlacemark:(CLPlacemark *)endCLPlacemark
{
/*
MKDirectionsRequest:說清楚:從哪裏 --> 到哪裏
MKDirectionsResponse:從哪裏 --> 到哪裏 :的具體路線信息
*/
// -1.創建起點和終點對象
// -1.1創建起點對象
MKPlacemark *startMKPlacemark = [[MKPlacemark alloc] initWithPlacemark:startCLPlacemark];
MKMapItem *startItem = [[MKMapItem alloc] initWithPlacemark:startMKPlacemark];
// -1.2創建終點對象
MKPlacemark *endMKPlacemark = [[MKPlacemark alloc] initWithPlacemark:endCLPlacemark];
MKMapItem *endItem = [[MKMapItem alloc] initWithPlacemark:endMKPlacemark];
// 0.創建request對象
MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
// 0.1設置起點
request.source = startItem;
// 0.2設置終點
request.destination = endItem;
// 1.發送請求到蘋果的服務器獲取導航路線信息
// 接收一個MKDirectionsRequest請求對象, 我們需要在該對象中說清楚:
// 從哪裏 --> 到哪裏
MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
// 2.計算路線信息, 計算完成之後會調用blcok
// 在block中會傳入一個響應者對象(response), 這個響應者對象中就存放着路線信息
[directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
// 打印獲取到的路線信息
// 2.1獲取所有的路線
NSArray *routes = response.routes;
for (MKRoute *route in routes) {
NSLog(@"%f千米 %f小時", route.distance / 1000, route.expectedTravelTime/ 3600);
// 3.繪製路線(本質: 往地圖上添加遮蓋)
// 傳遞當前路線的幾何遮蓋給地圖, 地圖就會根據遮蓋自動繪製路線
// 當系統開始繪製路線時會調用代理方法詢問當前路線的寬度/顏色等信息
[self.mapVIew addOverlay:route.polyline];
NSArray *steps = route.steps;
for (MKRouteStep *step in steps) {
NSLog(@"%@ %f", step.instructions, step.distance);
}
}
}];
}
2.繪製導航線,在上一個方法中mapview的addOverlay方法,就是每獲得路線就會開始畫線,然後會調用以下代理方法:
#pragma mark - MKMapViewDelegate
// 過時
//- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
// 繪製路線時就會調用(添加遮蓋時就會調用)
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
// MKOverlayRenderer *renderer = [[MKOverlayRenderer alloc] init];
// 創建一條路徑遮蓋
NSLog(@"%s", __func__);
#warning 注意, 創建線條時候,一定要制定幾何路線
MKPolylineRenderer *line = [[MKPolylineRenderer alloc] initWithPolyline:overlay];
line.lineWidth = 5; // 路線的寬度
line.strokeColor = [UIColor redColor];// 路線的顏色
// 返回路線
return line;
}