一、问题描述

  现在很多的APP 都开始引入了地图和定位功能,包括一些餐饮业,团购等。他们都过定位和地图来让用户更加方便的根据自己的位置找到合适的目标,也就是说,现在地图定位已经不再是导航工具类,地图工具类所特有的了,本文将着重介绍下如何自行导航。运行效果图如下:

二、实现步骤

  <一>通过故事版添加地图界面,以及导航按钮(由于操作过于简单本文不便列出)

  <二>要想完成导航必须要了解起始的位置,不然无法完成导航,本文采用两个特殊的地名作为例子,实际开发中可以根据网络定位当前的位置,这里我们引入类CLGeocoder来进行地理编码,通过地理编码来获取我们的有用信息。

// 两地名称,代码如下
NSString * sourceName=@"新疆";
NSString * destinationName=@"烟台";
[self.geocoder geocodeAddressString:sourceName completionHandler:^(NSArray *sourcemarks, NSError *error) {
[self.geocoder geocodeAddressString:destinationName completionHandler:^(NSArray *destmarks, NSError *error) {
CLPlacemark * sourceMark=[sourcemarks firstObject];
CLPlacemark * toMark=[destmarks firstObject];
}];
}];

  <三>添加起始地和目的地大头针并将自定义大头针代码写在上面地理编码完成之后的代码块里面

  增加自定义大头针

            JRAnnotation * source=[[JRAnnotation alloc] init];
source.title=sourceName;
source.subtitle=sourceMark.name; source.coordinate=sourceMark.location.coordinate;
[self.mapView addAnnotation:source];
JRAnnotation * dest=[[JRAnnotation alloc] init];
dest.title=destinationName;
dest.subtitle=toMark.name; dest.coordinate=toMark.location.coordinate;
[self.mapView addAnnotation:dest];

  效果图:

  <四>进行导航之前的划线,此代码我抽取了个方法,仍然是要在上面的地理编码完成块里面调用

#pragma mark  - 导航之前划线

- (void)_mapGuilderFromMark:(CLPlacemark * ) sourceMark toMark:(CLPlacemark *) destMark{

   //1 定义方向请求
MKDirectionsRequest * request=[[MKDirectionsRequest alloc] init];
//2 定义开始和结束位置
//1> 开始
MKPlacemark *sourcemkpm=[[MKPlacemark alloc] initWithPlacemark:sourceMark];
MKMapItem * sourceItem=[[MKMapItem alloc] initWithPlacemark:sourcemkpm];
request.source=sourceItem;
self.sourceItem=sourceItem;
//2> 结束
MKPlacemark *destmkpm=[[MKPlacemark alloc] initWithPlacemark:destMark];
MKMapItem * destItem=[[MKMapItem alloc] initWithPlacemark:destmkpm];
request.destination=destItem;
self.destItem=destItem;
//3 根据方向请求获取方向
MKDirections *dirction=[[MKDirections alloc] initWithRequest:request]; //4 计算路线模型
[dirction calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
if(error) return ;
NSArray * routesArray=response.routes;
for (MKRoute * root in routesArray) {
//添加路线遮盖,传递路线遮盖模型
[self.mapView addOverlay:root.polyline];
}
}];
}

  效果图:

  <五>调用苹果自带的地图进行导航,当点击导航按钮的时候调用

#pragma mark - 导航
- (IBAction)beginGuiding:(id)sender {
//1 设置起始item
NSArray * array=@[self.sourceItem,self.destItem];
//2 设置导航模式,走路还是开车,以及是否显示路况
NSDictionary * dic=@{MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,MKLaunchOptionsShowsTrafficKey:@YES};
//3 打开苹果地图开始导航
[MKMapItem openMapsWithItems:array launchOptions:dic];
}

  另外附两个渲染器代理方法

#pragma mark - mapViewDelegate
//返回遮盖渲染器
-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay{ MKPolylineRenderer * render=[[MKPolylineRenderer alloc]initWithPolyline:overlay];
render.lineWidth=;
render.strokeColor=[UIColor blueColor]; return render;
} //返回大头针渲染器 - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{ static NSString * identy=@"big";
MKPinAnnotationView * pinView=(MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identy];
if(pinView==nil){
pinView=[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:identy];
pinView.canShowCallout=YES;//设置点击出明细
}
pinView.pinColor=MKPinAnnotationColorGreen;//设置大头针颜色
return pinView; }

  想要进一步了解的同学,可以点击查看源代码,亲自运行体验!

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 

