高德地图---显示/定位/POI搜索/大头针/气泡
来源:互联网 发布:淘宝一件代发女装货源 编辑:程序博客网 时间:2024/04/29 14:03
接触高德地图也有一段时间了。但是也有很长一段时间没用了,手生了。闲来无事就再写写地图。好在高德的文档做的很详实,使用起来得心应手。今天就写了一点关于显示/定位/POI搜索/大头针/气泡的简单代码。
难点就是搜索后大头针的问题。首先需要移除上一次搜索显示的大头针,再显示这一次需要显示大头针,不然屏幕显示的大头针会越来越多。这一点在官方的视频里面是有这些的。
首先上一张效果图:
这次使用的版本是V2.6.0的。这个官方也有文档和视频。高德开放平台 http://lbs.amap.com/api/ios-sdk/guide/nearby/。
之间看代码,代码里面的注释还是比较详细的。代码下载地址:高德地图Demo下载 https://github.com/zhuming3834/GaodeDemo。
ViewController.m
#import "ViewController.h"//地图显示需要的头文件#import <MAMapKit/MAMapKit.h>//poi搜素需要的头文件#import <AMapSearchKit/AMapSearchAPI.h>#import "DetailViewController.h"@interface ViewController ()<MAMapViewDelegate, AMapSearchDelegate,UISearchBarDelegate,UITableViewDelegate,UITableViewDataSource>@property (nonatomic,strong)MAMapView *mapView;@property (nonatomic,strong)AMapSearchAPI *search;@property (nonatomic,strong)MAUserLocation *location;@property (nonatomic,strong)AMapPlaceSearchRequest *request;@property (nonatomic,strong)UISearchBar *searchBar;@property (nonatomic,strong)UITableView *tableView;@property (nonatomic,strong)NSMutableArray *annotationArr;@property (nonatomic,strong)NSMutableArray *poisArray;@property (nonatomic,assign)NSInteger index;@end@implementation ViewController#pragma mark - 页面跳转时需要使用/* 需要页面跳转时使用- (void)viewWillAppear:(BOOL)animated{[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setPoiPoint:) name:@"test" object:nil];}- (void)setPoiPoint:(NSNotification *)notice{//先移除掉上次搜索的大头针[self.mapView removeAnnotations:self.annotationArr];//清空数组[self.annotationArr removeAllObjects];NSString *index = notice.object;AMapPOI *poi = self.poisArray[index.integerValue];MAPointAnnotation *annotation = [[MAPointAnnotation alloc] init];CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(poi.location.latitude, poi.location.longitude);annotation.coordinate = coordinate;annotation.title = poi.name;annotation.subtitle = poi.address;[self.annotationArr addObject:annotation];[self.mapView addAnnotation:annotation];}*/- (void)viewDidLoad {[super viewDidLoad];//增加一个KVO index[self addObserver:self forKeyPath:@"index" options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];self.annotationArr = [[NSMutableArray alloc] init];[self configApiKey];[self setMySearchConterl];[self setMainView];[self setTableView];//获取bundleIdentifier//NSLog(@"bundleIdentifier = %@",[[NSBundle mainBundle] bundleIdentifier]);// Do any additional setup after loading the view, typically from a nib.}#pragma mark - 地图显示和搜索部分/** * 配置APIKey */- (void)configApiKey{[MAMapServices sharedServices].apiKey = @"a12bc9db3e3f5ba30482aa704ee0fc29";}/** * 设置地图显示 有这个方法就可以显示用户的位置 */- (void)setMainView{self.mapView = [[MAMapView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 200)];self.mapView.delegate = self;//设置地图语言 默认是中文//self.mapView.language = MAMapLanguageEn;//地图类型 默认是2D栅格地图//self.mapView.mapType = MAMapTypeSatellite;//关闭指南针显示self.mapView.showsCompass = NO;//关闭比例尺显示self.mapView.showsScale = NO;//显示用户位置self.mapView.showsUserLocation = YES;//设置跟踪模式self.mapView.userTrackingMode = MAUserTrackingModeFollow;[self.view addSubview:self.mapView];}/** * 设置POI搜素请求 * * @param keyword 搜索需要的关键字 */- (void)setPoiSearchMapWithKeyword:(NSString *)keyword{//初始化检索对象self.search = [[AMapSearchAPI alloc] initWithSearchKey:[MAMapServices sharedServices].apiKey Delegate:self];//构建AMapPlaceSearchRequest对象self.request = [[AMapPlaceSearchRequest alloc] init];//搜索类型 关键字搜索self.request.searchType = AMapSearchType_PlaceKeyword;//设置搜索关键字self.request.keywords = keyword;//搜索地点 广州self.request.city = @[@"guangzhou"];//开扩展self.request.requireExtension = YES;//发起POI搜索[self.search AMapPlaceSearch:self.request];}/** * POI搜索请求后调用的方法 * * @param request 搜索请求 * @param response 请求结果 */- (void)onPlaceSearchDone:(AMapPlaceSearchRequest *)request response:(AMapPlaceSearchResponse *)response{if (response.count == 0) {return;}/* 仅仅显示搜索结果的大头针 //先移除掉上次搜索的大头针 不然上一次的大头针会一直存在[self.mapView removeAnnotations:self.annotationArr]; //清空数组[self.annotationArr removeAllObjects]; *///NSString *responseCount = [NSString stringWithFormat:@"%d",response.count];;//NSLog(@"responseCount = %@",responseCount);self.poisArray = [[NSMutableArray alloc] init];for (AMapPOI *poi in response.pois) {[self.poisArray addObject:poi];/* 仅仅显示搜索结果的大头针 MAPointAnnotation *annotation = [[MAPointAnnotation alloc] init]; CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(poi.location.latitude, poi.location.longitude); annotation.coordinate = coordinate; annotation.title = poi.name; annotation.subtitle = poi.address; [self.annotationArr addObject:annotation]; [self.mapView addAnnotation:annotation]; */}[self.tableView reloadData];/*需要页面跳转时使用 DetailViewController *dvc = [[DetailViewController alloc] init]; dvc.poisArray = self.poisArray; [self presentViewController:dvc animated:YES completion:nil]; */}/** * 设置大头针点击后的气泡 * * @param mapView mapView * @param annotation annotation * * @return 气泡 */- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation{//if ([annotation isKindOfClass:[MAAnnotationView class]]) {static NSString *identify = @"annotation";//在原有的大头针中添加自定义的修饰MAPinAnnotationView *pointAnnotation = (MAPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identify];if (pointAnnotation == nil) {//在原有的大头针中创建一个新的自定义的大头针pointAnnotation = [[MAPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identify];}//设置是否能选中的标题pointAnnotation.canShowCallout = YES;//是否允许拖拽pointAnnotation.draggable = YES;//是否允许退拽动画pointAnnotation.animatesDrop = YES;return pointAnnotation;}/** * 地图定位后就会调用这个方法 酒店 * * @param mapView 当前的mapView * @param userLocation userLocation * @param updatingLocation 位置更新标志 */- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation{//NSLog(@"地图");if (updatingLocation) {//NSLog(@"latitude = %f longitude = %f",userLocation.coordinate.latitude,userLocation.coordinate.longitude);//确定地图经纬度CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(userLocation.coordinate.latitude, userLocation.coordinate.longitude);//设置的当前位置 为地图中心self.mapView.centerCoordinate = coordinate;self.location = userLocation;}}#pragma mark - searchBar部分/** * 设置searchBar */- (void)setMySearchConterl{self.searchBar = [[UISearchBar alloc] init];self.searchBar.frame = CGRectMake(0, 20, self.view.frame.size.width, 44);self.searchBar.delegate = self;self.searchBar.placeholder = @"请输入关键字";[self.view addSubview:self.searchBar];}- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar{return YES;}/** * 设置左边的“取消”按钮 * * @param searchBar searchBar */- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{self.searchBar.showsCancelButton = YES;for (id cc in [searchBar.subviews[0] subviews]) {if ([cc isKindOfClass:[UIButton class]]) {UIButton * cancelButton = (UIButton *)cc;[cancelButton setTitle:@"取消" forState:UIControlStateNormal];}}}// called when text starts editing- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar{return YES;}// return NO to not resign first responder- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text NS_AVAILABLE_IOS(3_0){ return YES;}// called before text changes/** * 键盘搜索按钮按下就会调用这个方法 * * @param searchBar searchBar本身 */- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{//NSLog(@"text = %@",searchBar.text);//发起POI搜索请求[self setPoiSearchMapWithKeyword:searchBar.text];//收起键盘[searchBar resignFirstResponder];searchBar.text = @"";}// called when keyboard search button pressed/** * “取消”按钮按下会调用这个方法 * 收起键盘 * @param searchBar searchBar本身 */- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{[searchBar resignFirstResponder];self.searchBar.showsCancelButton = NO;}// called when cancel button pressed#pragma mark - tableView部分/** * 设置tableView */- (void)setTableView{self.tableView = [[UITableView alloc] init];self.tableView.frame = CGRectMake(0, 264, self.view.frame.size.width, self.view.frame.size.height - 264);self.tableView.delegate = self;self.tableView.dataSource = self;[self.view addSubview:self.tableView];}/** * 设置tableView的row个数 * * @param tableView tableView本身 * @param section 当前的section * * @return 当前section里面的row数 */- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return self.poisArray.count;}/** * 设置cell的显示 * * @param tableView tableView本身 * @param indexPath cell的位置 * * @return cell */- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *identify = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identify];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identify];}AMapPOI *poi = (AMapPOI *)self.poisArray[indexPath.row];cell.textLabel.text = poi.name;cell.detailTextLabel.text = poi.address;return cell;}/** * tableView点击时间 * * @param tableView tableView本身 * @param indexPath 被点击的cell的位置 */- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{self.index = indexPath.row;}/** * 实现KVO键值监听的方法 * 值改变后 增加大头针 * @param keyPath keyPath * @param object self * @param change 值字典 * @param context */- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{//先移除掉上次搜索的大头针[self.mapView removeAnnotations:self.annotationArr];//清空数组[self.annotationArr removeAllObjects];NSString *index = change[@"new"];AMapPOI *poi = self.poisArray[index.integerValue];MAPointAnnotation *annotation = [[MAPointAnnotation alloc] init];CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(poi.location.latitude, poi.location.longitude);//地图中心点 设置为选中的点self.mapView.centerCoordinate = coordinate;annotation.coordinate = coordinate;//一下两句 就是气泡的显示内容annotation.title = poi.name;annotation.subtitle = poi.address;[self.annotationArr addObject:annotation];[self.mapView addAnnotation:annotation];}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.}@endDetailViewController.m
#import "DetailViewController.h"#import <AMapSearchKit/AMapSearchAPI.h>@interface DetailViewController ()<UITableViewDataSource,UITableViewDelegate>@property (weak, nonatomic) IBOutlet UITableView *tableView;@end@implementation DetailViewController- (void)viewDidLoad { [super viewDidLoad];[self setMainView]; // Do any additional setup after loading the view from its nib.}- (void)setMainView{self.tableView.delegate = self;self.tableView.dataSource = self;}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return self.poisArray.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *identify = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identify];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identify];}AMapPOI *poi = (AMapPOI *)self.poisArray[indexPath.row];cell.textLabel.text = poi.name;cell.detailTextLabel.text = poi.address;return cell;}- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{[[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:[NSString stringWithFormat:@"%d",indexPath.row]];[self dismissViewControllerAnimated:YES completion:nil];}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}
1 0
- 高德地图---显示/定位/POI搜索/大头针/气泡
- 高德地图---显示/定位/POI搜索/大头针/气泡
- 高德地图IOS自动显示大头针标注的气泡
- 【iOS】Mapkit的使用:地图显示、定位、大头针、气泡等
- 高德地图的定位和大头针
- 【iOS】高德地图MAMapKit的使用:地图显示、添加大头针、导航、定位功能介绍
- 高德定位+poi搜索
- 高德地图定位+搜索自动提示+poi搜索+移动地图选址
- 高德地图输入提示,POI搜索并显示经纬度
- Android-高德地图-显示气泡框
- googlemap 高德地图mapabc 图吧 显示地图,标注一个或多个poi信息点,弹出气泡显示poi点的位置信息
- 手把手叫你如何集成高德地图,实现地图显示、定位蓝点、大头针显示、获取周围地点信息等
- Android高德地图 实现定位 周边热点 POI搜索 BottomSheetBehavior 动态获取权限demo
- Android实现高德地图POI搜索
- 高德地图poi全国搜索
- Android高德地图的使用,狠详细!手把手!(地图+定位+逆地理编码+输入提示+Poi搜索)
- Android高德地图点击大头针更换大头针图片
- 高德地图引用,搜索定位
- git 退回到倒数第二次提交
- javascript获取查询参数
- VC-Socket send函数和recv函数详解
- 设计模式 -- 责任链模式
- PHP中数字千分位逗号分隔函数number_format()
- 高德地图---显示/定位/POI搜索/大头针/气泡
- 紧迫感
- The user specified as a definer (''@'') does not exist
- 使用VS2013调试Unity
- 应用层 加载驱动 和 卸载驱动代码
- eclipse svn操作
- C++中重载、重写(覆盖)和隐藏的区别
- 如何计算时间复杂度
- 关于时间