覆盖物概述

地图上自定义的标注点和覆盖物我们统称为地图覆盖物。您可以通过定制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. 使用命令动态更新JAR包中的文件

    动态更新JAR包中的文件,经本人实际测试可正常执行! 一.查询jar包中要替换的文件位置 jar  -tvf  gateway.jar  |  grep  topjui.config.js 二.在当前 ...

  2. Hive_Hive和数据仓库简介

    文章摘自 : http://www.imooc.com/video/7573 Hive是建立在Hadoop HDFS上的数据仓库基础架构.Hive可以用来进行数据的ETL.Hive定义了简单的类似SQ ...

  3. Jasper_crosstab_group_dataset_Error incrementing crosstab dataset

    Error detail: net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.JRRuntimeExceptio ...

  4. Integer一类的比较问题

    总体主要分为两个方面 ①比较的是值 一.基本数据类型与引用数据类型进行比较时,引用数据类型会进行拆箱(自动拆装箱需要在jdk1.5以上),然后与基本数据类型进行值的比较 举例: int i = 12; ...

  5. TAIL and HEAD

    TAIL and HEAD tail tail:将指定的文件的最后部分输出到标准设备,通常是终端,和cat以及more等显示文本的差别在于:假设该档案有更新,tail会自己主动刷新,确保你看到最新的档 ...

  6. Linux系统下安装rz/sz命令及使用说明(文件上传下载)

    1.安装软件 yum -y install lrzsz 2.本地文件上传命令 rz -bye 执行该命令后,在弹出框中选择要上传的文件即可 3.下载文件到本地 sz filename

  7. c# 定时器 自动执行

    //下面讲一个打开窗体定时执行按钮的东西 private void Form1_Load(object sender, EventArgs e) { System.Timers.Timer pTime ...

  8. HDU4405 Aeroplane chess(期望dp)

    题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 正在玩飞行棋.输入n,m表示飞行棋有n个格子,有m个飞行点,然后输入m对u,v表示 ...

  9. thinkphp写的登录注册的小demo

    和asp.net类似,一个FormAction对应Form文件夹 demo结构: ‘ 对于项目结构有疑问的: http://www.thinkphp.cn/document/60.html login ...

  10. 修改完linux bashrc文件之后,如何不重启系统使其生效

    修改完后,输入如下命令即可 ##@##:~/    source ~/.bashrc 之后bashrc文件就可以使用! 注: 使用ssh登陆shell的时候,系统不会自动调用.bashrc文件, 只是 ...