iOS关于高德地图定位和热点搜索使用小结
最近项目刚刚忙完,有空整理一下用到的相关技术点。地图是比较常见的功能模块,现在用的比较多的是地图当前位置显示,公交、骑行、步行路线信息,附近热点位置搜索。现在国内用的比较多的是高德、百度,国外的话可以用谷歌、腾讯。路线信息的内容之前博文里面有所提及,本文以高德地图为例,主要介绍一下其他两点。
1、pod导入相应的地图库,添加引用和协议
#import <MAMapKit/MAMapKit.h>
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
#import <AMapSearchKit/AMapSearchKit.h>
<MAMapViewDelegate,AMapLocationManagerDelegate,AMapSearchDelegate>
2、定义地图、地图管理变量,热点搜索,经纬度信息变量
/**
高德地图
*/
@property (nonatomic,strong) MAMapView *mapView;
/**
定位管理
*/
@property (nonatomic,strong) AMapLocationManager *locService;
/**
用户当前位置
*/
@property (nonatomic,strong) MAPointAnnotation *curAnnotation;
/**
周边检索
*/
@property (nonatomic,strong) AMapSearchAPI *poiSearch;
/**
周边检索条件
*/
@property (nonatomic,strong) AMapPOIAroundSearchRequest *placeAround;
3、实例化相关变量,并开启定位
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.mapView.delegate = self;
self.locService.delegate = self;
self.poiSearch.delegate = self;
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.mapView removeAnnotation:self.curAnnotation];
self.curAnnotation = nil;
self.mapView.delegate = nil;
self.locService.delegate = nil;
self.poiSearch.delegate = nil;
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// self.locService.delegate = self;
[self.locService startUpdatingLocation];
}
#pragma mark - 懒加载
-(MAMapView *)mapView{
if (!_mapView) {
_mapView = [[MAMapView alloc]initWithFrame:self.mapBackView.bounds];
[_mapView setMapType:MAMapTypeStandard];
_mapView.showsCompass = NO;
[_mapView setZoomLevel:16];
}
return _mapView;
}
-(AMapLocationManager *)locService{
if (!_locService) {
_locService = [[AMapLocationManager alloc] init];
//设置不允许系统暂停定位
[_locService setPausesLocationUpdatesAutomatically:NO];
//设置允许在后台定位
[_locService setAllowsBackgroundLocationUpdates:YES];
//设置允许连续定位逆地理
[_locService setLocatingWithReGeocode:YES];
}
return _locService;
}
-(AMapSearchAPI *)poiSearch{
if (!_poiSearch) {
_poiSearch = [[AMapSearchAPI alloc]init];
}
return _poiSearch;
}
-(AMapPOIAroundSearchRequest *)placeAround{
if (!_placeAround) {
_placeAround = [[AMapPOIAroundSearchRequest alloc]init];
_placeAround.radius = 1500;
_placeAround.offset = 10;
_placeAround.keywords = @"";
_placeAround.sortrule = 0;
_placeAround.requireExtension = YES;
_placeAround.types = @"220000|070700|120000|110000|160000|060000|170000|130000|150900|080304|141200";
//,事物,会议,大厦,公寓,广场,银行,商场,学校,停车场,酒吧
}
return _placeAround;
}
-(void)viewDidLoad {
[super viewDidLoad];
[AMapServices sharedServices].enableHTTPS = YES;
[self createSubviews];
}
4、地图位置解析,设置地图上的当前经纬度信息,然后关闭定位,搜索周边热点位置
-(void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode{
if (location) {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
WS(weakSelf)
[geocoder reverseGeocodeLocation:[[CLLocation alloc] initWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude] completionHandler:^(NSArray *placemarks, NSError *error){
if (error) {
weakSelf.errorLabel.hidden = NO;
[CCErrorView showErrorWithText:K_CC_LOCAL_STR(@"location.error")];
}else{
if (placemarks.count>0) {
if (weakSelf.curAnnotation) {
[weakSelf.mapView removeAnnotation:weakSelf.curAnnotation];
weakSelf.curAnnotation = nil;
}
weakSelf.errorLabel.hidden = YES;
weakSelf.curAnnotation = [[MAPointAnnotation alloc]init];
weakSelf.curAnnotation.coordinate = location.coordinate;
CLPlacemark *placemark = [placemarks objectAtIndex:0];
NSDictionary *addressDic = placemark.addressDictionary;
NSString *address = [[addressDic objectForKey:@"FormattedAddressLines"] firstObject];
if (K_CC_EMPTY_STR(address)) {
address = @"";
}
if (!K_CC_EMPTY_STR(addressDic[@"Country"])) {
address = [address stringByReplacingOccurrencesOfString:[addressDic objectForKey:@"Country"] withString:@""];
}
weakSelf.curAnnotation.title = address;
weakSelf.curStreet = [addressDic objectForKey:@"Name"];
weakSelf.curProvince = [addressDic objectForKey:@"State"];
weakSelf.curCity = [addressDic objectForKey:@"City"];
weakSelf.curArea = [addressDic objectForKey:@"SubLocality"];
[weakSelf.datalist removeAllObjects];
CCSignInModel *model = [[CCSignInModel alloc]init];
model.name = [addressDic objectForKey:@"Name"];
model.address = address;
model.location =location.coordinate;
model.curCity = [addressDic objectForKey:@"City"];
model.curArea = [addressDic objectForKey:@"SubLocality"];
model.curStreet = [addressDic objectForKey:@"Name"];
[weakSelf.datalist addObject:model];
weakSelf.curModel = model;
[weakSelf.listTableView reloadData];
}else{
weakSelf.errorLabel.hidden = NO;
[CCErrorView showErrorWithText:K_CC_LOCAL_STR(@"location.error")];
}
[weakSelf.mapView setCenterCoordinate:location.coordinate animated:NO];
[weakSelf.mapView addAnnotation:weakSelf.curAnnotation];
[weakSelf.mapView selectAnnotation:weakSelf.curAnnotation animated:YES];
[weakSelf.locService stopUpdatingLocation];
AMapGeoPoint *centerPoint = [AMapGeoPoint locationWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude];
[weakSelf.placeAround setLocation:centerPoint];
[weakSelf.poiSearch AMapPOIAroundSearch:weakSelf.placeAround];
}
}];
}else{
self.errorLabel.hidden = NO;
}
}
#pragma mark - AMapSearchDelegate
-(void)AMapSearchRequest:(id)request didFailWithError:(NSError *)error
{
NSLog(@"Error: %@ ", error);
if (self.datalist.count>0 && self.placeAround.page!=1) {
[self.listTableView.mj_footer endRefreshingWithNoMoreData];
}
[self.listTableView reloadData];
}
-(void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response
{
[self.listTableView.mj_footer endRefreshing];
if (response.pois.count>0) {
for (AMapCloudPOI *info in response.pois) {
CCSignInModel *model = [[CCSignInModel alloc]init];
model.name = info.name;
model.address = info.address;
model.curCity = self.curCity;
model.curArea = self.curArea;
model.curStreet = self.curStreet;
model.location = CLLocationCoordinate2DMake(info.location.latitude,info.location.longitude);
[self.datalist addObject:model];
}
if (response.pois.count == 10 && self.placeAround.page == 1) {
@K_CC_WEAK(self)
self.listTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
@K_CC_STRONG(self)
self.placeAround.page++;
[self.poiSearch AMapPOIAroundSearch:self.placeAround];
}];
}else if(response.pois.count < 10 && self.placeAround.page != 1){
[self.listTableView.mj_footer endRefreshingWithNoMoreData];
}
}else{
if (self.placeAround.page == 1 && self.datalist.count == 0) {
[CCNoDataView nodataViewShowWithTableView:self.listTableView isShow:YES];
}
}
[self.listTableView reloadData];
}
iOS关于高德地图定位和热点搜索使用小结的更多相关文章
- 高德地图定位不到 报错 location Error, ErrCode:7, errInfo:KEY错误 请到http://lbs.amap.com/api/android-location-sdk/abouterrorcode/查看错误码说明.
出现该问题的可能是高德地图的配置不准确: 仔细配对一下 看sha1 是否是通过应用签名生成的 要区分发布版的sha1 跟调试版的sha1 是不相同的 (小编我第一次反这种错误的时候 是因为我把高得 ...
- ios开发--高德地图SDK使用简介
高德LBS开放平台将高德最专业的定位.地图.搜索.导航等能力,以API.SDK等形式向广大开发者免费开放.本章节我们来简单学习一下如何使用它的定位及地图SDK. 一.相关框架及环境配置 地图SDK 对 ...
- iOS导入高德地图出现缺失armv7--"Undefined symbols for architecture armv7"
在已有项目中使用pod导入高德地图,报了以下错误: ld: warning: directory not found for option '-L/Users/paul/iOS/yun-hui-yi/ ...
- android开发对应高德地图定位服务进度一
进行android的高德地图开发首先需要进入高德地图的控制台进行注册登录.之后创建新的应用并且绑定软件得到相应的key. 这里面需要找到自己软件对应的多个SHA1.这里有发布版和调试版,以及对应的软件 ...
- iOS的高德地图标注特定位置
在开发时有时候遇到项目里面需要展示公司的位置,这时如果导入百度地图什么的就太浪费资源,而且还占内存 这时只要调用自动高德地图的就行了 自己写一个控制器,导入框架 现在导入系统框架只要多打次就能出来了, ...
- iOS 利用高德地图WMS服务
Demo: https://github.com/xushiyou23/AMapTesting 转: 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net ...
- iOS 去除高德地图下方的 logo 图标
[self.mapView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, ...
- 160913、ionic + 高德地图定位
实例一: var AMapArea=document.getElementById('amap'); AMapArea.parentNode.style.height="100%" ...
- ios调用百度地图定位遇到的奇葩问题
app项目过程中需要用到百度地图,然后网上可以查资料看官网文档,最后弄了好几天还是不行,找了各位前辈帮忙虽然解决了,但是把代码拷贝到我的项目时又无法定位了,最后查看了下原因是info配置出了问题,不是 ...
- iOS进阶_地图定位
一.定位步骤 1.Xcode自带地图,直接先引入头文件 #import <CoreLocation/CoreLocation.h> 2.CLLocation框架中的CLLocationMa ...
随机推荐
- Jmeter函数助手6-time
time函数用于获取不同格式的当前时间(年月日时分秒). Format string for SimpleDateFormat (optional):时间格式,填入如yyyyMMdd-HHmmss.d ...
- 数值优化算法-BFGS
参考: https://www.cnblogs.com/Leo_wl/p/3367323.html 牛顿法: 使用牛顿法优化函数 f(θ) 最小值时,每次计算获得新的\(θ\)值,即\(θ_{k+1} ...
- "观察者" 网站上不错的对社会问题进行思考的文章--------------- 分享
原文地址: https://www.guancha.cn/weichengling 在网上无意中到了下面的文章,对社会热点问题有较为全面的思考,感觉不错,分享一下. ------------ ...
- jax中对单步操作的缓存对性能造成的影响
代码: import jax.numpy as jnp from jax import grad, jit, vmap from jax import random def selu(x, alpha ...
- 外网的一个还不错的高性能计算教程: High Performance Computing
地址: https://info.gwdg.de/wiki/doku.php?id=wiki:hpc:start =========================================== ...
- 为啥华为Atlas的AI卡在二手市场上特别多
首先阐述一下事实,那就是华为Atlas的AI卡在二手市场上特别多,基本上在某鱼上一搜索就是满屏,尤其是关键词:华为Atlas300,但是作为同等level的NVIDIA公司的A100却较之相比少的多, ...
- 系统IO常用函数接口
本文整理归纳了几种常用的系统IO的函数借口,以供读者查阅使用 目录 系统IO与标准IO的区别 打开文件:open 关闭文件:close 文件读取:read 文件写入:write 位置偏移:lseek ...
- Maven经验分享(六)Jboss热部署
jboss7的部署方式比较多的,如果使用maven构建和管理项目,那当然是使用jboss-as-maven-plugin插件来部署项目是最方便的了. pom.xml配置如下: <plugin&g ...
- 2022年第一天,体验了一把wan(皖)式服务
在新的一年到来之际, 一口君首先祝各位粉丝朋友新年快乐! 心想事成! 事业顺利! 阖家欢乐! 财源广进! 2022年的第一天,一口君带着家人去了躺马鞍山,享受了一下马鞍山的洗浴. 马鞍山桑拿虽然比不上 ...
- 11. 基于ARM Cortex-A9中断详解
一.中断概念 操作系统中,中断是很重要的组成部分.出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行. 有了中断系统才可以不用一直 ...