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