将最近用的百度地图记录下来(由于不是demo,阅读可能较为困难)
demo,配置问题及文档在百度开放云平台可以查看
主要用了一下几个功能 Ps:以下功能需要真机,效果图暂缺T T,有wifi补上
1.定位功能
2.搜索附近的位置(需要关键字)
3.计算我的位置及大头针位置距离
4.导航我的位置到大头针位置
注意:百度地图由于消耗相对较大添加代理位置官方demo推荐如下做法,不要释放错误和重复释放。
-(void)viewWillAppear:(BOOL)animated {
[_mapView viewWillAppear];
_mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
_locSearch.delegate = self;
_locService.delegate = self;
}
-(void)viewWillDisappear:(BOOL)animated {
[super viewDidDisappear:YES];
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用时,置nil
_locSearch.delegate = nil;
_locService.delegate = nil;
}
- (void)dealloc {
if (_locSearch != nil) {
_locSearch = nil;
}
if (_mapView) {
_mapView = nil;
}
if (_locService) {
_locService = nil;
}
}
代码:
1)定位后tableView展示附近的位置以及计算距离
//地图定位
-(void)locationSet
{
_mapView = [[BMKMapView alloc]init];
_mapView.zoomLevel = 17;
//初始化BMKLocationService
_locService = [[BMKLocationService alloc]init];
//设置定位精确度,默认:kCLLocationAccuracyBest
[BMKLocationService setLocationDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
//指定最小距离更新(米),默认:kCLDistanceFilterNone
[BMKLocationService setLocationDistanceFilter:100.f];
_locService.delegate=self;
//启动LocationService
[_locService startUserLocationService];
}
//处理方向变更信息
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
_mapView.showsUserLocation = YES;//显示定位图层
[_mapView updateLocationData:userLocation];
NSLog(@"heading is %@",userLocation.heading);
}
//处理位置坐标更新
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
_mapView.showsUserLocation = YES;//显示定位图层
[_mapView updateLocationData:userLocation];
//NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
nearbySearch = [[BMKNearbySearchOption alloc]init];
nearbySearch.pageCapacity = 10;
nearbySearch.keyword = bankName;
nearbySearch.location = userLocation.location.coordinate;
nearbySearch.radius = 2000;
BOOL flag = [_locSearch poiSearchNearBy:nearbySearch];
if(flag)
{
NSLog(@"城市内附近检索发送成功");
}
else
{
NSLog(@"城市内检索发送失败");
}
coor1 = userLocation.location.coordinate;
}
#pragma mark baidu mapDelegate
- (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode
{
// 清楚屏幕中所有的annotation
NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
[_mapView removeAnnotations:array];
if (errorCode == BMK_SEARCH_NO_ERROR) {
for (int i = 0; i < poiResult.poiInfoList.count; i++) {
_mapInfo = [poiResult.poiInfoList objectAtIndex:i];
BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
item.coordinate = _mapInfo.pt;
item.title = _mapInfo.name;
[_mapView addAnnotation:item];
if(i == 0)
{
//将第一个点的坐标移到屏幕中央
_mapView.centerCoordinate = _mapInfo.pt;
}
_dataDic = [[NSMutableDictionary alloc]init];
BMKMapPoint mp1 = BMKMapPointForCoordinate(nearbySearch.location);
BMKMapPoint mp2 = BMKMapPointForCoordinate(_mapInfo.pt);
CLLocationDistance dis = BMKMetersBetweenMapPoints(mp1, mp2);
NSString *distance = [NSString stringWithFormat:@"%d",(int)dis];
[_dataDic setObject:distance forKey:@"distance"];
[_dataDic setObject:_mapInfo.name forKey:@"name"];
[_dataDic setObject:_mapInfo.address forKey:@"address"];
[_dataDic setObject:_mapInfo forKey:@"pt"];
//[_dataDic setObject:_mapInfo.phone forKey:@"phone"];
//[_dataDic setValue:_mapInfo.phone forUndefinedKey:@"phone"];
[_dataArr addObject:_dataDic];
}
dataArray = _dataArr;
} else if (errorCode == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){
NSLog(@"起始点有歧义");
} else {
// 各种情况的判断。。。
}
}
2)添加显示位置大头针、添加我的位置及调用网页或者客户端进行导航
//我的位置定位大头针
- (void)addPointAnnotation{
if (pointAnnotation == nil) {
pointAnnotation = [[BMKPointAnnotation alloc]init];
pointAnnotation.coordinate = _coor;
_mapView.centerCoordinate = _coor;
pointAnnotation.title = @"我的位置";
}
[_mapView addAnnotation:pointAnnotation];
}
//银行位置定位大头针
- (void)addBankAnnotation{
if (bankAnnotation == nil) {
bankAnnotation = [[BMKPointAnnotation alloc]init];
bankAnnotation.coordinate = _info.pt;
bankAnnotation.title = _info.name;
}
[_mapView addAnnotation:bankAnnotation];
}
//改变大头针样式
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation{
//我的位置annotation
if (annotation == pointAnnotation) {
NSString *AnnotationViewID = @"renameMark";
BMKPinAnnotationView *annotationView = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
if (annotationView == nil) {
annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];
// 设置颜色
annotationView.image = [UIImage imageNamed:@"Select_map_location"];
// 从天上掉下效果
annotationView.animatesDrop = YES;
// 设置可拖拽
annotationView.draggable = YES;
}
return annotationView;
}
//银行位置annotation
NSString *AnnotationViewID = @"renameMark";
BMKPinAnnotationView *annotationView = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
if (annotationView == nil) {
annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];
// 设置颜色
annotationView.image = [UIImage imageNamed:@"Select_map_Nav"];
// 从天上掉下效果
annotationView.animatesDrop = YES;
// 设置可拖拽
annotationView.draggable = YES;
}
return annotationView;
}
//点击导航按钮进入导航页面
- (IBAction)navButtonClick:(UIButton *)sender {
UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"网页百度地图",@"百度地图客户端",nil];
[sheet showInView:self.view];
}
//选择百度地图网页或者百度地图客户端
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0) {
//初始化调启导航时的参数管理类
BMKNaviPara* para = [[BMKNaviPara alloc]init];
//指定导航类型
para.naviType = BMK_NAVI_TYPE_WEB;
//初始化起点节点
BMKPlanNode* start = [[BMKPlanNode alloc]init];
//指定起点经纬度
start.pt = _coor;
//指定起点名称
start.name = @"我的位置";
//指定起点
para.startPoint = start;
//初始化终点节点
BMKPlanNode* end = [[BMKPlanNode alloc]init];
end.pt = _info.pt;
para.endPoint = end;
//指定终点名称
end.name = _info.name;
//指定调启导航的app名称
para.appName = [NSString stringWithFormat:@"%@", @"testAppName"];
//调启web导航
[BMKNavigation openBaiduMapNavigation:para];
}else if(buttonIndex == 1){
//初始化调启导航时的参数管理类
BMKNaviPara* para = [[BMKNaviPara alloc]init];
//指定导航类型
para.naviType = BMK_NAVI_TYPE_NATIVE;
//初始化终点节点
BMKPlanNode* end = [[BMKPlanNode alloc]init];
//指定终点经纬度
end.pt = _info.pt;
//指定终点名称
end.name = _info.name;
//指定终点
para.endPoint = end;
//指定返回自定义scheme
para.appScheme = @"baidumapsdk://mapsdk.baidu.com";
//调启百度地图客户端导航
[BMKNavigation openBaiduMapNavigation:para];
}else{
NSLog(@"test");
}
}