1、在mapView上绘制路线
#import "ViewController.h" #import "Annotation.h" #import <MapKit/MapKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController () <MKMapViewDelegate> @property (weak, nonatomic) IBOutlet MKMapView *mapView; @property (nonatomic, strong) CLGeocoder *geocoder; @end @implementation ViewController - (CLGeocoder *)geocoder { if (!_geocoder) { self.geocoder = [[CLGeocoder alloc] init]; } return _geocoder; } - (void)viewDidLoad { [super viewDidLoad]; self.mapView.delegate = self; NSString *address1 = @"北京"; NSString *address2 = @"广州"; [self.geocoder geocodeAddressString:address1 completionHandler:^(NSArray *placemarks, NSError *error) { if (error) return; CLPlacemark *fromPm = [placemarks firstObject]; [self.geocoder geocodeAddressString:address2 completionHandler:^(NSArray *placemarks, NSError *error) { if (error) return; CLPlacemark *toPm = [placemarks firstObject]; [self addLineFrom:fromPm to:toPm]; }]; }]; } /** * 添加导航的线路 * * @param fromPm 起始位置 * @param toPm 结束位置 */ - (void)addLineFrom:(CLPlacemark *)fromPm to:(CLPlacemark *)toPm { // 1.添加2个大头针 Annotation *fromAnno = [[Annotation alloc] init]; fromAnno.coordinate = fromPm.location.coordinate; fromAnno.title = fromPm.name; [self.mapView addAnnotation:fromAnno]; Annotation *toAnno = [[Annotation alloc] init]; toAnno.coordinate = toPm.location.coordinate; toAnno.title = toPm.name; [self.mapView addAnnotation:toAnno]; // 2.查找路线 // 方向请求 MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init]; // 设置起点 MKPlacemark *sourcePm = [[MKPlacemark alloc] initWithPlacemark:fromPm]; request.source = [[MKMapItem alloc] initWithPlacemark:sourcePm]; // 设置终点 MKPlacemark *destinationPm = [[MKPlacemark alloc] initWithPlacemark:toPm]; request.destination = [[MKMapItem alloc] initWithPlacemark:destinationPm]; // 方向对象 MKDirections *directions = [[MKDirections alloc] initWithRequest:request]; // 计算路线 [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) { NSLog(@"总共%d条路线", response.routes.count); // 遍历所有的路线 for (MKRoute *route in response.routes) { // 添加路线遮盖 [self.mapView addOverlay:route.polyline]; } }]; } #pragma mark - MKMapViewDelegate - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay { MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; renderer.strokeColor = [UIColor redColor]; return renderer; } @end
2、调用系统地图导航
#import "MJViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> @interface MJViewController () @property (strong, nonatomic) CLGeocoder *geocoder; @property (weak, nonatomic) IBOutlet UITextField *startField; @property (weak, nonatomic) IBOutlet UITextField *endField; - (IBAction)current; - (IBAction)startNavigation; @end @implementation MJViewController - (CLGeocoder *)geocoder { if (_geocoder == nil) { self.geocoder = [[CLGeocoder alloc] init]; } return _geocoder; } - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)current { } - (IBAction)startNavigation { [self.geocoder geocodeAddressString:self.endField.text completionHandler:^(NSArray *placemarks, NSError *error) { if (error) return; CLPlacemark *placemark = [placemarks firstObject]; MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation]; MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithPlacemark:placemark]]; NSMutableDictionary *options = [NSMutableDictionary dictionary]; options[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving; options[MKLaunchOptionsShowsTrafficKey] = @YES; [MKMapItem openMapsWithItems:@[currentLocation, toLocation] launchOptions:options]; }]; } @end