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 == ||
endStr == nil || endStr.length == ) {
NSLog(@"请输入起点或者终点");
return;
} // 2.利用GEO对象进行地理编码获取到地标对象(CLPlacemark )
// 2.1获取开始位置的地标
[self.geocoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) {
if (placemarks.count == ) return; // 开始位置的地标
CLPlacemark *startCLPlacemark = [placemarks firstObject]; // 3. 获取结束位置的地标
[self.geocoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == ) 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 == ||
endStr == nil || endStr.length == ) {
NSLog(@"请输入起点或者终点");
return;
} // 2.利用GEO对象进行地理编码获取到地标对象(CLPlacemark )
// 2.1获取开始位置的地标
[self.geocoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) {
if (placemarks.count == ) return; // 开始位置的地标
CLPlacemark *startCLPlacemark = [placemarks firstObject]; // 3. 获取结束位置的地标
[self.geocoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == ) 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 / , route.expectedTravelTime/ ); 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 == ||
endStr == nil || endStr.length == ) {
NSLog(@"请输入起点或者终点");
return;
} // 2.利用GEO对象进行地理编码获取到地标对象(CLPlacemark )
// 2.1获取开始位置的地标
[self.geocoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) {
if (placemarks.count == ) 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 == ) 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 / , route.expectedTravelTime/ ); // 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 = ; // 路线的宽度
line.strokeColor = [UIColor redColor];// 路线的颜色 // 返回路线
return line;
} #pragma mark - 懒加载
- (CLGeocoder *)geocoder
{
if (!_geocoder) {
self.geocoder = [[CLGeocoder alloc] init];
}
return _geocoder;
} @end

IOS-导航路线的更多相关文章

  1. iOS开发路线简述

    1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...

  2. iOS开发——iOS学习路线

    iOS学习路线 版权声明:欢迎转载,请贴上源地址:http://www.cnblogs.com/iCocos/(iOS梦工厂) 一:自学初步学习路线 二:高级完整学习路线 三:完整知识与能力体系 思维 ...

  3. 关于ios导航控制器的知识总结

    关于ios导航控制器的知识总结 添加了导航控制器后: 1.一个导航控制器会有一个顶部导航栏navigationbar和一个底部工具栏toolbar,它们是导航控制器navC的属性.且导航栏默认是不隐藏 ...

  4. 导航 -MapKit - 获取路线信息绘制导航路线

    #import "PPViewController.h" #import <MapKit/MapKit.h> #import "PPAnnotation.h& ...

  5. ios 学习路线总结

    学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...

  6. iOS系统导航/自绘制导航路线

    系统自带导航 /** 系统自带导航 当前位置导航到目的地 1.根据目的地进行地理编码 2.把当前位置和目的地封装成MKMapItem对象 3.使用 MKMapItem openMapsWithItem ...

  7. iOS导航栏标题颜色

    按钮的颜色 [self.navigationBar setTintColor:[UIColor whiteColor]]; 标题颜色.字体 [self.navigationBar setTitleTe ...

  8. IOS 导航栏属性设置

    IOS 7 以上系统导航栏: [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; // 返回按钮颜色 [UINaviga ...

  9. 【Swift】iOS导航栏错乱的原因

    #iOS开发高级技巧#导航栏错乱,也就是导航栏的显示效果与内容区不匹配,引发原因很多,其中最重要的有两个原因: 1.在viewwillappear,viewwilldisappear两个函数中,设置导 ...

  10. iOS 导航栏返回到指定页面的方法和理解

    关于ios中 viewcontroller的跳转问题,其中有一种方式是采用navigationController pushViewController 的方法,比如我从主页面跳转到了一级页面,又从一 ...

随机推荐

  1. Python__return

    return的注意点: return返回的值, 没有任何类型限制 return是函数结束的标志,函数内可以写多个return,但执行一次,函数就立刻结束,并把return后的值作为本次调用的返回值.

  2. Mysql学习笔记—索引

    一.什么是索引 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  3. java 多线程 day03 线程同步

    package com.czbk.thread; /** * Created by chengtao on 17/12/3. 线程安全问题: 线程安全出现 的根本原因: 1. 存在两个或者两个以上 的 ...

  4. 安装SQL2012

    1. 优先安装软件 1. net framework3.5. 2. 在安装SQL SERVER 2012前需要3.5的支持.在WIN 2012系统可以在系统管理的添加角色和功能中安装,如下将[.NET ...

  5. ZeroMQ作者于昨天下午宣布选择安乐死

    … printf("goodbye, world !");

  6. web应用与web框架(Day65)

    Web应用 对于所有的web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 import socket def handle_request(client): ...

  7. 关于python中的查询数据库内容中用到的fetchone()函数和fetchall()函数(转)还有fetchmany()

    最近在用python操作mysql数据库时,碰到了下面这两个函数,标记一下: fetchone() : 返回单个的元组,也就是一条记录(row),如果没有结果 则返回 None fetchall() ...

  8. 腾讯天猫经常出现这些低级的bug!

    对于程序员来说,bug很讨厌.每天重复着写代码.找bug.修改bug的动作.按理说互联网巨头的产品,bug应该比较少.但是实际上,无论是用百度.天猫.谷歌等产品,经常都会出现这些低级的bug,让人很火 ...

  9. Python 一行代码实现并行

    需求 给定一个list   针对list 中每个元素执行一定的操作(这个操作很费时间,例如爬数据的时候调用某个网站的接口),返回操作后的list 例如 给定 1-10个数,在每个数字后面加个字母a 方 ...

  10. Windows安装多个Tomcat服务

    1.下载tomcat解压,并复制三份(用压缩版的不要用安装版的) 2.配置环境变量CATALINA_HOME和CATALINA_BASE .改端口 修改文件server.xml,修改3个端口号 < ...