文档章节

定位、目的地显示、路径规划、导航

杭城小刘
 杭城小刘
发布于 2017/05/01 10:26
字数 1430
阅读 28
收藏 0
点赞 0
评论 0

1、首先说说如何接入百度地图

1)首先打开百度地图开开放平台网站,。找到相关下载模块,根据需求下载所需的SDK包。我这里选择的是“全部下载”

2)其次需要在网站上申请密钥,申请步骤可查看官方文档。 申请密钥

3)在工程中接入百度地图。步骤说明:百度地图接入

使用CocoaPods。 在当前工程文件(.xcodeproj)所在文件夹下,打开terminal,创建Podfile touch Podfile 编辑Podfile内容如下: pod 'BaiduMapKit' #百度地图SDK 在Podfile所在的文件夹下输入命令: pod install (这个可能比较慢,请耐心等待……)

手动配置.framework形式开发包 在工程的3dparty目录下“New Group”,将所需的包引入 在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择BaiduMapAPI_**.framework添加到工程中。 注意:静态库采用objective-c++的形式开发,所以工程中至少要有一个.mm文件,或者修改Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++" 引入所需的系统库。CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework、libsqlite3.0.tbd(xcode7以前为 libsqlite3.0.dylib)、CoreTelephony.framework 、libstdc++.6.0.9.tbd(xcode7以前为libstdc++.6.0.9.dylib)。在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加这几个系统库即可。 如果项目需要基础地图功能则需引入mapapi.bundle资源文件。

4)在info.plist中加入 <key>LSApplicationQueriesSchemes</key> <array> <string>baidumap</string> <string>iosamap</string> </array>

2、在所需要的控制器里面加入地图显示用户当前定位、显示目标地址(用大头针标示出来)、路径规划导航(百度地图、高德地图、系统地图),详细说明见代码注释


//
// HotelLocationMapVC.m
// 住哪儿
//
// Created by geek on 2016/12/25.
// Copyright © 2016年 geek. All rights reserved.
//

#import "HotelLocationMapVC.h"
#import <BaiduMapAPI_Map/BMKMapComponent.h> //百度地图基本头文件
#import <BaiduMapAPI_Location/BMKLocationService.h> //百度地图定位头文件
#import <BaiduMapAPI_Search/BMKPoiSearch.h> //百度地图搜索头文件
#import <MapKit/MapKit.h> //打开系统地图所需的头文件

@interface HotelLocationMapVC ()<BMKMapViewDelegate,BMKLocationServiceDelegate,BMKPoiSearchDelegate>
@property (nonatomic, strong) UIButton *myLodactionButton; //我的位置按钮
@property (nonatomic, strong) UIButton *hotelLocationButton; //酒店位置按钮
@property (nonatomic, strong) UIButton *navigationButton; //开始导航按钮
@property (nonatomic, strong) BMKMapView *mapView; //地图基本
@property (nonatomic, strong) BMKLocationService *locService; //定位服务
@property (nonatomic, strong) BMKPoiSearch *poiSearch; //搜索服务
@property (nonatomic, strong) NSMutableArray *dataArray;
@property (nonatomic, strong) UIAlertController *alertController;
@property (nonatomic,assign) CLLocationCoordinate2D coordinate; // 要导航的坐标
@end

@implementation HotelLocationMapVC

#pragma mark - lice cyele
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}

-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[SVProgressHUD dismiss];
self.mapView.delegate = nil;
}

#pragma mark - private method
-(void)setupUI{
self.title = @"酒店位置";
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.mapView];
[self.locService startUserLocationService];
[self.view addSubview:self.navigationButton];
[self.view addSubview:self.myLodactionButton];
[self.view addSubview:self.hotelLocationButton];
}

-(void)startNavigation{
NSLog(@"开始导航");
[self presentViewController:self.alertController animated:YES completion:nil];
}

-(void)myPosition{
NSLog(@"我的位置");
}

