zoukankan      html  css  js  c++  java
  • 地图覆盖物

    覆盖物概述

    地图上自定义的标注点和覆盖物我们统称为地图覆盖物。您可以通过定制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 <UIKit/UIKit.h>  
    2. #import "BMapKit.h"  
    3. @interface AnnotationDemoViewController : UIViewController   
    4. <BMKMapViewDelegate>{  
    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 <BMKAnnotation>)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. }  

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

    删除标注

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

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

    添加折线

    修改您的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.     // 设置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 <BMKOverlay>)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. }  

    运行后,效果如图:iosdev9.jpg

    添加多边形

    修改您的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 <BMKOverlay>)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. }  

    运行后,效果如图:iosdev10.jpg

    添加圆

    修改您的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 <BMKOverlay>)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;  

    运行后,效果如图:iosdev11.jpg

    添加自定义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
  • 相关阅读:
    Spring Boot入门教程1、使用Spring Boot构建第一个Web应用程序
    单点登录(SSO)的设计
    .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
    .NET Core快速入门教程 4、使用VS Code开发.NET Core控制台应用程序
    .NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)
    .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)
    .NET Core快速入门教程 1、开篇:说说.NET Core的那些事儿
    JAVA的8种基本数据类型
    JVM
    在coffeescript中声明和屏蔽模块变量
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/3144700.html
Copyright © 2011-2022 走看看