IOS开发之地图导航的更多相关文章

  1. iOS开发----调用地图导航

    注意:本文章下的代码有个别变量未知,所以是不能直接跑通的,我也是转别人的 在IOS6.0系统后,兼容iOS5.0与iOS6.0地图导航,需要分两个步骤 #define SYSTEM_VERSION_L ...

  2. IOS开发UI篇—导航控制器属性和基本使用

    IOS开发UI篇—导航控制器属性和基本使用 一.导航控制器的一些属性和基本使用 1.把子控制器添加到导航控制器中的四种方法 (1) 1.创建一个导航控制器 UINavigationController ...

  3. iOS开发系列--地图与定位

    概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个 ...

  4. 转-iOS开发系列--地图与定位

    来自: http://www.cnblogs.com/kenshincui/p/4125570.html#autoid-3-4-0 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功 ...

  5. iOS开发系列--地图与定位总结

    现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的 ...

  6. IOS开发中设置导航栏主题

    /** * 系统在第一次使用这个类的时候调用(1个类只会调用一次) */ + (void)initialize { // 设置导航栏主题 UINavigationBar *navBar = [UINa ...

  7. IOS 手绘地图导航

    手绘地图导航 第三方库 NAMapKit, 1)支持在手绘图上标记.缩放 2)支持在单张图片 3)支持瓦片小图片 思路 前提:美工已经切好手绘图,并告知我们当前的缩放级别. 1)确定好手绘图左上角点在 ...

  8. iOS开发中地图开发的简单应用

    iOS上使用地图比Android要方便,只需要新建一个MKMapView,addSubView即可.这次要实现的效果如下: 有标注(大头针),定位,地图. 1.添加地图 1.1 新一个Single V ...

  9. ios开发--高德地图SDK使用简介

    高德LBS开放平台将高德最专业的定位.地图.搜索.导航等能力,以API.SDK等形式向广大开发者免费开放.本章节我们来简单学习一下如何使用它的定位及地图SDK. 一.相关框架及环境配置 地图SDK 对 ...

随机推荐

  1. wmware虚拟系统光盘的问题

    拿到系统盘,需要通过UltralSO工具中:工具-制作光盘映像文件,做成系统iso文件,而不是直接拷贝系统盘里的文件压缩成iso格式. 主要原因:主要是系统盘有一个引导区,win系统复制光盘时,是不能 ...

  2. LOJ P3952 时间复杂度 noip 暴力 模拟

    https://www.luogu.org/problemnew/show/P3952 模拟,日常认识到自己zz. #include<iostream> #include<cstdi ...

  3. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 lct 动态树 splay

    http://www.lydsy.com/JudgeOnline/problem.php?id=2002 http://blog.csdn.net/frods/article/details/5224 ...

  4. 王彪-20162321《程序设计与数据结构2nd》-第十一周学习总结与实验报告

    邻接矩阵实现 例图 分析 变量 需要一个链表来保存数据-即保存结点 需要一个二维数组来保存每个变得权值,有则填入具体数值,没有则用0 定义一个保存边个数的值 函数方法 得到图中边的个数 得到结点的数据 ...

  5. lnmp环境一键搭建及卸载

    系统需求: CentOS/Debian/Ubuntu Linux系统 需要2GB以上硬盘剩余空间 128M以上内存,OpenVZ的建议192MB以上(小内存请勿使用64位系统) VPS或服务器必须已经 ...

  6. hdu 4463 第37届ACM/ICPC杭州赛区K题 最小生成树

    题意:给坐标系上的一些点,其中有两个点已经连了一条边,求最小生成树的值 将已连接的两点权值置为0,这样一定能加入最小生成树里 最后的结果加上这两点的距离即为所求 #include<cstdio& ...

  7. 【BZOJ】4260: Codechef REBXOR【Trie树】【前后缀异或最大】

    4260: Codechef REBXOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2218  Solved: 962[Submit][Stat ...

  8. Red Hat Enterprise Linux 7.4上安装Oracle 11.2.0.4

    1. 配置Yum源及关闭SeLinux [root@localhost ~]# mkdir /media/rhel [root@localhost ~]# mount /dev/cdrom /medi ...

  9. 图之Dijkstra算法

    Dijkstra算法是一种求单源最短路的算法,即从一个点开始到所有其他点的最短路.其步骤如下: c语言实现如下:(使用邻接矩阵存储) #include <stdio.h> #include ...

  10. [Node.js]Path模块

    摘要 path模块提供了一些处理文件路径问题的工具. path模块 引入模块 var path=require("path"); 方法 1 path.normalize(p)规范化 ...