iOS-BMK标注&覆盖物

在iOS开发中,地图算是一个比较重要的模块。我们常用的地图有高德地图,百度地图,谷歌地图,对于中国而言,苹果公司已经不再使用谷歌地图,官方使用的是高德地图。下面将讲述一下百度地图开发过程中的一些小的知识点。

对于如何配置百度地图的开发环境,在此不再讲述,具体可以参考:http://developer.baidu.com/map/index.php?title=iossdk/guide/buildproject

百度地图iOS的API下载地址:http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download

关于百度地图的基本使用,我们可以参考百度地图的开发文档,在此主要总结一下开发文档中一些重要的知识点和延伸点。(地图版本IOS SDK 2.9.0)

首先说明一下百度地图开发中可能遇到的问题:

如何添加标注(系统标注和自定义标注)

 

 1 //添加标记
 2 -(void)viewDidAppear:(BOOL)animated
 3 {
 4     /*
 5     for (int i = 0; i < 3; i++) {
 6         BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
 7         CLLocationCoordinate2D coor;
 8         coor.latitude = 39.915 + i*2;
 9         coor.longitude = 116.404 + i*2;
10         annotation.coordinate = coor;
11         annotation.title = @"这里是北京";
12         [myMapView addAnnotation:annotation];
13     }
14     */
15     BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
16     CLLocationCoordinate2D coor;
17     coor.latitude = 39.915;
18     coor.longitude = 116.404;
19     annotation.coordinate = coor;
20     annotation.title = @"这里是北京";
21     annotation.subtitle = @"1";
22     //[myMapView addAnnotation:annotation];
23     
24     BMKPointAnnotation* annotation1 = [[BMKPointAnnotation alloc]init];
25     CLLocationCoordinate2D coor1;
26     coor1.latitude = 38.915;
27     coor1.longitude = 113.404 + 2;
28     annotation1.coordinate = coor1;
29     annotation1.title = @"这里也是北京";
30     annotation1.subtitle = @"2";
31     //[myMapView addAnnotation:annotation1];
32     
33     BMKPointAnnotation* annotation2 = [[BMKPointAnnotation alloc]init];
34     CLLocationCoordinate2D coor2;
35     coor2.latitude = 38.915;
36     coor2.longitude = 119.404 + 2;
37     annotation2.coordinate = coor2;
38     annotation2.title = @"这里同样是北京";
39     annotation2.subtitle = @"3";
40     //[myMapView addAnnotation:annotation2];
41     
42     NSArray *arr = [NSArray arrayWithObjects:annotation,annotation1,annotation2, nil];
43     [myMapView addAnnotations:arr];
44 }
45 
46 -(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation
47 {
48     if ([annotation isKindOfClass:[BMKPointAnnotation class]])
49     {
50         BMKPinAnnotationView *newAnnotationView = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationView"];
51         newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationView"];
52         newAnnotationView.pinColor = BMKPinAnnotationColorPurple;
53         newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
54         return newAnnotationView;
55     }
56     return nil;
57 }
系统标记

 

 

 

如何自定义大头针
自定义大头针就是改变大头针的样式,如你想使用自己的图片代替上面显示的样式,代码实现跟上面的代码基本一样。只是在上面代理实现的代码中加入下面的代码即可。
 1 newAnnotationView.image = [UIImage imageNamed:@"2"]; (图片显示的大小,可以通过newAnnotationView的frame设定)
 
如何修改气泡样式
在气泡上默认是可以显示两行信息,一个title,一个subtitle,在此仅修改气泡的样式,如边框大小,字体,等基本信息,没有改变总体布局。
 
 
 1 -(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation
 2 {
 3     if ([annotation isKindOfClass:[BMKPointAnnotation class]])
 4     {
 5         BMKPinAnnotationView *newAnnotationView = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationView"];
 6         newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationView"];
 7         newAnnotationView.pinColor = BMKPinAnnotationColorPurple;
 8         newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
 9        
10         UIView *view = [[UIView alloc]init];
11         view.frame = CGRectMake(0, 0, 100, 60);
12         view.backgroundColor = [UIColor greenColor];
13         [view.layer setMasksToBounds:YES];
14         [view.layer setCornerRadius:3];
15         view.alpha = 0.9;
16         
17         UILabel *label1 = [[UILabel alloc]init];
18         label1.frame = CGRectMake(0, 0, 100, 30);
19         label1.text = annotation.title;
20         label1.numberOfLines = 0;
21         label1.font = [UIFont systemFontOfSize:12];
22         label1.textColor = [UIColor blackColor];
23         [view addSubview:label1];
24         
25         UILabel *label2 = [[UILabel alloc]init];
26         label2.frame = CGRectMake(0, 30, 100, 30);
27         label2.text = annotation.subtitle;
28         label2.numberOfLines = 0;
29         label2.font = [UIFont systemFontOfSize:10];
30         label2.textColor = [UIColor lightGrayColor];
31         [view addSubview:label2];
32         
33         BMKActionPaopaoView *pView = [[BMKActionPaopaoView alloc]initWithCustomView:view];
34         pView.frame = CGRectMake(0, 0, 100, 60);
35         ((BMKPinAnnotationView *)newAnnotationView).paopaoView = pView;
36         return newAnnotationView;
37     }
38     return nil;
39 }
简单定义气泡样式

如果我们想要修改气泡的布局怎样处理呢?

因为系统默认的一个是坐标,一个标题,一个子标题,我们想要按照自己的方式布局弹出的气泡,我们需要做什么工作呢?

首先系统提供BMKPointAnnotation的方法不够我们使用,我们需要继承这个类,假如新类为myPoint,添加一些新的属性。比如这个类,我们需要添加三个属性。

分别是NSString *imgName ; NSString *placeName; NSString *idNum;

接下来我们我们需要自定义气泡,气泡本身是一个UIView,我们可以在继承于UIView,创建一个子类myPaopao;在myPaopao里面要添加三个控件,显示上面定义的三个属性。

1 #import <UIKit/UIKit.h>
2 
3 @interface myPaopao : UIView
4 @property(nonatomic,retain)UIImageView *imgView;
5 @property(nonatomic,retain) UILabel *placeName;
6 @property(nonatomic,retain) UILabel *idNum;
7  
8 @end
myPaopao.h
 1 #import "myPaopao.h"
 2 
 3 @implementation myPaopao
 4  
 5 -(instancetype)initWithFrame:(CGRect)frame
 6 {
 7     self = [super initWithFrame:frame];
 8     if (self)
 9     {
10         self.frame = CGRectMake(0, 0, 150, 60);
11         self.backgroundColor = [UIColor whiteColor];
12         
13         _imgView = [[UIImageView alloc]init];
14         _imgView.frame = CGRectMake(0, 0, 60, 60);
15         [self addSubview:_imgView];
16         
17         _placeName = [[UILabel alloc]init];
18         _placeName.frame = CGRectMake(60, 0, 90, 30);
19         _placeName.font = [UIFont systemFontOfSize:12];
20         [self addSubview:_placeName];
21         
22         _idNum = [[UILabel alloc]init];
23         _idNum.frame = CGRectMake(60, 30, 90, 30);
24         [self addSubview:_idNum];
25         
26     }
27     return self;
28 }
29 @end
myPaopao.m
 1 //添加标记
 2 -(void)viewDidAppear:(BOOL)animated
 3 {
 4     myPoint* annotation = [[myPoint alloc]init];
 5     CLLocationCoordinate2D coor;
 6     coor.latitude = 39.915;
 7     coor.longitude = 116.404;
 8     annotation.coordinate = coor;
 9     annotation.imgName = @"1.jpg";
10     annotation.placeName = @"这里是北京";
11     annotation.idNum = @"1";
12     [myMapView addAnnotation:annotation];
13     
14     myPoint* annotation1 = [[myPoint alloc]init];
15     CLLocationCoordinate2D coor1;
16     coor1.latitude = 38.915;
17     coor1.longitude = 113.404 + 2;
18     annotation1.coordinate = coor1;
19     annotation1.imgName = @"2.jpg";
20     annotation1.placeName = @"这里也是北京";
21     annotation1.idNum = @"2";
22     [myMapView addAnnotation:annotation1];
23 
24 }
25 -(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation
26 {
27     if ([annotation isKindOfClass:[myPoint class]])
28     {
29         myPoint *myAnnotation = (myPoint *)annotation;
30         
31         BMKPinAnnotationView *newAnnotationView = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationView"];
32         newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationView"];
33         newAnnotationView.pinColor = BMKPinAnnotationColorPurple;
34         newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
35         myPaopao *paopapo = [[myPaopao alloc]init];
36         
37         paopapo.imgView.image = [UIImage imageNamed:myAnnotation.imgName];
38         paopapo.placeName.text = myAnnotation.placeName;
39         paopapo.idNum.text = myAnnotation.idNum;
40         BMKActionPaopaoView *pView = [[BMKActionPaopaoView alloc]initWithCustomView:paopapo];
41         ((BMKPinAnnotationView *)newAnnotationView).paopaoView = pView;
42         return newAnnotationView;
43     }
44     return nil;
45 }
实现代码

如果有需要,我们还可以添加一个按钮,跳转到详情界面,添加按钮的方法,与上面的方法相同,在此

 

 点聚合功能

 点聚合功能是v2.9.0新增加的一个功能,如果在一个区域有大量的点,会产生覆盖现象,点聚合功能可以实现将很多点聚合到一个点上,通过缩放比例,可以显示更多点或聚合点。我们在下载SDK的时候,会带有一个Demo,从Demo中我们可以找到相应的实现代码。在开发文档中给出了我们核心代码:

 

折线(从一位置到另一位置的线段)
 
 代码段:
 1 //添加标记
 2 -(void)viewDidAppear:(BOOL)animated
 3 {
 4     CLLocationCoordinate2D coors[2] = {0};
 5     coors[0].latitude = 39.315;
 6     coors[0].longitude = 116.304;
 7     coors[1].latitude = 30.515;
 8     coors[1].longitude = 116.504;
 9     BMKPolyline *polyline = [BMKPolyline polylineWithCoordinates:coors count:2];
10     [myMapView addOverlay:polyline];
11 }
12 -(BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
13 {
14     NSLog(@"sdf");
15     if ([overlay isKindOfClass:[BMKPolyline class]])
16     {
17         BMKPolylineView *polylineView = [[BMKPolylineView alloc]initWithPolyline:overlay];
18         polylineView.strokeColor = [[UIColor greenColor]colorWithAlphaComponent:1];
19         polylineView.lineWidth = 5.0;
20         return polylineView;
21     }
22     return nil;
23 }
折线

分段纹理分段折线

代码段:
 1 //添加标记
 2 -(void)viewDidAppear:(BOOL)animated
 3 {
 4     CLLocationCoordinate2D coords[5] = {0};
 5     coords[0].latitude = 39.965;
 6     coords[0].longitude = 116.404;
 7     coords[1].latitude = 39.925;
 8     coords[1].longitude = 116.454;
 9     coords[2].latitude = 39.955;
10     coords[2].longitude = 116.494;
11     coords[3].latitude = 39.905;
12     coords[3].longitude = 116.654;
13     coords[4].latitude = 39.965;
14     coords[4].longitude = 116.704;
15     //构建分段文理索引数组
16     NSArray *textureIndex = [NSArray arrayWithObjects:
17                              [NSNumber numberWithInt:0],
18                              [NSNumber numberWithInt:1],
19                              [NSNumber numberWithInt:2],
20                              [NSNumber numberWithInt:1], nil];
21     BMKPolyline *polyline = [BMKPolyline polylineWithCoordinates:coords count:5 textureIndex:textureIndex];
22     [myMapView addOverlay:polyline];
23 }
24 -(BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
25 {
26     if ([overlay isKindOfClass:[BMKPolyline class]])
27     {
28         BMKPolylineView* polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
29         polylineView.lineWidth = 5;
30         polylineView.isFocus = YES;// 是否分段纹理绘制(突出显示),默认YES
31         //加载分段纹理图片,必须否则不能进行分段纹理绘制
32         [polylineView loadStrokeTextureImages:
33         [NSArray arrayWithObjects:[UIImage imageNamed:@"1.jpg"],
34           [UIImage imageNamed:@"2.jpg"],
35           [UIImage imageNamed:@"3.jpg"],nil]];
36         return polylineView;
37     }
38     return nil;
39 }
纹理折线

分段颜色分段折线

代码段:

 1 -(void)viewDidAppear:(BOOL)animated
 2 {
 3     CLLocationCoordinate2D coords[5] = {0};
 4     coords[0].latitude = 39.965;
 5     coords[0].longitude = 116.404;
 6     coords[1].latitude = 39.925;
 7     coords[1].longitude = 116.454;
 8     coords[2].latitude = 39.955;
 9     coords[2].longitude = 116.494;
10     coords[3].latitude = 39.905;
11     coords[3].longitude = 116.654;
12     coords[4].latitude = 39.965;
13     coords[4].longitude = 116.704;
14     //构建分段文理索引数组
15     NSArray *colorIndexs = [NSArray arrayWithObjects:
16                              [NSNumber numberWithInt:0],
17                              [NSNumber numberWithInt:1],
18                              [NSNumber numberWithInt:2],
19                              [NSNumber numberWithInt:1], nil];
20     BMKPolyline *polyline = [BMKPolyline polylineWithCoordinates:coords count:5 textureIndex:colorIndexs];
21     [myMapView addOverlay:polyline];
22 }
23 -(BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
24 {
25     if ([overlay isKindOfClass:[BMKPolyline class]])
26     {
27         BMKPolylineView* polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
28         polylineView.lineWidth = 5;
29         // 使用分段颜色绘制时,必须设置(内容必须为UIColor)
30         polylineView.colors = [NSArray arrayWithObjects:[UIColor greenColor], [UIColor redColor], [UIColor yellowColor], nil];
31         return polylineView;
32     }
33     return nil;
34 }
颜色分段

弧线(起点,途经点,终点)

代码段:

 1 -(void)viewDidAppear:(BOOL)animated
 2 {
 3     CLLocationCoordinate2D coords[3] = {0};
 4     coords[0].latitude = 39.9374;
 5     coords[0].longitude = 116.350;
 6     coords[1].latitude = 39.9170;
 7     coords[1].longitude = 116.360;
 8     coords[2].latitude = 39.9479;
 9     coords[2].longitude = 116.373;
10     BMKArcline *arcline = [BMKArcline arclineWithCoordinates:coords];
11     [myMapView addOverlay:arcline];
12 }
13 -(BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
14 {
15     if ([overlay isKindOfClass:[BMKArcline class]])
16     {
17         NSLog(@"adf");
18         BMKArclineView* arclineView = [[BMKArclineView alloc] initWithOverlay:overlay];
19         arclineView.strokeColor = [[UIColor blackColor]colorWithAlphaComponent:0.5];
20         arclineView.lineWidth = 5.0;
21         return arclineView;
22     }
23     return nil;
24 }
弧线

多边形

代码段:

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

代码段:

 1 -(void)viewDidAppear:(BOOL)animated
 2 {
 3     CLLocationCoordinate2D coor;
 4     coor.latitude = 39.915;
 5     coor.longitude = 116.404;
 6     BMKCircle* circle = [BMKCircle circleWithCenterCoordinate:coor radius:5000];
 7     [myMapView addOverlay:circle];
 8 }
 9 -(BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
10 {
11     if ([overlay isKindOfClass:[BMKCircle class]])
12     {
13         BMKCircleView* circleView = [[BMKCircleView alloc] initWithOverlay:overlay];
14         circleView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5];
15         circleView.strokeColor = [[UIColor orangeColor] colorWithAlphaComponent:0.5];
16         circleView.lineWidth = 10.0;
17         
18         return circleView;
19     }
20     return nil;
21 }

图片图层

第一种方法根据坐标,缩放尺度确定

代码段:

 1  -(void)viewDidAppear:(BOOL)animated
 2 {
 3     CLLocationCoordinate2D coors;
 4     coors.latitude = 39.800;
 5     coors.longitude = 116.404;
 6     BMKGroundOverlay* ground = [BMKGroundOverlay groundOverlayWithPosition:coors
 7                                                                  zoomLevel:5 anchor:CGPointMake(0.0f,0.0f)
 8                                                                     icon:[UIImage imageNamed:@"1.jpg"]];
 9     [myMapView addOverlay:ground];
10 }
11 -(BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
12 {
13     if ([overlay isKindOfClass:[BMKGroundOverlay class]]){
14         BMKGroundOverlayView* groundView = [[BMKGroundOverlayView alloc] initWithOverlay:overlay];
15         return groundView;
16     }
17     return nil;
18 }
图片图层一

第二种方法根据指定区域生成

代码段:

 1 -(void)viewDidAppear:(BOOL)animated
 2 {
 3     CLLocationCoordinate2D coords[2] = {0};
 4     coords[0].latitude = 39.815;
 5     coords[0].longitude = 116.404;
 6     coords[1].latitude = 39.915;
 7     coords[1].longitude = 116.504;
 8     BMKCoordinateBounds bound;
 9     bound.southWest = coords[0];
10     bound.northEast = coords[1];
11     BMKGroundOverlay* ground = [BMKGroundOverlay groundOverlayWithBounds: bound
12                                                                      icon:[UIImage imageNamed:@"2.jpg"]];
13     [myMapView addOverlay:ground];
14 }
15 -(BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
16 {
17     if ([overlay isKindOfClass:[BMKGroundOverlay class]]){
18         BMKGroundOverlayView* groundView = [[BMKGroundOverlayView alloc] initWithOverlay:overlay];
19         return groundView;
20     }
21     return nil;
22 }
图片图层二

 

 
 
 
 
 
 
posted @ 2015-10-17 15:06  WCCW  阅读(1876)  评论(0编辑  收藏  举报