百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索、路径规划、地图标注、离线地图、定位、周边雷达等丰富的LBS能力 。
您可以使用百度地图iOS SDK开发适用于移动设备的地图应用,通过接口,您可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。
使用百度地图的时候,首先要做好准备工作,到百度地图开发平台下载要使用的SDK,使用百度地图的API时,最好去官方技术论坛下载两个pdf文件:IOS开发教程-第一部分和第二部分的pdf文件,然后获取密钥,如下图所示,官方文档: http://developer.baidu.com/map/sdkiosdev-2.htm
接下来按照步骤使用百度地图:
(1)引入BaiduMapAPI.framework
(2)引入所需的系统库
在Xcode工程中引入CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework。添加方式:在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加这几个framework即可。
(3)环境配置
在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。
(4)引入mapapi.bundle资源文件
如果使用了基础地图功能,需要添加该资源,否则地图不能正常显示
mapapi.bundle中存储了定位、默认大头针标注View及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件。如果您不需要使用内置的图片显示功能,则可以删除bundle文件中的image文件夹。您也可以根据具体需求任意替换或删除该bundle中image文件夹的图片文件。
方法:选中工程名,在右键菜单中选择Add Files to “工程名”…,从BaiduMapAPI.framework||Resources文件中选择mapapi.bundle文件,并勾选“Copy items if needed”复选框,单击“Add”按钮,将资源文件添加到工程中。
(5)引入头文件
在使用SDK的类引入头文件:
#import//引入所有的头文件
#import//只引入所需的单个头文件
上面都是引用百度地图文档上的内容,这里要注意第四条,.framework中居然有这些,但还是需要单独add到项目里。
注意:还需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述
列几个遇到的问题:
(1)百度读取CLLocationCoordinate2D的问题,最新版本(V2.5)CLLocationCoordinate2DMake的两个参数与之前函数的相反,这个困扰了我很久,以前版本跟现在版本的程序,用同一个经纬度,旧版的可以显示标注,新版的却不可以。
例如:旧版是这样子
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(118.144992,24.497386)];
新版要这样才行
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(24.497386,118.144992)];
不知道为什么百度要这样做
(2)BMKMapViewDelegate 的方法
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view
这个在点击同一个标注以后只会执行一次,要点击其他的标注再来点击才会执行
后来发现可以在每次执行的时候调用一下这个
[mapView deselectAnnotation:view.annotation animated:YES];
这样同一个标注可以一致执行了,别问我为什么需要这个功能,因为我把标注的气泡隐藏了,只能通过点击标注来实现了。
(3)计算屏幕内的标注方法,这里直接上代码了,实验过是可用的
首先将经纬度转化为屏幕内坐标
CGPoint point = [self.mapView convertCoordinate:annotationitem.coordinate toPointToView:self.mapView];
然后判断坐标是否在地图可见范围内
CGRectContainsPoint(CGRectMake(0, 44, self.mapView.frame.size.width, self.mapView.frame.size.height-44-49), point)
(4)BMKMapViewDelegate 的方法
- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id<BMKAnnotation>)annotation
使用此方法时,都可能会用到自定义的BMKAnnotationView类,但是请在给自定义类BMKAnnotationView,调用新定义的方法或属性时,先执行
annotationView.annotation = annotation;
保证在你要执行的其他代码前面就好