iOS_百度地图 步骤:
1.申请百度地图key. http://lbsyun.baidu.com/apiconsole/key
2.下载百度开发包. http://api.map.baidu.com/lbsapi/cloud/sdkiosdev-download.htm
3.新建项目.这部分设计添加lib以及资源文件,参考百度的IOS api开发指南做就行,那些内容已经在2013年10月份更新过了,照着里面做就能顺利通过编译。
4.将ViewController的.m改成.mm
5.在委托中.h文件中中加入
#import "BMapKit.h"
并声明变量
BMKMapManager* _mapManager;
.m委托中加入
_mapManager = [[BMKMapManager alloc]init];
如果要关注网络及授权验证事件,请设定 generalDelegate参数
BOOL ret = [_mapManager start:@"3102732B30E0D66EF51415C9E6CE055EC78FF07E" generalDelegate:nil];
if
NSLog(@"manager start failed!");
}
6.注意:
在这里就开始运行程序的话,会出现[UIDevice uniqueGlobalDeviceIdentifier]: unrecognized selector sent to instance0x1ed19370
这么一个bug,解决办法很多,之一:加入4个文件NSString+MD5Addition,UIDevice+IdentifierAddition,直接加入到项目里面就可以,无需引入头文件
下载地址 http://www.kuaipan.cn/file/id_30491149655344975.htm
7.在viewController.mm中的viewDidLoad改为如下代码
- (void)viewDidLoad
{
[superviewDidLoad];
0,0, 320, 548)];
self.view = mapView;
// Do any additional setup after loading the view, typically from a nib.
}
API应用就完成了
源代码下载http://www.kuaipan.cn/file/id_30491149655344976.htm
扩展:
1.功能五,搜索,用的很广泛,这个功能很强大,你可以搜索某一坐标点附近的加油站,停车场,宾馆,酒店,餐厅,甚至厕所都能搜索到,比如说你想查找5000米内的加油站,以及1000米内的停车场。
flag = [_search poiSearchNearBy:@"加油站" center:coor1 radius:5000 pageIndex:0];
flag = [_search poiSearchNearBy:@"停车场" center:coor1 radius:1000 pageIndex:0];
然后用委托
-(void)onGetPoiResult:(NSArray*)poiResultList searchType:(int)type errorCode:(int)error
输出结果。
2.将百度地图视角切换到某一坐标点
-(void)Region{
CLLocationCoordinate2D coor;
self._latitude;
self._longitude;
NSDictionary
CLLocationCoordinate2D coor1= BMKCoorDictionaryDecode(tip);
0.05,0.05));
BMKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];
YES];
}
3.清除地图上所有痕迹和路线
-(void)clereOldYJDH{
NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
[_mapView removeAnnotations:array];
array = [NSArray arrayWithArray:_mapView.overlays];
[_mapView removeOverlays:array];
self
}
当选中一个annotation views时,调用此接口
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view
{
@"选中一个annotation views:%f,%f",view.annotation.coordinate.latitude,view.annotation.coordinate.longitude);
}
当取消选中一个annotation views时,调用此接口
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view{
NSLog(@"取消选中一个annotation views");
}
当mapView新添加annotation views时,调用此接口
- (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray
{
NSLog(@"mapView新添加annotation views");
}
当点击annotation view弹出的泡泡时,调用此接口
- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view
{
NSLog(@"点击annotation view弹出的泡泡");
}
拖动annotation view时view的状态变化
-(void)mapView:(BMKMapView*)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newStatefromOldState:(BMKAnnotationViewDragState)oldState
{
NSLog(@"动annotation view时view的状态变化");
}
//标注呈绿色样式大头钉
((BMKPinAnnotationView *)annotationView).pinColor = BMKPinAnnotationColorGreen;
//允许用户拖动
[annotationView setDraggable:YES];
//气泡框左侧显示的View,可自定义
annotationView.leftCalloutAccessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_location.png"]];
//气泡框右侧显示的View可自定义
annotationView.rightCalloutAccessoryView =selectButton;
//让标注在进入界面时就处于弹出气泡框的状态
[annotationView setSelected:YES animated:YES];
//整个标注的偏移量
annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height *0.5));
annotationView.annotation = annotation;//绑定对应的标点经纬度
annotationView.canShowCallout =TRUE;//允许点击弹出气泡框
4.在地图上定制标注替代大头钉,可以将文字图片所有能加到view中的,都可以以大头钉的形式显示出来,需要将view转换为image主要代码,最重要的是知道这个原理,然后实现起来就很简单:
- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id
在这个委托中实现如下代码
UIView *viewForImage=[[UIView alloc]initWithFrame:CGRectMake(0,0, 132, 64)];
UIImageView *imageview=[[UIImageViewalloc]initWithFrame:CGRectMake(0,0, 32,64)];
[imageview setImage:[UIImage imageNamed:@"车位置.png"]];
[viewForImage addSubview:imageview];
UILabel *label=[[UILabelalloc]initWithFrame:CGRectMake(32,0, 100,64)];
label.text=@"陈双超";
label.backgroundColor=[UIColor clearColor];
[viewForImage addSubview:label];
annotationView.image=[self
-(UIImage *)getImageFromView:(UIView
UIGraphicsBeginImageContext(view.bounds.size);
[view.layerrenderInContext:UIGraphicsGetCurrentContext()];
UIImage *image =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return
}
view来定制气泡和专门建立文件来定制大头钉,觉得那方法对代码管理起来更简单,可读性强。
http://www.kuaipan.cn/file/id_30491149655345085.htm
@interface KYBubbleView : UIScrollView { //UIView是气泡view的本质
NSDictionary *_infoDict;
//标题label
//副标题label
//联系人
//家庭地址
UIButton *rightButton;
NSUInteger index;
}
#import "BMKPointAnnotation.h"
@interface
NSUInteger _tag;
}
@property
@end
扩展:当前为iOS提供的SKD版本为1.2.1,这里主要讲一下这个版本存在的一些问题,以及开发注意事项。
1. BMKMapView是百度地图类,当创建多个BMKMapView对象时,这些对象会共享一些数据(没有仔细研究具体共享哪些数据),因此会产生以下问题:
A. 当对其中一个BMKMapView通过手势来进行放大、缩小、移动等操作时,其他的BMKMapView对象会自动进行放大、缩小、移动。
B. 启动应用程序时,首先显示出来的BMKMapView可以得到用户的当前位置,其他的BMKMapView可能要等一段时间或者完全无法得到用户当前的位置。
2. 为了解决1.B中的问题,可以只使用一个BMKMapView对象,比如在两个不同的UIView中共享同一个BMKMapView对象。此外,有一个方法可以基本上解决1.A的问题。假设UIView A和UIView B均有BMKMapView(可以为不同或同一个对象),在UIView A和UIVIew B之间进行切换时,记录下各自当前BMKMapView的Frame,然后在显示的时候再通过设置Frame来恢复到切换前的状态。这个方法的缺点是,在切换很快的时候,ViewDidAppear不一定会被调用,ViewWillDisapper的调用顺序不确定,不过可以满足普通操作的要求。
3. BMKSearch提供了搜索、地址解析等功能。百度通过回调来响应搜索结果,关键的问题是,有时回调并不会被调用(个人感觉是BMKSearch之后,百度的SDK无法正确找到回调函数,比如处于不同的线程等等)。为了能让百度SDK正确找到回调,建议如下:
A. 在没有得到回调之前,不要释放BMKSearch对象,最好做成全局对象。(必须)
B. 在搜索路线时,如果起始位置是通过经纬度来表示的,那么节点信息中除了设置经纬度pt信息外,一定要设置name信息(不能为空字符串)。(必须)
C. 不能同时进行多个搜索。(必须)
D. 在每次通过BMKSearch对象进行搜索之前,最好是将其delegate设置为nil,然后进行release,然后再alloc,然后再进行搜索。(强烈建议)
E. 所有的搜索的操作均不要通过委托或其他线程的回调等等来发起,应该是由本对象主动发起,并且本对象作为搜索代理,这样百度SDK才能正确找到回调函数。(强烈建议)
4. 有时需要判断当前用户经纬度是否是在国内,可以通过BMKSearch的地址反解析之后的回调来判断,如果返回的错误码为BMKErrorResultNotFound,那么有可能不在国内,因为其他的原因也可能导致返回此错误码。
5. 其实,最好的解决方法是采用AutoNavi高德地图api,如果是iOS6,那么直接可以直接使用MKMapView,其采用的就是AutoNavi接口。目前AutoNavi接口不足之处是没有步行路线,据说还在开发中,相信以后会支持的。