热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

地图覆盖物

覆盖物概述地图上自定义的标注点和覆盖物我们统称为地图覆盖物。您可以通过定制BMKAnnotation和BMKOverlay来添加对应的标注点和覆盖物。地图覆盖物的设计遵循数据与Vi

覆盖物概述

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

SDK支持画点、折线、圆、多边形、自定义覆盖物。从2.0.0开始矢量地图采用OpenGL绘制,新增支持OpenGL绘制的基本线绘制、面绘制接口。详见demo,SDK内置的BMKPolylineOverlay、BMKPolygenOverlay,BMKCircleOverlay采用OpenGL绘制。


添加标注

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

源码关于



  1. #import   

  2. #import "BMapKit.h"  

  3. @interface AnnotationDemoViewController : UIViewController   

  4. {  

  5.     IBOutlet BMKMapView* mapView;  

  6. }  

  7. @end  

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

源码关于



  1. // Implement viewDidLoad to do additional setup after loading       the view, typically from a nib.  

  2. - (void)viewDidLoad {  

  3.     [super viewDidLoad];  

  4.     // 设置mapView的Delegate  

  5.     mapView.delegate = self;  

  6.     // 添加一个PointAnnotation  

  7.     BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];  

  8.     CLLocationCoordinate2D coor;  

  9.     coor.latitude = 39.915;  

  10.     coor.longitude = 116.404;  

  11.     annotation.coordinate = coor;  

  12.     annotation.title = @"这里是北京";  

  13.     [mapView addAnnotation:annotation];  

  14. }  

  15. // Override  

  16. - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id )annotation  

  17. {  

  18.     if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {  

  19.         BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];     

  20.         newAnnotationView.pinColor = BMKPinAnnotationColorPurple;     

  21.         newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示  

  22.         return newAnnotationView;     

  23.     }  

  24.     return nil;  

  25. }  

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


删除标注

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

源码关于



  1. if (annotation != nil) {  

  2. [mapView removeAnnotation:annotation];  


添加折线

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

源码关于



  1. #import   

  2. #import "BMapKit.h"  

  3. @interface OverlayDemoViewController : UIViewController {  

  4.     IBOutlet BMKMapView* mapView;  

  5. }  

  6. @end  

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

源码关于



  1. - (void)viewDidLoad {  

  2.     [super viewDidLoad];  

  3.     // 设置delegate  

  4.     mapView.delegate = self;  

  5.     // 添加折线覆盖物  

  6.     CLLocationCoordinate2D coors[2] = {0};  

  7.     coors[0].latitude = 39.315;  

  8.     coors[0].longitude = 116.304;  

  9.     coors[1].latitude = 39.515;  

  10.     coors[1].longitude = 116.504;  

  11.     BMKPolyline* polyline = [BMKPolyline polylineWithCoordinates:coors count:2];  

  12.     [mapView addOverlay:polyline];  

  13. }  

  14. // Override  

  15. - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id )overlay{  

  16.     if ([overlay isKindOfClass:[BMKPolyline class]]){  

  17.         BMKPolylineView* polylineView = [[[BMKPolylineView alloc] initWithOverlay:overlay] autorelease];  

  18.         polylineView.strokeColor = [[UIColor purpleColor] colorWithAlphaComponent:1];  

  19.         polylineView.lineWidth = 5.0;  

  20.         return polylineView;  

  21.     }  

  22.     return nil;  

  23. }  

运行后,效果如图:


添加多边形

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

源码关于



  1. [super viewDidLoad];   

  2. // 设置delegate  

  3.     mapView.delegate = self;  

  4.     // 添加多边形覆盖物  

  5.     CLLocationCoordinate2D coords[3] = {0};  

  6.     coords[0].latitude = 39;  

  7.     coords[0].longitude = 116;  

  8.     coords[1].latitude = 38;  

  9.     coords[1].longitude = 115;  

  10.     coords[2].latitude = 38;  

  11.     coords[2].longitude = 117;  

  12.     BMKPolygon* polygon = [BMKPolygon polygonWithCoordinates:coords count:3];  

  13.     [mapView addOverlay:polygon];  

  14. }  

  15. // Override  

  16. - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id )overlay{      

  17.     if ([overlay isKindOfClass:[BMKPolygon class]]){  

  18.         BMKPolygonView* polygonView = [[[BMKPolygonView alloc] initWithOverlay:overlay] autorelease];  

  19.         polygonView.strokeColor = [[UIColor purpleColor] colorWithAlphaComponent:1];  

  20.     polygonView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2];  

  21.         polygonView.lineWidth = 5.0;  

  22.         return polygonView;  

  23.     }  

  24.     return nil;  

  25. }  

运行后,效果如图:


添加圆

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

源码关于



  1. - (void)viewDidLoad {  

  2.     [super viewDidLoad];  

  3.     // 设置delegate  

  4.     mapView.delegate = self;  

  5.     // 添加圆形覆盖物  

  6.     CLLocationCoordinate2D coor;  

  7.     coor.latitude = 39.915;  

  8.     coor.longitude = 116.404;  

  9.     BMKCircle* circle = [BMKCircle circleWithCenterCoordinate:coor radius:5000];  

  10.     [mapView addOverlay:circle];  

  11. }  

  12. // Override  

  13. - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id )overlay{  

  14.     if ([overlay isKindOfClass:[BMKCircle class]]){  

  15.         BMKCircleView* circleView = [[[BMKCircleView alloc] initWithOverlay:overlay] autorelease];  

  16.         circleView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5];  

  17.         circleView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.5];  

  18.         circleView.lineWidth = 10.0;  

  19.         return circleView;  

  20.       }  

  21.      return nil;  

运行后,效果如图:


添加自定义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.     {  

  3.     //自定义overlay绘制  

  4.     CustomOverlay *customOverlay = [self customOverlay];  

  5.   

  6.     if (customOverlay.pointCount >= 3) {  

  7.         [self renderRegionWithPoints:customOverlay.points pointCount:customOverlay.pointCount fillColor:self.fillColor usingTriangleFan:YES];//绘制多边形  

  8.     }else  

  9.     {  

  10.         [self renderLinesWithPoints:customOverlay.points pointCount:customOverlay.pointCount strokeColor:self.strokeColor lineWidth:self.lineWidth looped:NO];//绘制线  

  11.     }  

  12. }  

  13.    

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


删除Overlay

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

源码关于




    1. if (overlay != nil) {  

    2.     [mapView removeOverlay:overlay];  

    3. }  

    4.     本文转载至:http://developer.baidu.com/map/sdkiosdev-6.htm




推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
yvli心语
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有