-(void)hotelPosition{
NSLog(@"酒店位置");
}

#pragma mark - BMKLocationServiceDelegate
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{
self.mapView.showsUserLocation = YES;
[self.mapView updateLocationData:userLocation];
self.mapView.centerCoordinate = userLocation.location.coordinate;
self.mapView.zoomLevel = 18;
//周边云检索参数信息类
BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc] init];;
option.pageIndex = 0;
option.pageCapacity = 50;
option.location = userLocation.location.coordinate;
option.keyword = self.destination;
BOOL flag = [self.poiSearch poiSearchNearBy:option];
if (flag) {
NSLog(@"搜索成功");
[self.locService stopUserLocationService];
}else{
NSLog(@"搜索失败");
}
}

#pragma mark - BMKPoiSearchDelegate
- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResult errorCode:(BMKSearchErrorCode)errorCode{
if (errorCode == BMK_SEARCH_NO_ERROR) {
//只将搜索到的第一个点显示到界面上
BMKPoiInfo *info = poiResult.poiInfoList.firstObject;
//初始化一个点的注释
BMKPointAnnotation *annotoation = [[BMKPointAnnotation alloc] init];
self.coordinate = CLLocationCoordinate2DMake(info.pt.latitude, info.pt.longitude);
annotoation.coordinate = info.pt;
annotoation.title = info.name;
annotoation.subtitle = self.destination;
annotoation.subtitle = info.address;
[self.mapView addAnnotation:annotoation];
[self.mapView selectAnnotation:annotoation animated:YES];
/*
*将搜索到的所有结果显示出来
for (BMKPoiInfo *info in poiResult.poiInfoList) {
[self.dataArray addObject:info];
//初始化一个点的注释
BMKPointAnnotation *annotoation = [[BMKPointAnnotation alloc] init];
annotoation.coordinate = info.pt;
annotoation.title = info.name;
annotoation.subtitle = self.destination;
annotoation.subtitle = info.address;
[self.mapView addAnnotation:annotoation];
[self.mapView selectAnnotation:annotoation animated:YES];
}
*/
}
}

- (void)onGetPoiDetailResult:(BMKPoiSearch*)searcher result:(BMKPoiDetailResult*)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode{
NSLog(@"详情%@",poiDetailResult.name);
}

#pragma mark - BMKMapViewDelegate
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation{
if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
BMKPinAnnotationView *newAnnotation = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"an"];
newAnnotation.pinColor = BMKPinAnnotationColorRed;
newAnnotation.animatesDrop = YES;
return newAnnotation;
}
return nil;
}

- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view {
//poi详情检索信息类
BMKPoiDetailSearchOption *option = [[BMKPoiDetailSearchOption alloc] init];
BMKPoiInfo *info = self.dataArray.firstObject;
//poi的uid,从poi检索返回的BMKPoiResult结构中获取
option.poiUid = info.uid;
BOOL flag = [self.poiSearch poiDetailSearch:option];
if (flag) {
NSLog(@"检索成功");
}
else {
NSLog(@"检索失败");
}
}

#pragma mark - lazy load
-(BMKMapView *)mapView{
if (!_mapView) {
_mapView = [[BMKMapView alloc] initWithFrame:CGRectMake(0, 0, BoundWidth, BoundHeight)];
_mapView.showsUserLocation = YES;
_mapView.showIndoorMapPoi = YES;
_mapView.zoomLevel = 21;
_mapView.rotateEnabled = NO;
_mapView.delegate = self;
}
return _mapView;
}

-(BMKLocationService *)locService{
if (!_locService) {
_locService = [[BMKLocationService alloc] init];
_locService.delegate = self;
}
return _locService;
}

-(BMKPoiSearch *)poiSearch{
if (!_poiSearch) {
_poiSearch = [[BMKPoiSearch alloc] init];
_poiSearch.delegate = self;
}
return _poiSearch;
}

- (NSMutableArray *)dataArray {
if (!_dataArray) {
_dataArray = [NSMutableArray array];
}
return _dataArray;
}

