iOS原生地图开发进阶——使用导航和附近兴趣点检索

iOS中的mapKit框架对国际化的支持非常出色。在前些篇博客中,对这个地图框架的基础用法和标注与覆盖物的添加进行了详细的介绍,这篇博客将介绍两个更加实用的功能的开发:线路导航与兴趣点搜索。前几篇博客的链接如下:

地图基础用法详解:http://my.oschina.net/u/2340880/blog/415360

添加大头针与自定义标注:http://my.oschina.net/u/2340880/blog/415441

添加地图覆盖物:http://my.oschina.net/u/2340880/blog/415611

一、线路导航

1、从几个类的关系说起

(1)MKPlacemark

一个地点信息类,如下:

@interface MKPlacemark : CLPlacemark //初始化方法,通过给定一个经纬度和地点信息字典- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate                 addressDictionary:(NSDictionary *)addressDictionary;//国家编码@property (nonatomic, readonly) NSString *countryCode;@end

(2)MKMapItem

地点节点类,包含此节点的许多地点信息,如下:

@interface MKMapItem : NSObject//当前节点的地点信息对象@property (nonatomic, readonly) MKPlacemark *placemark;//是否是当前位置@property (nonatomic, readonly) BOOL isCurrentLocation;//节点名称@property (nonatomic, copy) NSString *name;//电话号码@property (nonatomic, copy) NSString *phoneNumber;//网址@property (nonatomic, strong) NSURL *url;//将当前位置创建为节点+ (MKMapItem *)mapItemForCurrentLocation;//由一个位置信息创建节点- (instancetype)initWithPlacemark:(MKPlacemark *)placemark;@end

(3)MKDirectionsRequest

导航请求类

@interface MKDirectionsRequest : NSObject//起点节点- (MKMapItem *)source NS_AVAILABLE(10_9, 6_0);- (void)setSource:(MKMapItem *)source NS_AVAILABLE(10_9, 7_0);//目的地节点- (MKMapItem *)destination NS_AVAILABLE(10_9, 6_0);- (void)setDestination:(MKMapItem *)destination NS_AVAILABLE(10_9, 7_0);@end

这个类还有一些扩展的设置属性:

@property (nonatomic) MKDirectionsTransportType transportType;

设置路线检索类型,枚举如下:

