baidumap demo(一)
覆盖物概述
地图上自定义的标注点和覆盖物我们统称为地图覆盖物。您可以通过定制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协议:
- #import <UIKit/UIKit.h>
- #import "BMapKit.h"
- @interface AnnotationDemoViewController : UIViewController <BMKMapViewDelegate> {
- IBOutlet BMKMapView* mapView;
- }
- @end
修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForAnnotation:函数,并在viewDidAppear添加标注数据对象
- - (void) viewDidAppear:(BOOL)animated {
- // 添加一个PointAnnotation
- BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
- CLLocationCoordinate2D coor;
- coor.latitude = 39.915;
- coor.longitude = 116.404;
- annotation.coordinate = coor;
- annotation.title = @"这里是北京";
- [mapView addAnnotation:annotation];
- }
- // Override
- - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation
- {
- if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
- BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];
- newAnnotationView.pinColor = BMKPinAnnotationColorPurple;
- newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
- return newAnnotationView;
- }
- return nil;
- }
运行后,会在地图显示对应的标注点,点击会弹出气泡,效果如图:
删除标注
通过removeAnnotation:函数实现对已添加标注的删除功能,示例如下:
添加折线
修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:
- #import <UIKit/UIKit.h>
- #import "BMapKit.h"
- @interface OverlayDemoViewController : UIViewController <BMKMapViewDelegate>{
- IBOutlet BMKMapView* mapView;
- }
- @end
修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数,并在viewDidLoad添加折线数据对象:
- - (void)viewDidLoad {
- [super viewDidLoad];
- // 添加折线覆盖物
- CLLocationCoordinate2D coors[2] = {0};
- coors[0].latitude = 39.315;
- coors[0].longitude = 116.304;
- coors[1].latitude = 39.515;
- coors[1].longitude = 116.504;
- BMKPolyline* polyline = [BMKPolyline polylineWithCoordinates:coors count:2];
- [_mapView addOverlay:polyline];
- }
- // Override
- - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{
- if ([overlay isKindOfClass:[BMKPolyline class]]){
- BMKPolylineView* polylineView = [[[BMKPolylineView alloc] initWithOverlay:overlay] autorelease];
- polylineView.strokeColor = [[UIColor purpleColor] colorWithAlphaComponent:1];
- polylineView.lineWidth = 5.0;
- return polylineView;
- }
- return nil;
- }
运行后,效果如图:
添加弧线
百度地图iOS SDK自v2.1.1版本起,新增了绘制弧线的方法。用户可以根据三个有序点唯一确定一条弧线,满足您的业务需求。首先,修改您的.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数,并在viewDidLoad添加弧线数据对象:
- - (void)viewDidLoad {
- [super viewDidLoad];
- //添加弧线覆盖物
- //传入的坐标顺序为起点、途经点、终点
- CLLocationCoordinate2D coords[3] = {0};
- coords[0].latitude = 39.9374;
- coords[0].longitude = 116.350;
- coords[1].latitude = 39.9170;
- coords[1].longitude = 116.360;
- coords[2].latitude = 39.9479;
- coords[2].longitude = 116.373;
- BMKArcline *arcline = [BMKArcline arclineWithCoordinates:coords];
- [_mapView addOverlay:arcline];
- }
- //根据overlay生成对应的View
- - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<bmkoverlay>)overlay
- {
- if ([overlay isKindOfClass:[BMKArcline class]])
- {
- BMKArclineView* arclineView = [[[BMKArclineView alloc] initWithOverlay:overlay] autorelease];
- arclineView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.5];
- arclineView.lineWidth = 5.0;
- return arclineView;
- }
- return nil;
- }
- </bmkoverlay>
运行后,效果如图:
添加多边形
修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:
修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数,并在viewDidLoad添加多边形数据对象:
- - (void)viewDidLoad {
- [super viewDidLoad];
- // 添加多边形覆盖物
- CLLocationCoordinate2D coords[3] = {0};
- coords[0].latitude = 39;
- coords[0].longitude = 116;
- coords[1].latitude = 38;
- coords[1].longitude = 115;
- coords[2].latitude = 38;
- coords[2].longitude = 117;
- BMKPolygon* polygon = [BMKPolygon polygonWithCoordinates:coords count:3];
- [mapView addOverlay:polygon];
- }
- // Override
- - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{
- if ([overlay isKindOfClass:[BMKPolygon class]]){
- BMKPolygonView* polygonView = [[[BMKPolygonView alloc] initWithOverlay:overlay] autorelease];
- polygonView.strokeColor = [[UIColor purpleColor] colorWithAlphaComponent:1];
- polygonView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2];
- polygonView.lineWidth = 5.0;
- return polygonView;
- }
- return nil;
- }
运行后,效果如图:
添加圆
修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:
修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数,并在viewDidLoad添加圆数据对象:
- - (void)viewDidLoad {
- [super viewDidLoad];
- // 添加圆形覆盖物
- CLLocationCoordinate2D coor;
- coor.latitude = 39.915;
- coor.longitude = 116.404;
- BMKCircle* circle = [BMKCircle circleWithCenterCoordinate:coor radius:5000];
- [_mapView addOverlay:circle];
- }
- // Override
- - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{
- if ([overlay isKindOfClass:[BMKCircle class]]){
- BMKCircleView* circleView = [[[BMKCircleView alloc] initWithOverlay:overlay] autorelease];
- circleView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5];
- circleView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.5];
- circleView.lineWidth = 10.0;
- return circleView;
- }
- return nil;
- }
运行后,效果如图:
添加图片图层
自V2.1.0开始,新增图片图层,开发者可在地图的指定位置上添加图片。该图片可随地图的平移、缩放、旋转等操作做相应的变换。图片图层是一种特殊的Overlay, 它位于底图和底图标注层之间(即图片图层不会遮挡地图标注信息), 此外,图片图层的添加顺序不会影响其他图层(例如:POI搜索图层、我的位置图层等)的叠加关系。
图片图层对象初始化的方法有两种:1)根据指定经纬度坐标生成 2)根据指定区域生成。下面举例分步说明添加图片图层的步骤:
修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:
- @interface AnnotationDemoViewController : UIViewController<BMKMapViewDelegate>{
- IBOutlet BMKMapView* _mapView;
- }
- @end
修改您的ViewController.m文件,在viewDidLoad添加图片图层对象:
- - (void)viewDidLoad {
- [super viewDidLoad];
- //添加图片图层覆盖物(第一种:根据指定经纬度坐标生成)
- CLLocationCoordinate2D coors;
- coors.latitude = 39.800;
- coors.longitude = 116.404;
- BMKGroundOverlay* ground = [BMKGroundOverlay groundOverlayWithPosition:coors
- zoomLevel:11 anchor:CGPointMake(0.0f,0.0f)
- icon:[UIImage imageWithName:@"test.png"]];
- [_mapView addOverlay:ground];
- //添加图片图层覆盖物(第二种:根据指定区域生成)
- CLLocationCoordinate2Dcoords[2] = {0};
- coords[0].latitude = 39.815;
- coords[0].longitude = 116.404;
- coords[1].latitude = 39.915;
- coords[1].longitude = 116.504;
- BMKCoordinateBounds bound;
- bound.southWest = coords[0];
- bound.northEast = coords[1];
- BMKGroundOverlay* ground2 = [BMKGroundOverlay groundOverlayWithBounds: bound
- icon:[UIImage imageWithName:@"test.png"]];
- [_mapView addOverlay:ground2];
- }
修改您的ViewController.m文件,实现BMKMapViewDelegate的mapView:viewForOverlay:函数:
- - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay{
- if ([overlay isKindOfClass:[BMKGroundOverlay class]]){
- BMKGroundOverlayView* groundView = [[[BMKGroundOverlayView alloc] initWithOverlay:overlay] autorelease];
- return groundView;
- }
- return nil;
- }
运行后,效果如图:


