覆盖物概述

地图上自定义的标注点和覆盖物我们统称为地图覆盖物。您可以通过定制BMKAnnotation和BMKOverlay来添加对应的标注点和覆盖物。地图覆盖物的设计遵循数据与View分离的原则,BMKAnnotation和BMKOverlay系列的类主要用来存放覆盖物相关的数据,BMKAnnotaionView和BMKOverlayView系列类为覆盖物对应的View。

SDK支持画点、折线、圆、多边形(包括凹凸两种)、图片图层和自定义覆盖物。从2.0.0开始矢量地图采用OpenGL绘制,新增支持OpenGL绘制的基本线绘制、面绘制接口。详见AnnotationDemo,SDK内置的BMKPolylineOverlay、BMKPolygonOverlay,BMKCircleOverlay均采用OpenGL绘制。

添加标注

BMKAnnotation为标注对应的protocal,您可以自定义标注类实现该protocal。百度地图API也预置了基本的标注点——BMKPointAnnotation和一个大头针标注View——BMKPinAnnotationView,您可以直接使用来显示标注。示例如下: 
修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:

  1. #import <UIKit/UIKit.h>
  2. #import "BMapKit.h"
  3. @interface AnnotationDemoViewController : UIViewController <BMKMapViewDelegate> {
  4. IBOutlet BMKMapView* mapView;
  5. }
  6. @end

修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForAnnotation:函数,并在viewDidAppear添加标注数据对象

  1. - (void) viewDidAppear:(BOOL)animated {
  2. // 添加一个PointAnnotation
  3. BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
  4. CLLocationCoordinate2D coor;
  5. coor.latitude = 39.915;
  6. coor.longitude = 116.404;
  7. annotation.coordinate = coor;
  8. annotation.title = @"这里是北京";
  9. [mapView addAnnotation:annotation];
  10. }
  11. // Override
  12. - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation
  13. {
  14. if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
  15. BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];
  16. newAnnotationView.pinColor = BMKPinAnnotationColorPurple;
  17. newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
  18. return newAnnotationView;
  19. }
  20. return nil;
  21. }

运行后,会在地图显示对应的标注点,点击会弹出气泡,效果如图:

删除标注

通过removeAnnotation:函数实现对已添加标注的删除功能,示例如下:

  1. if (annotation != nil) {
  2. [_mapView removeAnnotation:annotation];
  3. }

添加折线

修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:

  1. #import <UIKit/UIKit.h>
  2. #import "BMapKit.h"
  3. @interface OverlayDemoViewController : UIViewController <BMKMapViewDelegate>{
  4. IBOutlet BMKMapView* mapView;
  5. }
  6. @end

修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数,并在viewDidLoad添加折线数据对象:

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. // 添加折线覆盖物
  4. CLLocationCoordinate2D coors[2] = {0};
  5. coors[0].latitude = 39.315;
  6. coors[0].longitude = 116.304;
  7. coors[1].latitude = 39.515;
  8. coors[1].longitude = 116.504;
  9. BMKPolyline* polyline = [BMKPolyline polylineWithCoordinates:coors count:2];
  10. [_mapView addOverlay:polyline];
  11. }
  12. // Override
  13. - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{
  14. if ([overlay isKindOfClass:[BMKPolyline class]]){
  15. BMKPolylineView* polylineView = [[[BMKPolylineView alloc] initWithOverlay:overlay] autorelease];
  16. polylineView.strokeColor = [[UIColor purpleColor] colorWithAlphaComponent:1];
  17. polylineView.lineWidth = 5.0;
  18. return polylineView;
  19. }
  20. return nil;
  21. }

运行后,效果如图:

添加弧线

