ios 点生成线路 百度地图_iOS百度地图路径规划和POI检索详细总结

2023-05-16

开篇

喵神镇楼.jpg

最近写简书不多,除了前段时间一篇匆匆的FFMPEG的理论学习基本没写多少,主要是最近比较忙,又是硬件设备的调试,又是新需求的加入,今天就来写一下项目中的一个知识,闲话少叙直入正题吧。

iPhone_6_-_iPhone_6___iOS_9_3__13E230_.png

百度地图的使用

百度地图API的导入网上说了许多坑,不过我遇到的比较少,这里就放两个比较常见的吧。

坑一:

奥联WIFI_xcodeproj.png

如上图所示,在infoplist里加入这个字段,而且这里还可以设置提示的内容。不加的话,嘿嘿嘿,期待你的尝试。

坑二:如下图

Pasted_Graphic_jpg.png

导入百度地图API运行之后报上图错误大约18到20个左右,解决方法添加libstdc++.6.0.9 的库。

填完坑之后看一下我们今天要演示的效果吧。

路线规划图.gif

这里实现的内容就是在定位到的当前城市内的路径规划,实现驾车,公交,步行三种规划方式。

注意要点:

这里我们采用的是地点到地点之间的路径规划,所以我们在查询的过程中一定要设置查询的城市,不然无法查找成功(当然也可以用经纬度的方式,那就另说了)。

方式切换问题,如果我们想要像上图所示的不同路径规划间的切换,我们要注意的就是地图上已经存在的路线轨迹和标注的清除问题。

我们在不同条件下规划路径要注意他们是不同的查询方法,以及他们不同的协议方法,这个我们可以具体点进百度地图静态库的方法去查看。

代码的实现

由于在项目中,并没有整理出来,这里我们就贴一些主要的代码。

因为三种路径规划其实原理一致这里我们以驾车的路径规划做一个例子。

因为要顾及到在此之前是否有轨迹和标注因此我们要先做清除处理,代码如下

[_mapView removeOverlays:_mapView.overlays];

NSArray *annArray = [[NSArray alloc]initWithArray:_mapView.annotations];

[_mapView removeAnnotations: annArray];

之后我们创建路径规划的方法

_searcher = [[BMKRouteSearch alloc]init];

_searcher.delegate = self;

//发起检索

BMKPlanNode* start = [[BMKPlanNode alloc]init] ;

start.name = _startFiled.text;

BMKPlanNode* end = [[BMKPlanNode alloc]init];

end.name = _endFiled.text;

start.cityName = self.city;

end.cityName = self.city;

BMKDrivingRoutePlanOption *driveRouteSearchOption =[[BMKDrivingRoutePlanOption alloc]init];

driveRouteSearchOption.from = start;

driveRouteSearchOption.to = end;

这里要注意的就是因为我们是驾车路径规划,所以创建的是BMKDrivingRoutePlanOption,我们进入到内部方法可以看到,入过我们是公交和步行对应的则是他们各自的Option,发起检索成功后会调取他的协议方法,这里的前提是要遵循BMKRouteSearchDelegate协议

- (void)onGetDrivingRouteResult:(BMKRouteSearch*)searcher result:(BMKDrivingRouteResult*)result errorCode:(BMKSearchErrorCode)error

在上述的协议方法中,我们设置起点,终点,以及路段入口信息和各轨迹点的总数

for (int i = 0; i < size; i++) {

BMKDrivingStep *tansitStep = [plan.steps objectAtIndex:i];

if (i == 0 ) {

BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];

annotation.coordinate = plan.terminal.location;

annotation.title = @"起点";

[_mapView addAnnotation:annotation];

} else if (i == size - 1) {

BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];

annotation.coordinate = plan.terminal.location;

annotation.title = @"终点";

[_mapView addAnnotation:annotation];

}

BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];

annotation.coordinate = tansitStep.entrace.location; //路段入口信息

annotation.title = tansitStep.instruction; //路程换成说明

[_mapView addAnnotation:annotation];

//轨迹点总数累计

planPointCounts += tansitStep.pointsCount;

}

//轨迹点

BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts]; //文件后缀名改为mm

int i = 0;

for (int j = 0; j < size; j++) {

BMKTransitStep *transitStep = [plan.steps objectAtIndex:j];

int k = 0;

for (k = 0; k < transitStep.pointsCount; k++) {

temppoints[i].x = transitStep.points[k].x;

temppoints[i].y = transitStep.points[k].y;

i++;

}

}

//通过points构建BMKPolyline

BMKPolyline *polyLine = [BMKPolyline polylineWithPoints:temppoints count:planPointCounts];

[_mapView addOverlay:polyLine]; //添加路线overlay

delete []temppoints;

[self mapViewFitPolyLine:polyLine];

这样我们就完成了路径规划的主要设置。

POI检索

百度地图提供了详细的POI检索,如下图我们设置一个界面选择我们想要检索的内容,然后根据我们选择的内容去在地图上标记处各个对应的点,并显示出他的详细信息。然后我们点击具体的cell,然后我们根据模型中的数据地点或者经纬度,可以规划处我们所在地到目的地的线路规划,一样有驾车,公交,步行,三种。这里不得不吐槽一下为啥那么多电话都没有嘞。

IMG_0003.PNG

IMG_0004.PNG

我们要进行POI检索,首先要遵循BMKPoiSearchDelegate协议,然后进行检索

_searcher2 =[[BMKPoiSearch alloc]init];

_searcher2.delegate = self;

//发起检索

BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init];

option.pageIndex = 1; //当前索引页

option.pageCapacity = 10; //分页量

option.location = CLLocationCoordinate2DMake(self.lat2, self.lon2);

option.keyword = self.str;

option.radius = 3000;

BOOL flag = [_searcher2 poiSearchNearBy:option];

if(flag)

{

NSLog(@"周边检索发送成功");

}

else

{

NSLog(@"周边检索发送失败");

}

检索成功后会走到协议方法

- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error

在这里我们得到了包含详细信息的一个数组,然后我们取出BMKPoiInfo对象中的uid,去进行详细检索,同时并把它转换为一个model,去创建我们的tableview,然后把得到的对应数据展示到下半部的列表中,在点击tableview的详细事件中进行传值,实现路线的规划。model中的部分属性如下:

@interface GSMapModel : NSObject

///POI名称

@property (nonatomic, strong) NSString* name;

///POIuid

@property (nonatomic, strong) NSString* uid;

///POI地址

@property (nonatomic, strong) NSString* address;

///POI所在城市

@property (nonatomic, strong) NSString* city;

///POI电话号码

@property (nonatomic, strong) NSString* phone;

///POI邮编

@property (nonatomic, strong) NSString* postcode;

详情检索对应的协议方法

//搜索的详细结果

- (void)onGetPoiDetailResult:(BMKPoiSearch*)searcher result:(BMKPoiDetailResult*)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode{

if (errorCode == BMK_SEARCH_NO_ERROR) {

//在此处理正常结果

}

else if (errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD){

//当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表

// result.cityList;

NSLog(@"起始点有歧义");

} else {

NSLog(@"抱歉,未找到结果");

}

大头针的自定义

我们想要自己定义我们想要看到的大头针模样,就要对他进行自定义。下面介绍一种简单的处理大头针样式的方法,如果想要具体的根据不同的情形来进行自定义,就要进行判断,根据他们不同的情况去给定相应的标注图片

- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id)annotation{

BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];

newAnnotationView.pinColor = BMKPinAnnotationColorPurple;

newAnnotationView.animatesDrop = NO;// 设置该标注点动画显示

newAnnotationView.annotation=annotation;

newAnnotationView.image = [UIImage imageNamed:@"mapicon"]; //把大头针换成别的图片

newAnnotationView.size = CGSizeMake(20, 33);

return newAnnotationView;

}

后记

地图中我们用的比较多的就是定位,POI检索和路径规划了,定位的话,相信不管是官方SDK还是网上各种资料都够详细的了,我就不再重复了,这里主要对路径规划和POI检索做出说明,希望对大家有所帮助。

补充内容

今天有小伙伴问看了文章想知道百度地图的模糊搜索是怎么做的,输入地名就能自动联想好厉害的样子,这里就补充一下吧,其实也是POI搜索的一部分,是城市内搜索根据输入的地名发起搜索,然后把搜索内容展示到tableview上罢了。如下图:

模糊搜索.gif

当我们改变输入框的内容时其实内部的操作是什么呢,下面我们一点点介绍一下他。

这里我们要做的是POI检索,因此首先要遵循BMKPoiSearchDelegate协议,创建搜索的代码如下:

_poisearcher = [[BMKPoiSearch alloc]init];

_poisearcher.delegate = self;

BMKCitySearchOption *citySearchOption = [[BMKCitySearchOption alloc]init];

citySearchOption.pageIndex = 0;

citySearchOption.pageCapacity = 20;

citySearchOption.city= self.city;

citySearchOption.keyword = _inputFiled.text;

成功之后会走下面这个协议方法

-(void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode

这里我们就得到了返回的内容,然后把它里面的数据取到转换为模型展示到tableview上就好了,但是,为什么是但是呢,因为你这样做并不能得到想要的结果,因为你这里做的检索只是一次的,并不能实现每改变一个字就重新检索展示出地点,我们要对输入框做处理

[_inputFiled addTarget:self action:@selector(inputaction:) forControlEvents:UIControlEventEditingChanged];

添加事件,实现对输入框变化的监听,然后实现方法。

#pragma mark - 输入框的实时监听

-(void)inputaction:(UITextField *)textField{

[self performSelector:@selector(delay) withObject:self afterDelay:0.5];

}

这里我们监听输入框的变化,然后把相应的检索写到delay方法中就可以了。这样就实现了数据的展示,然后点击对应的cell的时候,把数据传给上个界面接Ok了啊,这里为了用户体验我们可以监听tableview的滚动,当滚动的时候让输入框的键盘消失,代码如下:

#pragma mark -滚动隐藏键盘

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{

[self.view endEditing:YES];

}

这样我们就实现了模糊搜索了,是不是还是比较简单的。有别的问题以后再接着补充吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios 点生成线路 百度地图_iOS百度地图路径规划和POI检索详细总结 的相关文章

  • 阿里巴巴-游戏开发面经

    文章目录 投递简历的过程 7 20号 面试 了解到的基本信息 技术面试的问题 方法一 穷举遍历 方法2 标记 方法3 快慢指针 方法4 set集合大小变化 投递简历的过程 7 17 号在上班的过程中突然实习僧的 hr 打电话给我说看到我的简
  • 支付宝支付和微信支付容易被风控可以看一下这个操作

    1 主要问题 xff1a 微信支付使用过程中容易出现微信支付商户号被交易拦截 xff0c 关闭支付权限 xff0c 关闭体现结算等风控情景 支付宝支付的过程中 xff0c 用户付款经常会提示防范兼职刷单等风控提醒 xff0c 暂停支付 xf
  • rClone 挂载Webdav

    0 习惯性的废话 好久不见甚是想念 xff0c 昨天剁手买了台Miix4低配版 xff0c 两台电脑之间的数据同步就需要考虑了 xff0c 自建了NextCloud xff0c 但把主力机一天到晚开着也不是个事 想到弄个支持Webdav的网
  • 身份证实名认证接口,实名认证API接口文档

    1 适用范围 为预防冒名注册 恶意注册等行为 xff0c 实名认证已经成为当下互联网环境下必不可少的一个环节 比如用户在进行信息发布 评论 社交等行为时 xff0c 都需要先进行实名认证 它能够帮助互联网平台对入驻用户进行真实性核验 xff
  • 商品条码API接口,免费好用

    1 前言 商品条码接口 xff0c 能实现生成指定编码信息的条形码和根据条形码code值获取商品信息 2 接口明细 注意 xff1a app id和app secret是临时秘钥 2 1 生成指定条形码 接口地址 xff1a https w
  • URL生成短链接API接口

    1 前言 URL生成短链接口 xff0c 可将长链接生成短链 xff0c 方便分发和推广 查看接口完整信息 xff1a https www idmayi com doc detail id 61 26 2 接口明细 注意 xff1a app
  • 节假日万年历API接口,免费好用

    1 前言 节假日万年历接口 xff0c 能实现查询指定日期 月份 年份 时间范围的节假日和万年历信息 xff0c 万年历的信息包含农历信息 xff0c 宜忌等信息 这个接口的主要特点是 xff0c 返回某个节日是否是工作日 xff0c 节日
  • 美女福利图片API接口,免费好用

    1 前言 美女图片福利查询接口 xff0c 能获取一些青春靓女的图片 xff0c 拿来做一些demo非常合适 查看接口完整信息 xff1a https www idmayi com doc detail id 61 15 2 接口明细 注意
  • 文本情感倾向分析API

    一 前言 文本情感倾向分析API xff0c 对带有情感色彩的主观性文本进行分析 处理 归纳和推理 二 接口文档 应用场景 商品评论的分析 电影或电视剧的评论分析 大众舆论导向分析 人物的情绪分析 人物关系分析 产品的比较分析 对某一个事件
  • 语音通知 API

    一 前言 语音通知API xff0c 通过系统发起电话直呼并播放通知内容 支持静态和动态语音 xff0c 可自定义通知内容 二 接口文档 特性 语音专线主动呼叫用户 xff0c 解决短信拦截等无法收到短信验证痛点 文本识别文本智能语音转化
  • 银行卡OCR API

    一 前言 银行卡OCR API xff0c 可以自动定位银行卡图片区域 xff0c 支持识别银行卡正面信息 xff0c 包含银行卡号 银行卡类型 银行名称等信息 二 应用场景 金融远程身份认证 使用身份证OCR和银行卡OCR实现用户信息的自
  • Centos7系统使用kubeadm方式安装k8s集群v1.26.1版本

    kubeadm方式安装k8s集群 一 准备机器 主机说明192 168 0 11master节点 xff0c 能连外网 xff0c 官网最低要求2核2G192 168 0 12node1节点 xff0c 能连外网 xff0c 官网最低要求2
  • 使用PIL和几种分类算法对标准数字图片进行识别

    详细代码见GitHub https github com nickliqian simple number recognition simple number recognition 使用PIL和几种分类算法对标准数字图片进行识别 背景 在
  • windows10修改子系统ubuntu安装路径

    1 查看当前安装的子系统版本 wsl l v 2 导出子系统文件到d盘 wsl export Ubuntu d ubuntu tar 3 注销当前子系统 wsl unregister Ubuntu 4 重新导入子系统到d盘 wsl impo
  • 字节高频题补充 检测循环依赖

    和 力扣207 课程表 相似 循环依赖检测 如 xff0c 39 A 39 39 B 39 39 B 39 39 C 39 39 C 39 39 D 39 39 B 39 39 D 39 61 gt false xff0c 39 A 39
  • 解决Python模块导入出现ModuleNotFoundError: No module named ‘***’的问题

    Python的模块非常多 xff0c 在安装这些模块的时候 xff0c 由于安装方法的不同 xff08 pip easyinstall xff09 xff0c 在python加载这些包时 xff0c 出现ModuleNotFoundErro
  • centos7端口管理

    1 开放端口 firewall cmd zone 61 public add port 61 5672 tcp permanent 开放5672端口 firewall cmd zone 61 public remove port 61 56
  • Rust安装后执行第一个程序遇到的问题

    当按照 https kaisery github io trpl zh cn ch01 02 hello world html 学习教程编写第一个Helloworld 执行rustc命令后汇报如下错误 G rustspace gt rust
  • 构建openvidu-loadtest工具-问题记录

    docker中创建ubuntu22 04的容器 xff0c 编译openvidu loadtest xff0c 遇到以下问题 xff0c 做备忘以便日后翻看 问题1 执行apt update更新镜像源库时发生错误 xff1a Updates
  • linux下-bash: ***: command not found解决办法

    今天在阿里云虚拟机上配置环境时出现 bash command not found错误 xff0c 网上找了一下 xff0c 方法如下 xff1a 如输入ls 出现 bash ls command not found ipconfig 出现

随机推荐

  • vue websocket 实现页面实时刷新

    vue websocket 实现页面实时刷新 最近公司项目需求后台web端要做实时能看到用户的登录状态以及所在位置 xff0c 说白了就是要做数据实时刷新 直接上代码吧 xff01 lt DOCTYPE html gt lt html la
  • Java 位运算详解

    目录 一 Java中支持的位运算 二 位运算规则 三 逻辑运算 xff08 一 xff09 与运算 xff08 amp xff09 一 运算规则 二 运算流程 xff08 二 xff09 或运算 xff08 xff09 一 运算规则 二 运
  • manjaro连接远程服务器

    不用下再window里面的类似XShell xff0c 只需要直接连就行 但是在ubuntu里面需要开启SSH服务 xff0c 再前边的文章里面有 xff0c 这篇只针对manjaro ssh username 64 100 100 100
  • GitLab创建SSH Key 过程

    1 首先你需要在github上或者gitlab上建立了自己的账户 xff0c 项目组已经将你加入了group 2 打开git bash xff0c 输入命令 ls al ssh xff0c 如果提示 xff0c ls cannot acce
  • wls2 ubuntu设置固定IP地址,并实现开机启动

    wls2 ubuntu设置固定IP地址 xff0c 并实现开机启动 64 echo off setlocal enabledelayedexpansion wsl shutdown Ubuntu 20 04 wsl u root d Ubu
  • 使用cmake调用swig生成库,Python调用C/C++

    前言 xff1a 项目中使用构建工具是cmake xff0c 为了集成我们的系统进去 xff0c 需要使用cmake来调用swig xff0c 然后swig生成python可执行的库 我的环境 xff1a win10swig 4 0 2py
  • C语言 : weak_alias描述

    weak alias 是一个宏 xff0c 其目的是为函数添加一个 弱 别名 xff0c 与 强 符号函数名区分 说明 如果调用函数无对应的函数无 强 符号对应的函数 xff0c 则会调用该别名对应的函数C C 43 43 函数调用是以编译
  • 结构体及结构体数组的定义

    1 结构体 结构体是用户自定义的可用的数据类型 xff0c 它允许您存储不同类型的数据项 2 结构体的定义 以学生的基本信息为例 xff0c 包括四个变量 xff1a 姓名 年龄 性别 学号 xff08 1 xff09 定义了一个结构体ST
  • Linux离线安装GitLab

    1 下载安装包 xff1a https mirrors tuna tsinghua edu cn gitlab ce yum el7 C 61 M amp O 61 D 2 rz 上传安装包到安装服务器 3 检查依赖 xff1a 分别执行以
  • 国内几个maven镜像源,国内maven仓库,阿里,华为,腾讯,网易

    span class token operator lt span mirror span class token operator gt span span class token operator lt span id span cla
  • word转pdf时图片模糊/分辨率不高解决方案

    一般我们进行文件传输时 xff0c 为了保持格式的稳定性 xff0c 经常会将doc格式转为pdf格式 xff0c 但是有时会发现转换后图片会变得异常模糊 xff0c 分辨率不高 网上有很多解决办法 xff0c 但大多比较复杂且最终效果不好
  • Vm虚拟机扩展Ubuntu系统磁盘空间

    Vm虚拟机扩展Ubuntu系统磁盘空间 前言 一般我们在安装虚拟机时都会选择默认的20G磁盘空间 xff0c 但是一旦需要搭建一两个交叉编译环境后 xff0c 20G的空间就无法满足了 xff0c 我就是出现了这样的情况 xff0c 所以也
  • linux环境下如何调鼠标灵敏度,如何在Ubuntu中配置鼠标设置

    Ubuntu是open source操作系统 xff0c 它使您可以对最小的系统模块进行大量配置 其中之一就是您要使用外部USB鼠标的方式 在本文中 xff0c 我们将介绍如何对鼠标设置进行以下更改 xff1a 将左 右按钮设置为主按钮 通
  • python获取屏幕文字_详解:四种方法教你对Python获取屏幕截图(PyQt , pyautogui)...

    前言 xff1a 今天为大家带来的内容是详解 xff1a 四种方法教你对Python获取屏幕截图 PyQt pyautogui 本文具有不错的参考意义 xff0c 希望能够帮助到大家 xff01 Python获取电脑截图有多种方式 xff0
  • java 字符串子串_java实现字符串匹配求两个字符串的最大公共子串

    本文实例讲述了java实现求两个字符串最大公共子串的方法 分享给大家供大家参考 xff0c 具体如下 xff1a 最近在项目工作中有一个关于文本对比的需求 xff0c 经过这段时间的学习 xff0c 总结了这篇博客内容 xff1a 求两个字
  • 7、MySQL——聚合函数、分组查询、HAVING和WHERE子句的区别、LIMIT、分页查询

    目录 一 聚合函数 1 纵向统计 xff1a COUNT 2 纵向求和 xff1a SUM 3 纵向求平均数值 xff1a AVG 4 MAX和MIN 二 分组查询 三 HAVING子句和WHERE子句的区别 四 LIMIT 五 分页查询
  • IOS - 组件化的几种方案分析(转)

    该文章分析的挺不错的记录 xff1a https www cnblogs com fishbay p 7216084 html
  • MTU值介绍

    MTU 即Maximum Transmission Unit 最大传输单元 大部分网络设备的MTU都是1500 如果本机的MTU比网关的MTU大 xff0c 大的数据包就会被拆开来传送 xff0c 这样会产生很多数据包碎片 xff0c 增加
  • python 嵌套数组_python列表、元组、字典的区别

    一 列表 1 任意对象的有序集合 列表是一组任意类型的值 xff0c 按照一定顺序组合而成的 2 通过偏移读取 组成列表的值叫做元素 Elements 每一个元素被标识一个索引 xff0c 第一个索引是0 xff0c 序列的功能都能实现 3
  • ios 点生成线路 百度地图_iOS百度地图路径规划和POI检索详细总结

    开篇 喵神镇楼 jpg 最近写简书不多 xff0c 除了前段时间一篇匆匆的FFMPEG的理论学习基本没写多少 xff0c 主要是最近比较忙 xff0c 又是硬件设备的调试 xff0c 又是新需求的加入 xff0c 今天就来写一下项目中的一个