Search code examples
iphonemkmapviewmkoverlay

MKPolygon not being drawn


I am trying to draw an MKPolygon (a triangle) on my mapview, but it is not showing up. I also draw a line, and it is showing up, so i'm not sure why the triangle isn't. Here is the relevant code:

           CGPoint base = [mapView convertCoordinate:carLocation toPointToView:mapView];
            CGPoint pivot = [mapView convertCoordinate:locationToLookup toPointToView:mapView];
            MKPolygon *triangle = [self drawTriangle:pivot:base];
            [mapView removeOverlays:[mapView overlays]];
            [mapView addOverlay:line];
            [mapView addOverlay:triangle];


-(MKPolygon *) drawTriangle:(CGPoint) pivot:(CGPoint)base {
    if ((abs(pivot.x - base.x) >= 70) || abs(pivot.y - base.y) >= 70 )  {
        double triangleHeight = 30;
        double triangleWidth = 30;
        double triangleSide = sqrt(triangleWidth*triangleWidth/4+triangleHeight*triangleHeight);
        double openingAngle = asin( triangleWidth/2.0/triangleSide );
        double angle = atan2( pivot.y - base.y, pivot.x - base.x );

        CGPoint a;
        a.x = (int) (base.x + triangleSide*cos( angle + openingAngle));
        a.y = (int) (base.y + triangleSide*sin( angle + openingAngle));
        CGPoint b;
        b.x = (int) (base.x + triangleSide*cos( angle - openingAngle ));
        b.y = (int) (base.y + triangleSide*sin( angle - openingAngle ));

        MKMapPoint * mp = malloc(sizeof(MKMapPoint) * 3);
        MKMapPoint init;

        init.x = base.x;
        init.y = base.y;
        mp[0] = init;
        init.x = a.x;
        init.y = a.y;
        mp[1] = init;
        init.x = b.x;
        init.y = b.y;
        mp[2] = init;
        NSLog(@"base x: %f y: %f    a x: %f y: %f     b x: %f y :%f", base.x, base.y, a.x, a.y, b.x, b.y);
        MKPolygon* triangle = [MKPolygon polygonWithPoints:mp count:3];
        NSLog(@"inside");
        free(mp);
        return triangle;
    }
    NSLog(@"here");
    return nil;

}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id )overlay
{
    MKOverlayView* overlayView = nil;

    if (overlay == line) {
        NSLog(@"In line");
    MKPolylineView* mkov =  [[MKPolylineView alloc] initWithPolyline:overlay];
   // [mkov fillColor:[UIColor redColor]];
    mkov.fillColor = [UIColor redColor];
    mkov.strokeColor = [UIColor redColor];
    mkov.lineWidth = 3;  
    overlayView = mkov;


    return overlayView;
    } else {
        NSLog(@"In here");
        MKPolygonView *mkpv = [[MKPolygonView alloc] initWithPolygon:overlay];
        mkpv.fillColor = [UIColor blueColor];
        mkpv.strokeColor = [UIColor blueColor];
        mkpv.lineWidth = 3;
        overlayView = mkpv;
        return overlayView;
    }
}

The points of the triangle seem to be right: (one test here: base x: 43.000000 y: 25.500000 a x: 50.000000 y: 58.000000 b x: 73.000000 y :38.000000), but viewForOverlay is never being called...


Solution

  • I solved the problem by converting my CGPoints back to CLLocationCoordinate2D's and then creating the triangle:

        init = [mapView convertPoint:base toCoordinateFromView:mapView];
        mp[0] = init;
        init = [mapView convertPoint:a toCoordinateFromView:mapView];
        mp[1] = init;
        init = [mapView convertPoint:b toCoordinateFromView:mapView];
        mp[2] = init;
        MKPolygon* triangle = [MKPolygon polygonWithCoordinates:mp count:3];
    

    I'm not sure why it didn't work with polygonWithPoints, but it works with co-ordinates.