百度地图iOS SDK自v2.1.1版本起,新增了绘制弧线的方法。用户可以根据三个有序点唯一确定一条弧线,满足您的业务需求。首先,修改您的.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数,并在viewDidLoad添加弧线数据对象:

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. //添加弧线覆盖物
  4. //传入的坐标顺序为起点、途经点、终点
  5. CLLocationCoordinate2D coords[3] = {0};
  6. coords[0].latitude = 39.9374;
  7. coords[0].longitude = 116.350;
  8. coords[1].latitude = 39.9170;
  9. coords[1].longitude = 116.360;
  10. coords[2].latitude = 39.9479;
  11. coords[2].longitude = 116.373;
  12. BMKArcline *arcline = [BMKArcline arclineWithCoordinates:coords];
  13. [_mapView addOverlay:arcline];
  14. }
  15. //根据overlay生成对应的View
  16. - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<bmkoverlay>)overlay
  17. {
  18. if ([overlay isKindOfClass:[BMKArcline class]])
  19. {
  20. BMKArclineView* arclineView = [[[BMKArclineView alloc] initWithOverlay:overlay] autorelease];
  21. arclineView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.5];
  22. arclineView.lineWidth = 5.0;
  23. return arclineView;
  24. }
  25. return nil;
  26. }
  27. </bmkoverlay>

运行后,效果如图:

添加多边形

修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议: 
修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数,并在viewDidLoad添加多边形数据对象:

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. // 添加多边形覆盖物
  4. CLLocationCoordinate2D coords[3] = {0};
  5. coords[0].latitude = 39;
  6. coords[0].longitude = 116;
  7. coords[1].latitude = 38;
  8. coords[1].longitude = 115;
  9. coords[2].latitude = 38;
  10. coords[2].longitude = 117;
  11. BMKPolygon* polygon = [BMKPolygon polygonWithCoordinates:coords count:3];
  12. [mapView addOverlay:polygon];
  13. }
  14. // Override
  15. - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{
  16. if ([overlay isKindOfClass:[BMKPolygon class]]){
  17. BMKPolygonView* polygonView = [[[BMKPolygonView alloc] initWithOverlay:overlay] autorelease];
  18. polygonView.strokeColor = [[UIColor purpleColor] colorWithAlphaComponent:1];
  19. polygonView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2];
  20. polygonView.lineWidth = 5.0;
  21. return polygonView;
  22. }
  23. return nil;
  24. }

运行后,效果如图:

添加圆

修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议: 
修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数,并在viewDidLoad添加圆数据对象:

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. // 添加圆形覆盖物
  4. CLLocationCoordinate2D coor;
  5. coor.latitude = 39.915;
  6. coor.longitude = 116.404;
  7. BMKCircle* circle = [BMKCircle circleWithCenterCoordinate:coor radius:5000];
  8. [_mapView addOverlay:circle];
  9. }
  10. // Override
  11. - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{
  12. if ([overlay isKindOfClass:[BMKCircle class]]){
  13. BMKCircleView* circleView = [[[BMKCircleView alloc] initWithOverlay:overlay] autorelease];
  14. circleView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5];
  15. circleView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.5];
  16. circleView.lineWidth = 10.0;
  17. return circleView;
  18. }
  19. return nil;
  20. }

运行后,效果如图:

添加图片图层

自V2.1.0开始,新增图片图层,开发者可在地图的指定位置上添加图片。该图片可随地图的平移、缩放、旋转等操作做相应的变换。图片图层是一种特殊的Overlay, 它位于底图和底图标注层之间(即图片图层不会遮挡地图标注信息), 此外,图片图层的添加顺序不会影响其他图层(例如:POI搜索图层、我的位置图层等)的叠加关系。

图片图层对象初始化的方法有两种:1)根据指定经纬度坐标生成 2)根据指定区域生成。下面举例分步说明添加图片图层的步骤:

修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:

  1. @interface AnnotationDemoViewController : UIViewController<BMKMapViewDelegate>{
  2. IBOutlet BMKMapView* _mapView;
  3. }
  4. @end

