Mapbox iOS - 动态创建填充多边形

时间:2014-11-10 10:54:12

标签: ios objective-c polygon mapbox

我正在使用地图的 Mapbox 框架,我想填充多边形,并且多边形的顶点来自用户触摸。

以下是我的用户触控代码

- (void)singleTapOnMap:(RMMapView *)map at:(CGPoint)point
{
        CLLocationCoordinate2D coord;

        coord.latitude = [map pixelToCoordinate:point].latitude;
        coord.longitude = [map pixelToCoordinate:point].longitude;
        RMAnnotation *annotation = [[RMAnnotation alloc] initWithMapView:map coordinate:coord andTitle:@""];
        annotation.userInfo = [[NSArray alloc]initWithObjects:[[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude], nil];
        [map addAnnotation:annotation];
}

委托方法

- (RMMapLayer *)mapView:(RMMapView *)mapView layerForAnnotation:(RMAnnotation *)annotation
{
    if (annotation.isUserLocationAnnotation)
        return nil;

    CLLocation *location = [annotation.userInfo objectAtIndex:0];

    RMShape *line = [[RMShape alloc] initWithView:annotation.mapView];
    line.lineWidth = 3.0;
    line.position = annotation.position;
    line.lineColor = [UIColor redColor];
    line.fillColor = [UIColor greenColor];
    [line moveToCoordinate:location.coordinate];
    [line addLineToCoordinate:lastLocation.coordinate];
    return line;
}

我可以绘制多边形但无法填充它。

1 个答案:

答案 0 :(得分:0)

在我看来,根据您当前的方式,对于地图上的每个点击,您正在创建一个新的注释,每个注释包含从最后一个位置到当前点击位置的一个线段,这将是不创建多边形,而是创建一系列仅包含一个线段的单个注释。

您需要创建一个单独的顶点位置数组。当您通过点击添加更多位置时,它会添加到位置数组:

//#1创建以下iVar以保持绘图和多边形顶点的状态

bool isDrawingPolygon;
NSMutableArray  *savedPolygonVertices;
在viewDidLoad或你的初始代码中

//#2,一定要设置初始状态

-(void)viewDidLoad
{
    isDrawingPolygon = FALSE;
    savedPolygonVertices = nil;
    ...
    ... REST OF VIEW DID LOAD OR INIT METHOD 

//#3创建一个IBAction按钮方法以触发绘制动态多边形(开始按钮)的开始

-(void)startCreatingPolygon
{
    isDrawingPolygon = TRUE;
    savedPolygonVertices = [[NSMutableArray alloc] initWithCapacity:50];  // Some arbitrary number of points
}

//#4每当singleTapOnMap

开始添加位置顶点
-(void)singleTapOnMap:(RMMapView *)map at:(CGPoint)point
{
    if (isDrawingPolygon)
    {
        CLLocationCoordinate2D coord;

        coord.latitude = [map pixelToCoordinate:point].latitude;
        coord.longitude = [map pixelToCoordinate:point].longitude;
        [savedPolygonVertices addObject:coord];
        RMAnnotation *annotation = [[RMAnnotation alloc] initWithMapView:map coordinate:coord andTitle:@"tempPolygon"];  // Give each temporary line annotation some common identifier "tempPolygon"
        annotation.userInfo = [[NSArray alloc]initWithObjects:[[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude], nil];
        [map addAnnotation:annotation];
    }
}  

//#5当您点击“停止”按钮时,您需要将数组中的位置顶点滚动到包含RMS形状多边形的ONE注释对象中,该多边形包含多边形的所有顶点(以及填充/线条颜色属性) ,以及该多边形的标识符。

-(void)stopCreatingPolygon  // IBAction method for stop making polygon
{
    isDrawingPolygon = FALSE;
    RMAnnotation *annotation = [[RMAnnotation alloc] initWithMapView:self.mapView coordinate:coord andTitle:@"Polygon"]; 
    annotation.userInfo = savedPolygonVertices;
    [self.mapView addAnnotation:annotation];
    savedPolygonVertices = nil;
    for (RMAnnotation *ann in self.mapView.annotations)
    {
        if ([ann.title isEqualToString:@"tempPolygon"])
        [self.mapView removeAnnotation:ann];  // Get rid of the temporary line segments
    }
}        

//#6然后在layerForAnnotation中,您需要检查该标识符(annotation.title),并将多边形包装在if语句中

- (RMMapLayer *)mapView:(RMMapView *)mapView layerForAnnotation:(RMAnnotation *)annotation
{
        if (annotation.isUserLocationAnnotation)
            return nil;

        if ([annotation.title isEqualToString:@"tempPolygon"])
        {
            CLLocation *location = [annotation.userInfo objectAtIndex:0];

            RMShape *line = [[RMShape alloc] initWithView:annotation.mapView];
            line.lineWidth = 3.0;
            line.position = annotation.position;
            line.lineColor = [UIColor redColor];
            line.fillColor = [UIColor greenColor];
            [line moveToCoordinate:location.coordinate];
            [line addLineToCoordinate:lastLocation.coordinate];
            return line;
        }

        if ([annotation.title isEqualToString:@"Polygon"])
        {

            RMShape *shape = [[RMShape alloc] initWithView:self.mapView];
            shape.lineWidth = 3.0;
            shape.lineColor = [UIColor redColor];
            shape.fillColor = [UIColor greenColor];
            shape.fillRule= kCAFillRuleNonZero;
            shape.lineJoin = kCALineJoinRound;
            shape.lineCap = kCALineCapRound;

            for (CLLocationCoordinate2D * location in annotation.userInfo){ 
            // userInfo now contains all vertices between start & stop
                         [shape addLineToCoordinate:location];
               }

            return shape;
        }
}

这应该可以满足您的需求。

/ blee /