我正在验证latlong(CLLocationCoordinate2D)是否在MKMapview上绘制的MKPolygon中。

我正在使用以下代码在MKMapview上绘制MKPolygon,

MKPolygon *polygon = [MKPolygon polygonWithCoordinates:coordinates count:count];
[mapviewcontroller.mapview addOverlay:polygon];

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    MKPolygonRenderer *renderer = [[MKPolygonRenderer alloc] initWithPolygon:overlay];
    renderer.fillColor   = [[UIColor grayColor] colorWithAlphaComponent:0.2];
    renderer.strokeColor = [[UIColor blackColor] colorWithAlphaComponent:0.7];
    renderer.lineWidth   = 2;
    return renderer;
}

我正在使用验证MKPolygon中的latlong,
CLLocationCoordinate2D sampleLocation = CLLocationCoordinate2DMake(13,80);//13,80 is the latlong of clear colored area of the MKPolygon in the below image.
MKMapPoint mapPoint = MKMapPointForCoordinate(sampleLocation);
CGPoint mapPointAsCGP = CGPointMake(mapPoint.x, mapPoint.y);

for (id<MKOverlay> overlay in mapview.overlays) {
    if([overlay isKindOfClass:[MKPolygon class]]){
        MKPolygon *polygon = (MKPolygon*) overlay;

        CGMutablePathRef mpr = CGPathCreateMutable();

        MKMapPoint *polygonPoints = polygon.points;

        for (int p=0; p < polygon.pointCount; p++){
            MKMapPoint mp = polygonPoints[p];
            if (p == 0)
                CGPathMoveToPoint(mpr, NULL, mp.x, mp.y);
            else
                CGPathAddLineToPoint(mpr, NULL, mp.x, mp.y);
        }

        if(CGPathContainsPoint(mpr , NULL, mapPointAsCGP, FALSE)){
            isInside = YES;
        }

        CGPathRelease(mpr);
    }
}

在正常情况下,它的效果很好,但是如果用户绘制多边形如下所示,即MKpolygon有一些相交的点,并且在某些区域填充了颜色,并在某些区域清除了颜色。

如果我通过MKPolygon内部的有色部分的latlong,则应该返回NO。但是,它返回YES。即if(CGPathContainsPoint(mpr , NULL, mapPointAsCGP, FALSE))为TRUE。

当MKPolygon之间有交集时,如何解决此问题?最好是有人建议在该透明颜色区域中填充颜色。任何建议将不胜感激。

最佳答案

显示的图片似乎显示了奇偶填充规则。通过将FALSE指定为CGPathContainsPoint的最终参数,您已要求它应用卷数规则。尝试传递TRUE

有关teo规则的信息,请参见Apple's Quartz documentation,尤其是“Filling a Path”(略少于一半)。

关于ios - 验证latlong是否在iOS中的MKPolygon中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26901116/

10-09 02:34