修改您的ViewController.m文件,在viewDidLoad添加图片图层对象:

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. //添加图片图层覆盖物(第一种:根据指定经纬度坐标生成)
  4. CLLocationCoordinate2D coors;
  5. coors.latitude = 39.800;
  6. coors.longitude = 116.404;
  7. BMKGroundOverlay* ground = [BMKGroundOverlay groundOverlayWithPosition:coors
  8. zoomLevel:11 anchor:CGPointMake(0.0f,0.0f)
  9. icon:[UIImage imageWithName:@"test.png"]];
  10. [_mapView addOverlay:ground];
  11. //添加图片图层覆盖物(第二种:根据指定区域生成)
  12. CLLocationCoordinate2Dcoords[2] = {0};
  13. coords[0].latitude = 39.815;
  14. coords[0].longitude = 116.404;
  15. coords[1].latitude = 39.915;
  16. coords[1].longitude = 116.504;
  17. BMKCoordinateBounds bound;
  18. bound.southWest = coords[0];
  19. bound.northEast = coords[1];
  20. BMKGroundOverlay* ground2 = [BMKGroundOverlay groundOverlayWithBounds: bound
  21. icon:[UIImage imageWithName:@"test.png"]];
  22. [_mapView addOverlay:ground2];
  23. }

修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数:

  1. - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay{
  2. if ([overlay isKindOfClass:[BMKGroundOverlay class]]){
  3. BMKGroundOverlayView* groundView = [[[BMKGroundOverlayView alloc] initWithOverlay:overlay] autorelease];
  4. return groundView;
  5. }
  6. return nil;
  7. }

运行后,效果如图:

2D效果图3D效果图

添加自定义Overlay

从2.0.0开始,地图渲染采用OpenGL方式实现,因此覆盖物基类BMKOverlayView新增glRender接口,以及绘制基本线renderLinesWithPoints、面renderRegionWithPoints的接口来实现对覆盖物的OpenGL渲染。绘制自定义overlay时,继承BMKOverlayView的子类需实现glRender接口,在glRender中通过调用renderLinesWithPoints、renderRegionWithPoints来组合自己想要实现的图形,示例代码如下,详细示例请参见CustomOverlayDemoViewController:

CustomOverlayView继承BMKOverlayPathView,在CustomOverlayView中实现glRender

  1. - (void)glRender  {
  2. //自定义overlay绘制
  3. CustomOverlay *customOverlay = [self customOverlay];
  4. if (customOverlay.pointCount >= 3) {
  5. [self renderRegionWithPoints:customOverlay.points pointCount:customOverlay.pointCount fillColor:self.fillColor usingTriangleFan:YES];//绘制多边形
  6. }else
  7. {
  8. [self renderLinesWithPoints:customOverlay.points pointCount:customOverlay.pointCount strokeColor:self.strokeColor lineWidth:self.lineWidth looped:NO];//绘制线
  9. }
  10. }

如果不实现glRender,则需实现drawMapRect默认使用系统GDI绘制,GDI绘制方式在overlayView尺寸较大时可能有效率问题,因此建议使用glRender来实现自定义overlay绘制。

删除Overlay

通过removeOverlay:函数实现对已添加标注的删除功能,示例如下:

  1. if (overlay != nil) {
  2. [_mapView removeOverlay:overlay];
  3. }

