转载自:http://www.sxt.cn/info-6041-u-7372.html

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

一个地点信息类,如下:

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

(2)MKMapItem

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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

导航请求类

1
2
3
4
5
6
7
8
9
@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;

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

1
2
3
4
5
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服务器获取数据的连接类

1
2
3
4
5
6
7
8
9
10
11
12
@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

线路信息结果类

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

(6)MKETResponse

时间信息结果类

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

(7)MKRoute

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

1
2
3
4
5
6
7
8
9
10
11
12
13
@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

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

1
2
3
4
5
6
7
8
9
10
11
12
@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、进行线路导航

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
- (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 = [[MKPointAnnotation 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<MKOverlay>)overlay{
    MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithPolyline:overlay];
     
    renderer.strokeColor = [UIColor redColor];
     
    renderer.lineWidth = 4.0;
     
    return  renderer;
}
//标注的代理方法
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
    MKPinAnnotationView * view= [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"anno"];
    view.canShowCallout=YES;
    return view;
}

效果如下:

二、附近兴趣点检索

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    //创建一个位置信息对象,第一个参数为经纬度,第二个为纬度检索范围,单位为米,第三个为经度检索范围,单位为米
    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原生地图开发进阶——使用导航和附近兴趣点检索相关推荐

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

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

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

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

  3. iOS 国外地图开发 谷歌地图坐标放到苹果地图上坐标不准确

    首先请允许我发一个牢骚.苹果地图这个坑... 一 .我们要开发一个国外定点展示房屋信息的地图应用.效果图如下: . 二.第一反应用苹果原生地图Mapkit做.我们的坐标点都是从谷歌地图上取出来的. 功 ...

  4. iOS 高德地图开发详解

    Demo地址 如果有所帮助记得关注,点Star demo中添加了查看路况功能,如果不需要,可以删除. ##一:基本地图功能实现 ####1.申请密钥流程 申请密钥链接 2.配置环境(重点) 高德地图提 ...

  5. 安卓和iOS原生App开发招聘

    待遇:7000~10000元 岗位职责: 1 .全程参与并负责设计.开发Android.ios平台上应用程序: 2.担任App产品开发任务,可以独立完成App的开发: 3.2年以上android全时开 ...

  6. iOS 百度地图开发集成使用 (转)

    m 项目需要集成百度地图,那么关于如何集成百度地图的事,就自己去百度开放平台查看文档吧,这是非常简单的事,在这里就不多说了. 那么下面我就说说我在这个demo里所做的事. 首先,项目需要具备定位及计算 ...

  7. iOS 百度地图开发集成使用

    项目需要集成百度地图,那么关于如何集成百度地图的事,就自己去百度开放平台查看文档吧,这是非常简单的事,在这里就不多说了. 那么下面我就说说我在这个demo里所做的事. 首先,项目需要具备定位及计算两地 ...

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

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

  9. iOS混合开发之uni-app本地打包集成到iOS原生项目

    iOS混合开发 1.前言 2.项目背景 3.项目框架 4.从入坑到踩坑 4.1打包错误 4.2 运行错误 总结 1.前言     前端统一开发越来越多,公司为了大一统前端的所有页面显示问题,同时为节约 ...

  10. iOS-地理坐标转换,原生地图获取的原始坐标转换为地图真实坐标

    GPS以及iOS系统定位获得的坐标是地理坐标系WGS1984,Web地图一般用的坐标细是投影坐标系WGS 1984 Web Mercator,国内出于相关法律法规要求,对国内所有GPS设备及地图数据都 ...

最新文章

  1. OpenResty 最佳实践
  2. android工程r红,Android Studio - 为什么R随机变为红色?
  3. 14.Python抠图脚本
  4. php7和python3性能对比-python2.7和3.7的区别
  5. 项目手札2---关于分页显示时地址栏的风格
  6. 实现单词大小写不敏感的正则表达式的匹配!
  7. The command (dfs.browser.action.delete) is undefined 解决Hadoop Eclipse插件报错
  8. Gartner数据:RPA以75.6%增长率成2019年Q1增速最快的企业级软件(附全球十大RPA市场数据)
  9. 匹配区县代码_全国区县代码1
  10. Windows上编写汇编程序
  11. 【WiFi】WiFi 5G信道和频宽的对应关系
  12. OCR通用文字识别接口
  13. 信息系统项目管理师-软考-B站自学
  14. 线上Request method ‘GET‘ not supported 问题
  15. 如何做好一个产品经理
  16. Java脚本写的随机验证码
  17. mfc中在vector里添加控件类型的数据时出现C2248错误
  18. 两轮自平衡机器人(一)---Simscape物理建模
  19. springboot发送邮箱(阿里云、QQ邮箱)
  20. 【科普】Kubectl基本操作命令

热门文章

  1. (日常搬砖)数据集标注格式转换:txt转xml(VOC格式)
  2. docker-compose 学习:通过 image 指令指定镜像搭建一个简单LNMP
  3. 百度编辑器ueditor中的表格添加边框和颜色
  4. 当vue遇到pwa--vue+pwa移动端适配解决方案模板案例
  5. AI+进入科学界:人工智能将主导原子世界的科学发现进程
  6. 【专家专栏】浅谈百度搜索排序
  7. 当程序员是我最大的遗憾
  8. 使用火狐解决网站图片不能复制下载的问题
  9. 手工删除oracle的方法
  10. Ubuntu 64-bit下搭建 Apache 2、PHP5、MySQL、GO Web服务器