IOS-导航路线
2016-04-04 01:28
363 查看
1.可以将需要导航的位置丢给系统自带的APP进行导航
2.发送网络请求到公司服务器获取导航数据, 然后自己手动绘制导航
3.利用三方SDK实现导航(百度)
>当点击开始导航时获取用户输入的起点和终点
>利用GEO对象进行地理编码获取到地标对象(CLPlacemark )
>再利用获取到的地标对象(CLPlacemark)创建MKPlacemark
>利用MKPlacemark创建起点的item
>终点和起点逻辑一样
1.发送请求到苹果的服务器获取导航路线信息
2.根据服务器返回的路线信息自己绘制导航路线
代码1
代码2
代码3
2.发送网络请求到公司服务器获取导航数据, 然后自己手动绘制导航
3.利用三方SDK实现导航(百度)
>当点击开始导航时获取用户输入的起点和终点
>利用GEO对象进行地理编码获取到地标对象(CLPlacemark )
>再利用获取到的地标对象(CLPlacemark)创建MKPlacemark
>利用MKPlacemark创建起点的item
>终点和起点逻辑一样
1.发送请求到苹果的服务器获取导航路线信息
2.根据服务器返回的路线信息自己绘制导航路线
代码1
// // ViewController.m // IOS_0403_利用系统App导航 // // Created by ma c on 16/4/3. // Copyright © 2016年 博文科技. All rights reserved. // #import "ViewController.h" #import<MapKit/MapKit.h> @interface ViewController () - (IBAction)startNavigation; /** * 开始位置 */ @property (weak, nonatomic) IBOutlet UITextField *startField; /** * 结束位置 */ @property (weak, nonatomic) IBOutlet UITextField *endField; /** * 地理编码对象 */ @property(nonatomic, strong) CLGeocoder *geocoder; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)startNavigation { // 1.获取用户输入的起点和终点 NSString *startStr = self.startField.text; NSString *endStr = self.endField.text; if (startStr == nil || startStr.length == 0 || endStr == nil || endStr.length == 0) { NSLog(@"请输入起点或者终点"); return; } // 2.利用GEO对象进行地理编码获取到地标对象(CLPlacemark ) // 2.1获取开始位置的地标 [self.geocoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == 0) return; // 开始位置的地标 CLPlacemark *startCLPlacemark = [placemarks firstObject]; // 3. 获取结束位置的地标 [self.geocoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == 0) return; // 结束位置的地标 CLPlacemark *endCLPlacemark = [placemarks firstObject]; // 开始导航 [self startNavigationWithstartCLPlacemark:startCLPlacemark endCLPlacemark:endCLPlacemark]; }]; }]; } /** * 开始导航 * * @param startCLPlacemark 起点的地标 * @param endCLPlacemark 终点的地标 */ - (void)startNavigationWithstartCLPlacemark:(CLPlacemark *)startCLPlacemark endCLPlacemark:(CLPlacemark *)endCLPlacemark { // 0.创建起点和终点 // 0.1创建起点 MKPlacemark *startPlacemark = [[MKPlacemark alloc] initWithPlacemark:startCLPlacemark]; MKMapItem *startItem = [[MKMapItem alloc] initWithPlacemark:startPlacemark];; // 0.2创建终点 MKPlacemark *endPlacemark = [[MKPlacemark alloc] initWithPlacemark:endCLPlacemark]; MKMapItem *endItem = [[MKMapItem alloc] initWithPlacemark:endPlacemark]; // 1. 设置起点和终点数组 NSArray *items = @[startItem, endItem]; // 2.设置启动附加参数 NSMutableDictionary *md = [NSMutableDictionary dictionary]; // 导航模式(驾车/走路) md[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving; // 地图显示模式 // md[MKLaunchOptionsMapTypeKey] = @(MKMapTypeHybrid); // 只要调用MKMapItem的open方法, 就可以打开系统自带的地图APP进行导航 // Items: 告诉系统地图APP要从哪到哪 // launchOptions: 启动系统自带地图APP的附加参数(导航的模式/是否需要先交通状况/地图的模式/..) [MKMapItem openMapsWithItems:items launchOptions:md]; } #pragma mark - 懒加载 - (CLGeocoder *)geocoder { if (!_geocoder) { self.geocoder = [[CLGeocoder alloc] init]; } return _geocoder; } @end
代码2
// // ViewController.m // IOS_0404_获取导航路线信息 // // Created by ma c on 16/4/4. // Copyright © 2016年 博文科技. All rights reserved. // #import "ViewController.h" #import <MapKit/MapKit.h> @interface ViewController () - (IBAction)startNavigation; /** * 开始位置 */ @property (weak, nonatomic) IBOutlet UITextField *startField; /** * 结束位置 */ @property (weak, nonatomic) IBOutlet UITextField *endField; /** * 地理编码对象 */ @property(nonatomic, strong) CLGeocoder *geocoder; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } /** * 点击开始导航按钮 */ - (IBAction)startNavigation { // 1.获取用户输入的起点和终点 NSString *startStr = self.startField.text; NSString *endStr = self.endField.text; if (startStr == nil || startStr.length == 0 || endStr == nil || endStr.length == 0) { NSLog(@"请输入起点或者终点"); return; } // 2.利用GEO对象进行地理编码获取到地标对象(CLPlacemark ) // 2.1获取开始位置的地标 [self.geocoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == 0) return; // 开始位置的地标 CLPlacemark *startCLPlacemark = [placemarks firstObject]; // 3. 获取结束位置的地标 [self.geocoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == 0) return; // 结束位置的地标 CLPlacemark *endCLPlacemark = [placemarks firstObject]; // 开始导航 [self startDirectionsWithstartCLPlacemark:startCLPlacemark endCLPlacemark:endCLPlacemark]; }]; }]; } /** * 发送请求获取路线相信信息 * * @param startCLPlacemark 起点的地标 * @param endCLPlacemark 终点的地标 */ - (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); NSArray *steps = route.steps; for (MKRouteStep *step in steps) { NSLog(@"%@ %f", step.instructions, step.distance); } } }]; } #pragma mark - 懒加载 - (CLGeocoder *)geocoder { if (!_geocoder) { self.geocoder = [[CLGeocoder alloc] init]; } return _geocoder; } @end
代码3
// // ViewController.m // IOS_0404_绘制导航路线 // // Created by ma c on 16/4/4. // Copyright © 2016年 博文科技. All rights reserved. // #import "ViewController.h" #import <MapKit/MapKit.h> #import "HMAnnotation.h" @interface ViewController ()<MKMapViewDelegate> @property (weak, nonatomic) IBOutlet MKMapView *mapVIew; /** * 地理编码对象 */ @property(nonatomic, strong) CLGeocoder *geocoder; - (IBAction)drawLine; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.mapVIew.delegate = self; } /** * 点击开始导航按钮 */ - (IBAction)drawLine { // 1.获取用户输入的起点和终点 NSString *startStr = @"北京"; NSString *endStr = @"云南"; if (startStr == nil || startStr.length == 0 || endStr == nil || endStr.length == 0) { NSLog(@"请输入起点或者终点"); return; } // 2.利用GEO对象进行地理编码获取到地标对象(CLPlacemark ) // 2.1获取开始位置的地标 [self.geocoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == 0) return; // 开始位置的地标 CLPlacemark *startCLPlacemark = [placemarks firstObject]; // 添加起点的大头针 HMAnnotation *startAnno = [[HMAnnotation alloc ] init]; startAnno.title = startCLPlacemark.locality; startAnno.subtitle = startCLPlacemark.name; startAnno.coordinate = startCLPlacemark.location.coordinate; [self.mapVIew addAnnotation:startAnno]; // 3. 获取结束位置的地标 [self.geocoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == 0) return; // 结束位置的地标 CLPlacemark *endCLPlacemark = [placemarks firstObject]; // 添加终点的大头针 HMAnnotation *endAnno = [[HMAnnotation alloc ] init]; endAnno.title = endCLPlacemark.locality; endAnno.subtitle = endCLPlacemark.name; endAnno.coordinate = endCLPlacemark.location.coordinate; [self.mapVIew addAnnotation:endAnno]; // 开始导航 [self startDirectionsWithstartCLPlacemark:startCLPlacemark endCLPlacemark:endCLPlacemark]; }]; }]; } /** * 发送请求获取路线相信信息 * * @param startCLPlacemark 起点的地标 * @param endCLPlacemark 终点的地标 */ - (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); } } }]; } #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__); //注意, 创建线条时候,一定要制定几何路线 MKPolylineRenderer *line = [[MKPolylineRenderer alloc] initWithPolyline:overlay]; line.lineWidth = 1; // 路线的宽度 line.strokeColor = [UIColor redColor];// 路线的颜色 // 返回路线 return line; } #pragma mark - 懒加载 - (CLGeocoder *)geocoder { if (!_geocoder) { self.geocoder = [[CLGeocoder alloc] init]; } return _geocoder; } @end
相关文章推荐
- iOS数据回调三大利器——代理、通知与Block
- iOS QQ实现第三方登
- iOS弹跳动画
- iOS 地图的简单实用
- iOS开发之常用的正则表达式
- iOS Block理解
- iOS边练边学--(Quartz2D)图片裁剪,带圆环的裁剪
- iOS AFOAuth2Manager使用心得
- iOS开发小技巧--富文本字典集合中的Key都是OC中的常量字符串
- iOS边练边学--(Quartz2D)图片添加水印
- iOS边练边学--(Quartz2D)基本图形的绘制#附加自定义进度控件的练习
- iOS常见的延时执行
- IOS_绘画交集圆填充
- 【iOS知识学习】_iOS动态改变TableView Cell高度
- iOS性能优化
- iOS非CocoPods集成七牛推流SDK PLCameraStreamingKit 使用指南
- IOS-MapKit
- iOS如何对包含date的数组进行排序
- ios 如何单独排序只含有date的数组
- IOS-CoreLocation