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(, , self.view.frame.size.width, )];
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 == ) {
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(, , self.view.frame.size.width, );
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[] 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(, , self.view.frame.size.width, self.view.frame.size.height - );
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:(voidvoid *)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.
} @end

DetailViewController.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.
}

原文链接:高德地图---显示/定位/POI搜索/大头针/气泡

AMAP的更多相关文章

  1. 识别网络应用所使用的协议Amap

    识别网络应用所使用的协议Amap   Amap是Kali Linux自带的一款信息收集工具.工作时,它首先向服务器的端口发送内置的触发包(tirgger),然后获取响应.通过分析响应包数据,来识别该端 ...

  2. 时时获得高德地图坐标 http://lbs.amap.com/console/show/picker

    1.高德地图标注 在做开发时,或者做高德地图标注的时候,要用到高德地图的坐标,时时获得高德地图坐标 http://lbs.amap.com/console/show/picker 老的高德地图标注地址 ...

  3. AMap地图加载完成事件

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  4. AMap编辑折线、多边形、圆

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  5. AMap公交线路查询

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  6. AMap行政区查询服务

    AMap.DistrictSearch行政区查询服务插件,提供全国各省.市.县.区的中心点经纬度.行政区边界坐标组.下级行政区等信息.根据行政区边界坐标组可在地图上绘制行政区边界.(本文为原创,并在项 ...

  7. Android 高德地图No implementation found for long com.autonavi.amap.mapcore.MapCore

    此篇博客最后更新时间写自2016.5.18.当下高德地图jar版本为3.3.1. 使用高德地图碰到此问题,纠结许久(接近4个多小时). 记录在此,希望遇到相同问题的读者可以有所借鉴. 错误截图: 导致 ...

  8. vue的地图插件amap

    https://www.jianshu.com/p/0011996b81e2(amap) npm install vue-amap --save

  9. 获取经纬度之间两点间真实距离(适用于GoogleMap,BaiduMap,Amap等)

    如何获取经纬度之间两点间真实距离(适用于GoogleMap,BaiduMap,Amap等)  目标:使用百度定位sdk开发实时移动距离计算功能,根据经纬度的定位,计算行驶公里数并实时刷新界面显示.大家 ...

  10. Android编程 高德地图 中如何重写 定位按键 的触发事件 (com.amap.api.maps2d.LocationSource)点击定位后不仅定位在地图中心点上而且可以设置地图的缩放大小和提示

    在利用高德地图来编写自己的APP的时候,发现了一种对定位按键的重写方法,那就是利用   com.amap.api.maps2d.LocationSource  接口来重写. 什么是定位按键呢,下图中右 ...

随机推荐

  1. Microsoft Dynamics CRM 前瑞开发

    做CRM开发最大的感受就是其前瑞开发过程中,调试起来比较麻烦,需要做一些断点还要配制一些浏览器设置,对新手来说比较困难.还有就是对REST调试,经常为了调试一个正确的结果而花费大量的时间.现在推荐一个 ...

  2. 修改list中附件排序(sharepoint 2010)

    修改文件C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\CONTROLTEMPLATE ...

  3. How To Write In Sharepoint Log File 怎么对自定义的MOSS代码写日志

    How To Write In Sharepoint Log File 怎么对自定义的MOSS代码写日志 Add Microsoft.Office.Server dll in your project ...

  4. 桥牌笔记 Skill Level 4 C7 小心将吃

    南主打5H. 看来问题不大,但要小心南的方块AK会阻塞桥路. 如果方块3-2分布,并且将牌也3-2分布,就很容易. 如果红桃4-1分布,那是死定了. 如果方块4-1分布,还有希望完成的! 为了防止东家 ...

  5. android 浏览器开发实例

    android app需要通过手机显示网页信息还是比较常用的,比如我最近业余开发的 抢商铺游戏,需要对游戏规则做说明,规则会比较多,而且要经常变动,就想到用网页来展示,更新起来方便,不像应用,一旦发布 ...

  6. 转发离线安装 Android Studio 更新

    1.在线更新 随着 Android Studio 的越来越完善与流行,无论从功能性,还是性能上,它正在成为广大 Android 开发者的首选.但是因为总所周知墙的原因,我们在 Android Stud ...

  7. IOS编程思想

    从今天起想走进IOS架构的大门,一直不屑于学习第三方框架,觉得框架也是一点点代码给垒起来的,只要掌握了代码就可以了,殊不知垒代码的过程才是最重要的,而这个过程又岂是一朝一夕就能达到完美境界的,达到完美 ...

  8. 【读书笔记】iOS-GCD-网络编程要不要使用GCD

    一,网络编程强烈推荐使用异步API. 二,对于网络编程可以断言“线程是魔鬼”.如果在网络编程中使用线程,就很可能会产生大量使用线程的倾向,会引发很多问题.例如每个连接都使用线程,很快就会用尽线程栈内存 ...

  9. UnityShader之Shader分类篇【Shader资料2】

    关于ShaderLab,从我个人的理解上来看应该是分为三种类型. 1.Fixed function shader 固定渲染管线Shader,基于用于高级Shader在老显卡无法显示时的Fallback ...

  10. 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式

    COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...