IOS-导航路线
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-导航路线的更多相关文章
- iOS开发路线简述
1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...
- iOS开发——iOS学习路线
iOS学习路线 版权声明:欢迎转载,请贴上源地址:http://www.cnblogs.com/iCocos/(iOS梦工厂) 一:自学初步学习路线 二:高级完整学习路线 三:完整知识与能力体系 思维 ...
- 关于ios导航控制器的知识总结
关于ios导航控制器的知识总结 添加了导航控制器后: 1.一个导航控制器会有一个顶部导航栏navigationbar和一个底部工具栏toolbar,它们是导航控制器navC的属性.且导航栏默认是不隐藏 ...
- 导航 -MapKit - 获取路线信息绘制导航路线
#import "PPViewController.h" #import <MapKit/MapKit.h> #import "PPAnnotation.h& ...
- ios 学习路线总结
学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...
- iOS系统导航/自绘制导航路线
系统自带导航 /** 系统自带导航 当前位置导航到目的地 1.根据目的地进行地理编码 2.把当前位置和目的地封装成MKMapItem对象 3.使用 MKMapItem openMapsWithItem ...
- iOS导航栏标题颜色
按钮的颜色 [self.navigationBar setTintColor:[UIColor whiteColor]]; 标题颜色.字体 [self.navigationBar setTitleTe ...
- IOS 导航栏属性设置
IOS 7 以上系统导航栏: [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; // 返回按钮颜色 [UINaviga ...
- 【Swift】iOS导航栏错乱的原因
#iOS开发高级技巧#导航栏错乱,也就是导航栏的显示效果与内容区不匹配,引发原因很多,其中最重要的有两个原因: 1.在viewwillappear,viewwilldisappear两个函数中,设置导 ...
- iOS 导航栏返回到指定页面的方法和理解
关于ios中 viewcontroller的跳转问题,其中有一种方式是采用navigationController pushViewController 的方法,比如我从主页面跳转到了一级页面,又从一 ...
随机推荐
- 我的Android进阶之旅------>关于使用CSDN-markdown编辑器来编写博客
关于使用MarkDown编辑器的原因 什么是 Markdown 制作一份待办事宜 Todo 列表 书写一个质能守恒公式LaTeX 高亮一段代码code 高效绘制 流程图 高效绘制序列图 绘制表格 更详 ...
- What are the top 10 things that we should be informed about in life
1.Realize that nobody cares, and if they do, you shouldn't care that they care. Got a new car? Nobod ...
- Pimpl Idiom /handle body idiom
在读<Effective C++>和项目源代码时,看到pImpl Idiom.它可以用来降低文件间的编译依赖关系,通过把一个Class分成两个Class,一个只提供接口,另一个负责实现该接 ...
- virtualenv使用
virtualenv安装不同版本的python 来自为知笔记(Wiz)
- git分支更新代码命令
第一步: 查看状态 git status 第二步: 全部添加 git add --all 第三步: 再次查看状态 git status 第四步: 提交 git commit -m '备 ...
- window下rails4.1 发生TZInfo::DataSourceNotFound 错误
在官网上学习rails 4.1 ,启动rails server之后发生了如下错误 $ rails serverBooting WEBrickRails 4.1.0 application starti ...
- Java学习笔记之Java 继承中的构造方法
参考
- VRChat简易教程1-开发环境准备(SDK)
原文:https://docs.vrchat.com/docs/setting-up-the-sdk 1 Unity 2017.4.15f1 下载地址https://download.unity3d. ...
- Windows Server 2008 R2服务器遗忘管理员密码解决方案
A goal is a dream with a deadline. Much effort, much prosperity. 在日常的工作中,对于一个网络管理员来讲最悲哀的事情莫过于在没有备用 ...
- LeetCode——Diameter of Binary Tree
LeetCode--Diameter of Binary Tree Question Given a binary tree, you need to compute the length of th ...