baidumap demo(一)的更多相关文章

  1. baidumap demo(三)

    定位 您可以通过以下代码来开启定位功能: 源码复制打印关于 //开启定位功能 [_mapView setShowsUserLocation:YES]; 定位成功后,可以通过mapView.userLo ...

  2. baidumap demo(二)

    接口说明 百度地图API提供的搜索服务包括:POI检索,多关键字检索,公交方案检索,驾车路线检索,步行路线检索,地理编码,反地理编码,公交详情检索,在线建议查询,短串分享. 所有检索请求接口均为异步接 ...

  3. 百度map 3.0初探

    1.简介 在使用百度地图SDK为您提供的各种LBS能力之前,您需要获取百度地图移动版的开发密钥,该密钥与您的百度账户相关联.因此,您必须先有百度帐户,才能获得开发密钥.并且,该密钥与您创建的过程名称有 ...

  4. 百度地图SDK3.4的使用

    使用过百度地图的开发者应该都知道原始百度地图的开发的基本流程,但是随着百度地图的更新,百度地图的api有了翻天覆地的变化,最新版本的sdk为v3.4 2015年4月14日上线,优化了许多接口的设计,简 ...

  5. 项目总结02:百度地图js 基本用法介绍

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. 查看android sha1

    Android百度定位SDK自v4.0版本之后开始引入了百度地图开放平台的统一AK验证体系.通过AK机制,开发者可以更方便.更安全地配置自身使用的百度LBS资源(如设置服务配额等).随着LBS开放平台 ...

  7. 为啥我的Andrid百度SDK不能正常运行?

    首先,百度SDK运行时候需要加载API Key,这个API Key是通过百度账号在百度里面申请到的,但是很可能大家没有注意到百度这个API Key申请的过程,其中很重要的一个步骤没有做好,而导致不能正 ...

  8. baiduMap & MapV 简单demo

    看到 MapV 的一个demo 的底图比较好看,练练手 MapV demos:https://mapv.baidu.com/examples/ 参考的demo:https://mapv.baidu.c ...

  9. BaiduMap开发,获取公交站点信息。

    可能有些人会出现无法导入overlayutil的错误,这是因为BaiduMap里面的包把这部分删除掉了,并且官方没有给出说明,这个地方以前也是让我折腾了很久. 不知道现在有没有说明这个问题,如果需要这 ...

随机推荐

  1. [Xcode 实际操作]一、博主领进门-(9)Xcode左侧的项目导航区界面介绍

    目录:[Swift]Xcode实际操作 本文将演示Xcode的左侧操作界面. 项目的目录结构: 应用代理文件[AppDelegate.swift] 应用代理文件时系统运行本应用的委托,里面定义了如程序 ...

  2. 给 UILabel 中的文字增加 line-through / Strikethrough (删除线)样式

    iOS 6 中苹果引入了 NSStrikethroughStyleAttributeName 属性,用于设置 NSAttributedString 的删除线样式,用法如下: let attribute ...

  3. Python及bs4、lxml、numpy模块包的安装

    http://blog.csdn.net/tiantiancsdn/article/details/51046490(转载) Python及bs4.lxml.numpy模块包的安装 Python 的安 ...

  4. salt命令

    salt-key -L list在master上所有收到的公钥连接请求 -A accept所有pending的请求. -D 删除所有 在minion上启动服务后,几十秒后会在/etc/salt/pki ...

  5. bzoj3626: [LNOI2014]LCA奇技淫巧+树剖+线段树

    题目求[a,b]到c的lca深度之和   显然是一个满足区间减法的操作 于是简化为 [1,b]到c的lca深度之和 (然并卵╮(╯▽╰)╭)然后就用奇技淫巧发现 a和b的lca深度=先把根节点到a的路 ...

  6. 简单总结ConcurrentHashMap

    一.HashTable hashTable是一个线程安全的容器,是线程安全版本的HashMap.但它的底层是和HashMap一样的,只是在方法上都加上了synchronized关键字. 这样子有什么后 ...

  7. BIO,NIO,AIO总结

    熟练掌握 BIO,NIO,AIO 的基本概念以及一些常见问题是你准备面试的过程中不可或缺的一部分,另外这些知识点也是你学习 Netty 的基础. BIO,NIO,AIO 总结 1. BIO (Bloc ...

  8. Nodejs 文件修改自动重启扩展

    使用 supervisor: 安装: # 全局安装 npm -g install supervisor 启动: supervisor app.js

  9. 16年毕业的前端er在杭州求职ing

    来杭州也有一两个星期了,这个周末下雨,是在没地去,还是习惯性的打开电脑逛技术论坛,想想也是好久没有更新博文了... 背景 因为曾经看过一篇文章面试分享:一年经验初探阿里巴巴前端社招所以来杭州也是带有目 ...

  10. silverlight GPS监控,视频监控界面

    周末闲着自己做了个玩玩