2D效果图3D效果图
添加自定义Overlay
从2.0.0开始,地图渲染采用OpenGL方式实现,因此覆盖物基类BMKOverlayView新增glRender接口,以及绘制基本线renderLinesWithPoints、面renderRegionWithPoints的接口来实现对覆盖物的OpenGL渲染。绘制自定义overlay时,继承BMKOverlayView的子类需实现glRender接口,在glRender中通过调用renderLinesWithPoints、renderRegionWithPoints来组合自己想要实现的图形,示例代码如下,详细示例请参见CustomOverlayDemoViewController:
CustomOverlayView继承BMKOverlayPathView,在CustomOverlayView中实现glRender
- - (void)glRender {
- //自定义overlay绘制
- CustomOverlay *customOverlay = [self customOverlay];
- if (customOverlay.pointCount >= 3) {
- [self renderRegionWithPoints:customOverlay.points pointCount:customOverlay.pointCount fillColor:self.fillColor usingTriangleFan:YES];//绘制多边形
- }else
- {
- [self renderLinesWithPoints:customOverlay.points pointCount:customOverlay.pointCount strokeColor:self.strokeColor lineWidth:self.lineWidth looped:NO];//绘制线
- }
- }
如果不实现glRender,则需实现drawMapRect默认使用系统GDI绘制,GDI绘制方式在overlayView尺寸较大时可能有效率问题,因此建议使用glRender来实现自定义overlay绘制。
删除Overlay
通过removeOverlay:函数实现对已添加标注的删除功能,示例如下:
baidumap demo(一)的更多相关文章
- baidumap demo(三)
定位 您可以通过以下代码来开启定位功能: 源码复制打印关于 //开启定位功能 [_mapView setShowsUserLocation:YES]; 定位成功后,可以通过mapView.userLo ...
- baidumap demo(二)
接口说明 百度地图API提供的搜索服务包括:POI检索,多关键字检索,公交方案检索,驾车路线检索,步行路线检索,地理编码,反地理编码,公交详情检索,在线建议查询,短串分享. 所有检索请求接口均为异步接 ...
- 百度map 3.0初探
1.简介 在使用百度地图SDK为您提供的各种LBS能力之前,您需要获取百度地图移动版的开发密钥,该密钥与您的百度账户相关联.因此,您必须先有百度帐户,才能获得开发密钥.并且,该密钥与您创建的过程名称有 ...
- 百度地图SDK3.4的使用
使用过百度地图的开发者应该都知道原始百度地图的开发的基本流程,但是随着百度地图的更新,百度地图的api有了翻天覆地的变化,最新版本的sdk为v3.4 2015年4月14日上线,优化了许多接口的设计,简 ...
- 项目总结02:百度地图js 基本用法介绍
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 查看android sha1
Android百度定位SDK自v4.0版本之后开始引入了百度地图开放平台的统一AK验证体系.通过AK机制,开发者可以更方便.更安全地配置自身使用的百度LBS资源(如设置服务配额等).随着LBS开放平台 ...
- 为啥我的Andrid百度SDK不能正常运行?
首先,百度SDK运行时候需要加载API Key,这个API Key是通过百度账号在百度里面申请到的,但是很可能大家没有注意到百度这个API Key申请的过程,其中很重要的一个步骤没有做好,而导致不能正 ...
- baiduMap & MapV 简单demo
看到 MapV 的一个demo 的底图比较好看,练练手 MapV demos:https://mapv.baidu.com/examples/ 参考的demo:https://mapv.baidu.c ...
- BaiduMap开发,获取公交站点信息。
可能有些人会出现无法导入overlayutil的错误,这是因为BaiduMap里面的包把这部分删除掉了,并且官方没有给出说明,这个地方以前也是让我折腾了很久. 不知道现在有没有说明这个问题,如果需要这 ...
随机推荐
- Centos 7.x 安装 MongoDB
官方安装资料:点击直达 本次以Centos为安装主机 1:首先先导入MongoDB的yum源,因为Centos默认是没有MongoDB的yum源,创建文件:/etc/yum.repos.d/mongo ...
- self.tabBarController.selectedIndex
KindViewController *vc =((UINavigationController *) [self.tabBarController viewControllers][]).viewC ...
- TCP常用方法
//格式化为16进制输出指令 function fromateSendCode($code){ $codeArr = getCodeWithSpace($code); for($i=0; $i< ...
- 535 Encode and Decode TinyURL 编码和解码精简URL地址
详见:https://leetcode.com/problems/encode-and-decode-tinyurl/description/ C++: class Solution { public ...
- 103 Binary Tree Zigzag Level Order Traversal 二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行).例如:给定二叉树 [3,9,20,null,null,15,7], 3 ...
- jQuery scrollLeft()与scrollTop() 源码解读
这里的实现也很容易懂,通过jQuery的静态方法each给jQuery的原型添加scrollLeft和scrollTop方法. 这里在取值时它把window和普通的element做了区分 如果是win ...
- na 残
题目描述: 对于斐波那锲数列f(0)=0,f(1)=1,....求f(f(n)的值 0<=n<=10^100 给出T组数据,每行一个n 输出n行 f(f(n)) 样例输入: 4 0 1 2 ...
- myBati初学
创建数据库(y2165) MyBatis环境搭建1.在pom.xml引入依赖2.得替换build节点,为了让程序编译在main中所有子包下的配置文件3.构建大配置,位于resources<?xm ...
- C语言abort函数
C语言编程入门教程,C语言库函数的abort函数的作用是异常终止一个进程,意味着abort后面的代码将不再执行. #include<stdio.h> #include<stdlib. ...
- bin&sbin 命令作用
最近需要了解sbin与bin的功能,需要整理一下.一下全部为Ubuntu14里面默认安装的.在这里收集一下,转载请注明出处! bin bash shell bunzip2 .bz2文件的解压缩程序. ...