typedef NS_OPTIONS(NSUInteger, MKDirectionsTransportType) {    MKDirectionsTransportTypeAutomobile     = 1 << 0,//适合驾车时导航    MKDirectionsTransportTypeWalking        = 1 << 1,//适合步行时导航    MKDirectionsTransportTypeAny            = 0x0FFFFFFF//任何情况};

@property (nonatomic) BOOL requestsAlternateRoutes;

设置是否搜索多条线路

@property (nonatomic, copy) NSDate *departureDate;

设置出发日期

@property (nonatomic, copy) NSDate *arrivalDate;

设置到达日期

(4)MKDirections

从apple服务器获取数据的连接类

@interface MKDirections : NSObject//初始化方法- (instancetype)initWithRequest:(MKDirectionsRequest *)request NS_DESIGNATED_INITIALIZER;//开始计算线路信息- (void)calculateDirectionsWithCompletionHandler:(MKDirectionsHandler)completionHandler;//开始计算时间信息- (void)calculateETAWithCompletionHandler:(MKETAHandler)completionHandler;//取消- (void)cancel;//是否正在计算@property (nonatomic, readonly, getter=isCalculating) BOOL calculating;@end

(5)MKDirectionsResponse

线路信息结果类

@interface MKDirectionsResponse : NSObject@property (nonatomic, readonly) MKMapItem *source;//起点@property (nonatomic, readonly) MKMapItem *destination;//终点@property (nonatomic, readonly) NSArray *routes; //线路规划数组@end

(6)MKETResponse

时间信息结果类

@interface MKETAResponse : NSObject@property (nonatomic, readonly) MKMapItem *source;//起点@property (nonatomic, readonly) MKMapItem *destination;//终点@property (nonatomic, readonly) NSTimeInterval expectedTravelTime;//耗时@end

(7)MKRoute

线路信息类,导航的线路结果是这个类型的对象

@interface MKRoute : NSObject@property (nonatomic, readonly) NSString *name; //线路名称@property (nonatomic, readonly) NSArray *advisoryNotices; //注意事项@property (nonatomic, readonly) CLLocationDistance distance; //距离@property (nonatomic, readonly) NSTimeInterval expectedTravelTime;//耗时@property (nonatomic, readonly) MKDirectionsTransportType transportType; //检索的类型@property (nonatomic, readonly) MKPolyline *polyline; // 线路覆盖物@property (nonatomic, readonly) NSArray *steps; // 线路详情数组@end

(8)MKRouteStep

线路详情信息类,线路中每一步的信息都是这个类的对象

@interface MKRouteStep : NSObject@property (nonatomic, readonly) NSString *instructions; // 节点信息@property (nonatomic, readonly) NSString *notice; // 注意事项@property (nonatomic, readonly) MKPolyline *polyline; //线路覆盖物@property (nonatomic, readonly) CLLocationDistance distance; // 距离@property (nonatomic, readonly) MKDirectionsTransportType transportType; // 导航类型@end

看到上面如此多的类,你可能会觉得一头雾水,那么不用着急,类虽然繁杂,但他们之间的逻辑非常清晰,下面就通过一个例子来进行线路导航。

2、进行线路导航

- (void)viewDidLoad {    [super viewDidLoad];    //地图初始化设置    mapView =[[MKMapView alloc]initWithFrame:self.view.frame];    mapView.region=MKCoordinateRegionMake(CLLocationCoordinate2DMake(39.26, 116.3), MKCoordinateSpanMake(5, 5));    mapView.mapType=MKMapTypeStandard;    mapView.delegate=self;    [self.view addSubview:mapView];        //导航设置    CLLocationCoordinate2D fromcoor=CLLocationCoordinate2DMake(39.26, 116.3);    CLLocationCoordinate2D tocoor = CLLocationCoordinate2DMake(33.33, 113.33);    //创建出发点和目的点信息    MKPlacemark *fromPlace = [[MKPlacemark alloc] initWithCoordinate:fromcoor                                                       addressDictionary:nil];    MKPlacemark *toPlace = [[MKPlacemark alloc]initWithCoordinate:tocoor addressDictionary:nil];    //创建出发节点和目的地节点    MKMapItem * fromItem = [[MKMapItem alloc]initWithPlacemark:fromPlace];    MKMapItem * toItem = [[MKMapItem alloc]initWithPlacemark:toPlace];    //初始化导航搜索请求    MKDirectionsRequest *request = [[MKDirectionsRequest alloc]init];    request.source=fromItem;    request.destination=toItem;    request.requestsAlternateRoutes=YES;    //初始化请求检索    MKDirections *directions = [[MKDirections alloc]initWithRequest:request];    //开始检索,结果会返回在block中    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {        if (error) {            NSLog(@"error:%@",error);        }else{            //提取导航线路结果中的一条线路            MKRoute *route =response.routes[0];            //将线路中的每一步详情提取出来            NSArray * stepArray = [NSArray arrayWithArray:route.steps];            //进行遍历            for (int i=0; i<steparray.count; i++) {                 线路的详情节点                mkroutestep * step =" stepArray[i];                //在此节点处添加一个大头针                MKPointAnnotation * point = [[M<a" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=540947cac5de81c0&k=%C4%BF%B5%C4%B5%D8&k0=%C4%BF%B5%C4%B5%D8&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=smileking_cpr&rb=0&rs=1&seller_id=1&sid=c081dec5ca470954&ssp2=1&stid=9&t=tpclicked3_hc&td=1682280&tu=u1682280&u=http%3A%2F%2Fwww%2Eth7%2Ecn%2FProgram%2FIOS%2F201505%2F453699%2Eshtml&urlid=0" target="_blank">KPointAnnotation alloc]init];                point.coordinate=step.polyline.coordinate;                point.title=step.instructions;                point.subtitle=step.notice;                [mapView addAnnotation:point];                //将此段线路添加到地图上                [mapView addOverlay:step.polyline];            }        }    }];  }//地图覆盖物的代理方法-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id)overlay{    MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithPolyline:overlay];        renderer.strokeColor = [UIColor redColor];        renderer.lineWidth = 4.0;        return  renderer;}//标注的代理方法-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation{    MKPinAnnotationView * view= [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"anno"];    view.canShowCallout=YES;    return view;}

效果如下:

二、附近兴趣点检索

兴趣点检索的逻辑和导航线路检索的逻辑相似,直接通过代码来演示:

//创建一个位置信息对象,第一个参数为经纬度,第二个为纬度检索范围,单位为米,第三个为经度检索范围,单位为米    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(tocoor, 5000, 5000);    //初始化一个检索请求对象    MKLocalSearchRequest * req = [[MKLocalSearchRequest alloc]init];    //设置检索参数    req.region=region;    //兴趣点关键字    req.naturalLanguageQuery=@"hotal";    //初始化检索    MKLocalSearch * ser = [[MKLocalSearch alloc]initWithRequest:req];    //开始检索,结果返回在block中    [ser startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {        //兴趣点节点数组        NSArray * array = [NSArray arrayWithArray:response.mapItems];        for (int i=0; i<array.count; i++) {            mkmapitem * item=array[i];            mkpointannotation * point = [[mkpointannotation alloc]init];            point.title=item.name;            point.subtitle=item.phonenumber;            point.coordinate=item.placemark.coordinate;            [mapview addannotation:point];        }    }];

效果如下:

原文链接:iOS原生地图开发进阶——使用导航和附近兴趣点检索

iOS原生地图开发进阶——使用导航和附近兴趣点检索的更多相关文章

  1. iOS原生地图开发指南续——大头针与自定义标注

    iOS原生地图开发指南续——大头针与自定义标注 出自:http://www.sxt.cn/info-6042-u-7372.html 在上一篇博客中http://my.oschina.net/u/23 ...

  2. iOS原生地图开发详解

    在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...

  3. iOS 原生地图 开发

    iOS开发有时候用到地图,不少人第一想到的是用第三方.当然有时候为了和安卓同步,可能会一起使用某一第三方.但有时候,我们是可以用原生地图开发的.上面两个示意图是原生地图的自定义开发.运行demo,将展 ...

  4. IOS原生地图与高德地图

    原生地图 1.什么是LBS LBS: 基于位置的服务   Location Based Service 实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App 2.定位方式 1.GPS定位  ...

  5. iOS原生地图与高德地图的使用

    原生地图 1.什么是LBS LBS: 基于位置的服务 Location Based Service 实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App 2.定位方式 1.GPS定位 2. ...

  6. iOS 原生地图地理编码与反地理编码

    当我们要在App实现功能:输入地名,编码为经纬度,实现导航功能. 那么,我需要用到原生地图中的地理编码功能,而在Core Location中主要包含了定位.地理编码(包括反编码)功能. 在文件中导入 ...

  7. iOS 原生地图(MapKit、MKMapView)轨迹渐变

    WechatIMG2.png 项目已接入高德地图,并且大部分功能已经实现好,但BOSS觉得iOS自带的地图效果更好...本着面向老板编程的思想,换之.还好,高德地图是在MapKit上封装的,大部分ap ...

  8. 如何初始化一个iOS原生地图

    /** 初始化一个mapView  需导入 #import <MapKit/MapKit.h> - returns: 返回一个mapView对象 */ mapView = [[MKMapV ...

  9. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

随机推荐

  1. MVC中的CSRF解决方案

    我们使用Ajax访问请求的时候,攻击者可能盗用了用户身份,以用户合法身份发送恶意请求. 具体预防措施, 1.在Html表单里面使用@Html.AntiForgeryToken(),这玩意会生成一对加密 ...

  2. Spring(三)Bean继续入门

    一.Aware相关接口 对于应用程序来说,应该尽量减少对Sping Api的耦合程度,然而有些时候为了运用Spring所提供的一些功能,有必要让Bean了解Spring容器对其进行管理的细节信息,如让 ...

  3. IOS 图片轮播实现原理 (三图)

    IOS 图片轮播实现原理的一种 图片轮播所要实现的是在一个显示区域内通过滑动来展示不同的图片. 当图片较少时我们可以采用在滚动视图上添加很多张图片来实现. 但是如果图片数量较多时,一次性加载过多图片会 ...

  4. iOS开发~UI布局(一)初探Size Class

    随着iOS8系统的发布,一个全新的页面UI布局概念出现,这个新特性将颠覆包括iOS7及之前版本的UI布局方式,这个新特性就是Size Class.Size Class配合Auto Layout可以解决 ...

  5. CoreAnimation-05-CABasicAnimation

    概述 简介 CABasicAnimation是抽象类CAPropertyAnimation的子类,可以直接使用 CABasicAnimation又称基本动画,从fromValue到toValue按照指 ...

  6. 在阿里云主机的Debian操作系统上安装Docker

    因为需要新搭建饭团网站,所以需要在阿里云的主机上跑数据库,java环境. 考虑到可扩展性和模块化,所以准备最近流行的docker技术.Docker -- 从入门到实践 阿里云主机1核1G,资源不多,所 ...

  7. 记录JVM垃圾回收算法

    垃圾回收算法可以分为三类,都基于标记-清除(复制)算法: Serial算法(单线程) 并行算法 并发算法 JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代 ...

  8. Linux与Windows共享文件夹之samba的安装与使用(Ubuntu为例)

    1.写在前面     当你在Windows上安装了一台Linux的虚拟机,你想访问Linux中的文件夹,将虚拟机中的文件复制到Windows主机上,你会怎么做呢?如果这台Linux主机不是虚拟机,而是 ...

  9. cocos2d-x之物理引擎之碰撞监测

    #include "HelloWorldScene.h" USING_NS_CC; #define RED_BIT_MASK    0b0100 #define GREEN_BIT ...

  10. jdbc至sql server的两种常见方法

    Statement和prepareStatement sql server中已建立BookPhone数据库,包含bookPhone表,eclipse中有BookPhone类,三个string类型的值 ...