您的位置:首页 > 移动开发 > IOS开发

IOS-导航路线

2016-04-04 01:28 363 查看
1.可以将需要导航的位置丢给系统自带的APP进行导航

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: