iOS地图集成示例:百度地图POI检索
一、集成百度地图(傻瓜教程,以网站说明文档为准,此处罗列几项主要步骤)
1、登录 http://lbsyun.baidu.com 百度地图开发者平台,获取SDK和集成文档。
2、百度地图可以提供的一些服务
(1)地图:提供地图展示和地图操作功能;
(2)POI检索:支持周边检索、区域检索和城市内兴趣点检索;
(3)地理编码:提供经纬度和地址信息相互转化的功能接口;
(4)线路规划:支持公交、驾车、步行、骑行,四种方式的线路规划;
(5)覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息;
(6)定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式);
(7)离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果;
(8)调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能;
(9)周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能;
(10)LBS云检索:支持查询存储在LBS云内的自有数据;
(11)瓦片图层: 支持在地图上添加自有瓦片数据。
(12)特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用;
2、创建应用,获得AppKey (密钥)
(1)这里需要以开发者身份获得key
(2)注意和Bundle Identifier的绑定
3、配置集成前的注意事项
(1)严格参考文档!
(2)几个注意点
<1> iOS9.0之后,要在Info.plist配置ATS
<2> 在Info.plist配置 百度地图应用的白名单(支持在自己的应用中打开百度地图)
<3> 管理地图的生命周期(手动将代理置空)
<4>在Info.plist中添加获取定位授权的提醒
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述
4、配置开发环境
(1)添加百度的静态库(.framework)
(2)导入一大堆的系统库
(3)添加地图包(mapapi.bundle资源文件)
(4)引入所有的头文件
5、初始化地图
(1)初始化BMKMapManager
(2)创建BMKMapView
6、基础地图
(1)参阅文档!http://lbsyun.baidu.com/index.php?title=iossdk/guide/basicmap
(2)一些功能的了解
<1>地图类型:普通矢量地图、卫星图和空白地图(节省流量)
<2>打开实时路况图层
<3>热力地图
<4>手势、地图控制、底标、折线(几何图形的遮盖)
<5>设置地图显示范围
<6> 等等等。。。
二、百度地图POI检索
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | #import "ViewController.h" @ interface ViewController ()<BMKMapViewDelegate,BMKPoiSearchDelegate> @property(nonatomic,weak)BMKMapView * mapView; @property(nonatomic,weak)UITextField * tf; @property(nonatomic,strong)BMKPoiSearch * poisearch; @end @implementation ViewController - ( void )viewDidLoad { [super viewDidLoad]; //设置地图 BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)]; self.mapView = mapView; [self.view addSubview:mapView]; //设置开始查找按钮和输入文本框 UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(30, 30, 100, 30)]; [btn setTitle: @"开始查找" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; [btn setBackgroundColor:[UIColor orangeColor]]; [self.view addSubview:btn]; UITextField * tf = [[UITextField alloc]initWithFrame:CGRectMake(150, 30, 100, 30)]; self.tf= tf; tf.backgroundColor = [UIColor orangeColor]; [self.view addSubview:tf]; //实例POI检索化检索对象,并设置代理 self.poisearch = [[BMKPoiSearch alloc]init]; self.poisearch. delegate = self; } -( void )btnClick :(UIButton *)btn { //检索参数 BMKCitySearchOption *citySearchOption = [[BMKCitySearchOption alloc]init]; citySearchOption.pageIndex = 0; //当前页码 citySearchOption.pageCapacity = 20; //每页个数 citySearchOption.city= @"北京" ; //城市 citySearchOption.keyword = self.tf.text; //关键字 酒店 //根据检索参数,进行检索,并返回检索结果的标识 BOOL flag = [_poisearch poiSearchInCity:citySearchOption]; if (flag) { NSLog( @"城市内检索发送成功" ); } else { NSLog( @"城市内检索发送失败" ); } } #pragma mark implement BMKSearchDelegate - ( void )onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult*)result errorCode:(BMKSearchErrorCode)error { // 清除屏幕中所有的annotation NSArray* array = [NSArray arrayWithArray:_mapView.annotations]; [_mapView removeAnnotations:array]; //正确 if (error == BMK_SEARCH_NO_ERROR) { NSMutableArray *annotations = [NSMutableArray array]; //遍历返回的查询结果 for ( int i = 0; i < result.poiInfoList.count; i++) { BMKPoiInfo* poi = [result.poiInfoList objectAtIndex:i]; BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init]; item.coordinate = poi.pt; item.title = poi.name; [annotations addObject:item]; } //给地图添加大头针模型 [_mapView addAnnotations:annotations]; [_mapView showAnnotations:annotations animated:YES]; } else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){ NSLog( @"起始点有歧义" ); } else { // 各种情况的判断。。。 } } #pragma mark implement BMKMapViewDelegate /** *根据anntation生成对应的View *@param mapView 地图View *@param annotation 指定的标注 *@return 生成的标注View */ - (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation { // 生成重用标示identifier NSString *AnnotationViewID = @"xidanMark" ; // 检查是否有重用的缓存 BMKAnnotationView* annotationView = [view dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID]; // 缓存没有,自己构造一个,一般首次添加annotation代码会运行到此处 if (annotationView == nil) { annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID]; ((BMKPinAnnotationView*)annotationView).pinColor = BMKPinAnnotationColorRed; // 设置重天上掉下的效果(annotation) ((BMKPinAnnotationView*)annotationView).animatesDrop = YES; } // 设置位置 annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height * 0.5)); annotationView.annotation = annotation; // 单击弹出泡泡,弹出泡泡前提annotation必须实现title属性 annotationView.canShowCallout = YES; // 设置是否可以拖拽 annotationView.draggable = NO; return annotationView; } -( void )viewWillAppear:(BOOL)animated { [_mapView viewWillAppear]; _mapView. delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放 } -( void )viewWillDisappear:(BOOL)animated { [_mapView viewWillDisappear]; _mapView. delegate = nil; // 不用时,置nil } @end |
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现