MKPolygon 未绘制

Posted

技术标签:

【中文标题】MKPolygon 未绘制【英文标题】:MKPolygon not being drawn 【发布时间】:2012-04-26 20:52:38 【问题描述】:

我试图在我的地图视图上绘制一个 MKPolygon(三角形),但它没有显示出来。我还画了一条线,它出现了,所以我不确定为什么三角形没有。以下是相关代码:

           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;
    

三角形的点似乎是正确的:(这里的一个测试:base x: 43.000000 y: 25.500000 a x: 50.000000 y: 58.000000 b x: 73.000000 y :38.000000),但是 viewForOverlay 永远不会被调用...

【问题讨论】:

【参考方案1】:

我通过将我的 CGPoints 转换回 CLLocationCoordinate2D's 然后创建三角形解决了这个问题:

    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];

我不知道为什么它不适用于polygonWithPoints,但它适用于坐标。

【讨论】:

以上是关于MKPolygon 未绘制的主要内容,如果未能解决你的问题,请参考以下文章

验证 latlong 是不是在 iOS 的 MKPolygon 内

是否可以在 ios 的 mapView 上集群 MKPolygon

如何向 MKPolyline 和 MKPolygon 添加描述?

iOS MKPolygon 模式

Swift4 中 MKPolygon 的指定初始化程序是啥?

MKPolygon 面积计算 Swift