美文网首页傲视苍穹iOS《Objective-C》VIP专题
IOS 百度地图实现动态添加多边形覆盖物

IOS 百度地图实现动态添加多边形覆盖物

作者: 是时候展现真正的BUG了 | 来源:发表于2017-05-07 13:27 被阅读346次

    首先说下因为我从事的Android开发,百度地图jforAndroid在项目中接触过,没有细细研究过,一直用的高德,对于添加多边形覆盖物这个功能,我用的还是比较多的,对于Android版的高德地图,在API中已经完美集成了这个功能了,但是百度forIOS,用起来就没有那么方便了,只有静态的添加方法,没办法动态添加,得自己费一番功夫,国际惯例,先上动图,也许我的实现不是最好的,欢迎一起学习交流!


    aa.gif

    要实现这个效果,最先要解决的就是地图的屏幕点击事件,看了API,发现百度屏幕点击事件有三个方法:

    -(void)mapView:(BMKMapView *)mapView onClickedMapPoi:(BMKMapPoi *)mapPoi{}//点击地图POI的时候触发
    
    -(void)mapView:(BMKMapView *)mapView onClickedMapBlank:(CLLocationCoordinate2D)coordinate{}//点击地图空白区域的时候触发
    
    -(void)mapView:(BMKMapView *)mapView onClickedBMKOverlayView:(BMKOverlayView *)overlayView{}//点击地图Overlay的时候触发
    

    看了上面三个方法有点小崩溃,我们需要在onClickedMapPoi()和onClickedMapBlank()中分别实现我们的方法,这里不知道有没有更好方法,因为这么实现的话会有点小问题。

    接着就是实现添加地理围栏的方法了,奉上官方的代码:

    - (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;  
    }
    
    2182D407-40A7-43DA-BEBF-1992B5875E74.png

    这里最重要的是CLLocationCoordinate2D,只要能动态添加这个数组内的元素,那么一切就迎刃而解了。好的,来了,动态分配数组:

    CLLocationCoordinate2D * coords = (CLLocationCoordinate2D *)malloc(sizeof(CLLocationCoordinate2D)*size);
    

    好吧,直接上代码:

    
    
    -(void)mapView:(BMKMapView *)mapView onClickedMapPoi:(BMKMapPoi *)mapPoi{
    
         CLLocationCoordinate2D coordinate = mapPoi.pt;//获取点击坐标
        [self addPointAnnotation:coordinate];
        if (self.array == nil) {
            self.array = [[NSMutableArray alloc] init];//初始化数组,用来存储坐标
        }
        CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
        [self.array addObject:location];//坐标转换用,因为NSMutableArray无法直接存储 CLLocationCoordinate2D 
        
        NSInteger size = [self.array count];
        //大于三的时候才添加
        if (size >= 3) {
            NSArray *a =  [self.map overlays];
            [self.map removeOverlays:a];
            //动态分配数组
            CLLocationCoordinate2D * coords = (CLLocationCoordinate2D *)malloc(sizeof(CLLocationCoordinate2D)*size);//size就是数组的大小
            
            for (int i = 0; i < [self.array count]; i++) {
                CLLocation *location = [self.array objectAtIndex:i];
                coords[i].latitude = location.coordinate.latitude;
                coords[i].longitude = location.coordinate.longitude;
                
            }
            
            BMKPolygon *polygon2 = [BMKPolygon polygonWithCoordinates:coords count:size];
            [self.map addOverlay:polygon2];
            
        }
        
        [location release];
    
    }
    
    

    以上!

    相关文章

      网友评论

        本文标题:IOS 百度地图实现动态添加多边形覆盖物

        本文链接:https://www.haomeiwen.com/subject/cltyzttx.html