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. Dynamics AX for Retail POS Development blogs

    Dynamics AX for Retail POS Development Dynamics AX for Retail POS Development - Code Samples AX for ...

  2. Swift学习--常量.变量.数据类型的使用(一)

    一.Swift中的常量和变量 /* Swift 中定义常量和变量用let/var let 代表定义一个常量 var 代表定义一个变量 Swift 中代表定义常量和变量不需要写数据类型,编译器辉根据我们 ...

  3. windows 我的电脑右键 无法打开管理窗口

    保存成reg文件,执行一下就好了. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069- ...

  4. 深入理解java虚拟机(3)---类的结构

    计算机在开始的时候,只认识0和1,所以汇编语言是和机器结构或者说CPU绑定的.ARM体系结构就是这样一种体现,指令集的概念. 随着高级语言的出现,从字编码发展到了字节编码,计算机的先驱希望能够让语言能 ...

  5. 使用Ant构建struts2 web工程,自动编译,打包成war

    c&c++语言通常使用make脚本来构建和管理自己的工程,同样java也有自己的构建工具(Ant),使用时需要写一个biuld.xml,有点类似c&c++里的makefile. 一.首 ...

  6. Effective Java 59 Avoid unnecessary use of checked exceptions

    The burden is justified if the exceptional condition cannot be prevented by proper use of the API an ...

  7. Mysql的float类型造成的困扰总结

    因为换了工作正在学习使用MySQL,今天领导提出了一个问题,如下: X列是累加值,A列是每日新增值,那么X2应该是X1+A2,而且存储过程里也是这样计算的.可是奇怪的是X2的值却总是和正确值(2396 ...

  8. linux安装pylab

    在linux下就是一句话 sudo apt-get install python-matplotlib 该工具包含了pylab, numpy,scipy和matplotlib四个工具包 对matplo ...

  9. jquery实践案例--验证手机号码

    如果要做手机号的验证,那么我们需要知道手机号码的号段. 182 183 187 188 155 156 176 186 189 //移动运营商:170 移动: 2G号段(GSM):134-139.15 ...

  10. hive的常用命令

    #从hive中直接进入hdfs的daas/bstl/term/userinfo目录下 hive> !hadoop fs -ls /daas/bstl/term/userinfo; 查看hive表 ...