-(UIButton *)navigationButton{
if (!_navigationButton) {
_navigationButton = [UIButton buttonWithType:UIButtonTypeCustom];
_navigationButton.frame = CGRectMake(BoundWidth-120, BoundHeight-64-140, 100, 30);
[_navigationButton setTitle:@"开始导航" forState:UIControlStateNormal];
;_navigationButton.titleLabel.font = [UIFont systemFontOfSize:14];
[_navigationButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_navigationButton.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.7];
_navigationButton.layer.cornerRadius = 5;
[_navigationButton clipsToBounds];
[_navigationButton addTarget:self action:@selector(startNavigation) forControlEvents:UIControlEventTouchUpInside];
}
return _navigationButton;
}

-(UIButton *)myLodactionButton{
if (!_myLodactionButton) {
_myLodactionButton = [UIButton buttonWithType:UIButtonTypeCustom];
_myLodactionButton.frame = CGRectMake(BoundWidth-120, BoundHeight-64-100, 100, 30);
[_myLodactionButton setTitle:@"我的位置" forState:UIControlStateNormal];
_myLodactionButton.titleLabel.font = [UIFont systemFontOfSize:14];
[_myLodactionButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_myLodactionButton.backgroundColor = [UIColor whiteColor];
_myLodactionButton.layer.cornerRadius = 5;
[_myLodactionButton clipsToBounds];
[_myLodactionButton addTarget:self action:@selector(myPosition) forControlEvents:UIControlEventTouchUpInside];
}
return _myLodactionButton;
}

-(UIButton *)hotelLocationButton{
if (!_hotelLocationButton) {
_hotelLocationButton = [UIButton buttonWithType:UIButtonTypeCustom];
_hotelLocationButton.frame = CGRectMake(BoundWidth-120, BoundHeight-64-60, 100, 30);
[_hotelLocationButton setTitle:@"酒店位置" forState:UIControlStateNormal];
_hotelLocationButton.titleLabel.font = [UIFont systemFontOfSize:14];
[_hotelLocationButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_hotelLocationButton.backgroundColor = [UIColor whiteColor];
_hotelLocationButton.layer.cornerRadius = 5;
[_hotelLocationButton clipsToBounds];
[_hotelLocationButton addTarget:self action:@selector(hotelPosition) forControlEvents:UIControlEventTouchUpInside];
}
return _hotelLocationButton;
}

-(UIAlertController *)alertController{
if (!_alertController) {
_alertController = [UIAlertController alertControllerWithTitle:@"请选择地图" message:nil
preferredStyle:UIAlertControllerStyleActionSheet ];
UIAlertAction *appleAction = [UIAlertAction actionWithTitle:@"苹果自带地图" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation];
MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:self.coordinate addressDictionary:nil]];
toLocation.name = self.destination;
[MKMapItem openMapsWithItems:@[currentLocation,toLocation] launchOptions:@{MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsShowsTrafficKey:[NSNumber numberWithBool:YES]}];
}];
UIAlertAction *tecentAction = [UIAlertAction actionWithTitle:@"高德地图" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&poiname=%@&lat=%f&lon=%f&dev=0&style=2",@"住哪儿",@"YGche",self.destination,self.coordinate.latitude,self.coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlString]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
}else{
[SVProgressHUD showInfoWithStatus:@"您的手机未安装高德地图"];
}
}];
UIAlertAction *baiduAction = [UIAlertAction actionWithTitle:@"百度地图" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name:%@&mode=driving&coord_type=gcj02",self.coordinate.latitude,self.coordinate.longitude,self.destination] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if ([[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
}else{
[SVProgressHUD showInfoWithStatus:@"您的手机未安装百度地图"];
}
}];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"退出" style:UIAlertActionStyleCancel handler:nil];
[_alertController addAction:appleAction];
[_alertController addAction:tecentAction];
[_alertController addAction:baiduAction];
[_alertController addAction:cancelAction];
}
return _alertController;
}

@end

如果要看完整Demo的,传送门:住哪儿App

© 著作权归作者所有

共有 人打赏支持
杭城小刘
粉丝 14
博文 108
码字总数 48328
作品 0
杭州
iOS工程师
基于GIS室内定位和导航的电子地图设计与应用

基于GIS室内定位和导航的电子地图设计与应用 上海为卓信息科技专业实现室内外GIS应用的设计研究,意在解决设计室内大型场馆的定位导航电子地图是为了改变传统室外定位导航模式,方便快捷地为...

睡得
2014/12/22
1K
2
中科院深圳先进技术研究院王鲁佳教授:机器人学视角下的自动驾驶与自动物流 | CCF-GAIR 2018

雷锋网按:2018 全球人工智能与机器人峰会(CCF-GAIR)在深圳召开,峰会由中国计算机学会(CCF)主办,雷锋网、香港中文大学(深圳)承办,得到了宝安区政府的大力指导,是国内人工智能和机器...

刘伟
07/05
0
0
DeepMind新论文:人工智能学会像哺乳动物那样抄近路

一手创造史上最强围棋人工智能AlphaGo的DeepMind团队,又教会了人工智能在迷宫中“抄近路”。北京时间5月10日凌晨1时,该英国团队在世界顶级学术杂志《自然》上发表论文称,其最新研发出的一...

澎湃新闻
05/10
0
0
iOS开发百度导航SDK的使用入门

iOS开发百度导航SDK的使用入门 百度地图API如何选择,以及关于百度地图的SDK的使用,可以参考我之前的一篇文章http://blog.sina.com.cn/s/blog_68661bd80101k4rx.html 在那篇的教程中已经讲解...

法斗斗
2016/01/15
64
0
【高小爱课堂】_地图API开发者教程(全平台精华版)

一、使用须知 二、坐标相关问题 三、标注问题 四、定位相关问题 五、云图 六、地图API 1)Javascript API 2)Android API 3)iOS API 4)Windows Phone 及win8 API 5)URI API ▼使用须知 Q:...

高德LBS开放平台
2014/06/13
1K
0
图吧地图导航SDK在安卓上的应用案例

近期,图吧(北京图为先科技有限公司)与厦门卫星定位应用股份有限公司,就厦门智慧出租项目展开深度合作。此次合作基于图吧导航SDK的离线导航开发包,为“厦门卫星定位”构建厦门智慧出租提...

幺小妖
2016/07/08
125
0
图吧地图夜间导航SDK接口应用案例

前不久,图吧(北京图为先科技有限公司)与水晶光电(浙江水晶光电科技股份有限公司)强强联合,合力打造一款名为Qrios游乐士的车载智能硬件, 基于图吧专业级Android导航SDK开发工具包,实现...

幺小妖
2016/07/08
163
1
iOS 集成百度导航问题

集成过 百度导航 的朋友们,请教个问题 需求:做个类似于滴滴打车 司机端的功能 按照逻辑 司机通过GPS 定位,获取 乘客的 出发地 和目的地。 我理解的是分为两次导航: 司机所在地 ~ 乘客出发...

卧龙小
2016/10/11
77
0
入门 | 无人驾驶汽车系统基本框架梳理

无人驾驶系统的核心可以概述为三个部分:感知(Perception),规划(Planning)和控制(Control),这些部分的交互以及其与车辆硬件、其他车辆的交互可以用下图表示: 感知是指无人驾驶系统从...

dqcfkyqdxym3f8rb0
05/30
0
0
基于ROS的自主导航小车Plantbot--自主导航

Navigation是ROS中实现导航的集(stack),Navigation工作机制如下图所示。 可以看到Navigation的输入包括:里程计信息、激光雷达或者rgbd-camera信息、已知的先验地图(可选)和坐标系变换信...

卓求
2017/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
1
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
0
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
0
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
1
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
0
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部