检查地图上的某个点是否位于叠加层内

时间:2011-07-01 07:44:59

标签: ios mkmapview mkoverlay

我正在努力找出MKPolygon是否与MKCircle相交。

这是我的情况:我有一张地图填充了地图。现在,用户可以在地图上设置一个引脚,从那里我以引脚的位置为中心绘制MKCircle。现在我想知道这个圆圈是否与地图上已有的某个区域重叠。

我的想法是使用CGPathContainsPoint方法检查多边形的每个点是否位于圆圈内。

这是我的代码:

//the circle for the location filter
    MKCircleView *circleView = (MKCircleView *)[map viewForOverlay:self.sfvc.pinCircle];


//loop all regions
for (MKPolygon *region in regions){

    BOOL mapCoordinateIsInPolygon = FALSE;

    //loop all point of this region
    for (int i = 0; i < region.pointCount; i++) {
       MKMapPoint point = region.points[i];
       CGPoint circleViewPoint = [circleView pointForMapPoint:point];
       mapCoordinateIsInPolygon = CGPathContainsPoint(circleView.path, NULL, circleViewPoint, NO);
    }

    if (mapCoordinateIsInPolygon) {
        NSLog(@"YES! At least one point of the poly lies within the circle");
    }

}

不幸的是,我得到了不可预知的结果 - 这没有任何意义。知道我做错了什么吗?还有另一种方法可以做我想要的吗?

我的代码部分来自How to determine if an annotation is inside of MKPolygonView (iOS)

注意:我知道我的解决方案依赖于假设区域/路径定义了足够的点,以便至少有一个点落入圆圈。

提前致谢,

干杯,帕维

2 个答案:

答案 0 :(得分:3)

好吧,我终于明白了。上面的代码应该按原样工作,除了循环中缺少break语句。代码as仅返回poly的最后一个检查点。将测试插入mapCoordinateIsInPolygon,然后在内部循环中插入break语句,一旦第一个测试为正,就会离开循环,从而得到正确的结果。 ; - )

答案 1 :(得分:0)

CLLocationCoordinate2D newCoord ;
            newCoord.latitude = [[firDict objectForKey:@"Latitude"] floatValue];
            newCoord.longitude = [[firDict objectForKey:@"Longitude"] floatValue];

            [self pointInsideOverlay:newCoord MyOverlay:Curoverlay];

-(void)pointInsideOverlay:(CLLocationCoordinate2D )tapPoint MyOverlay:(id <MKOverlay>)overlay
{
    isInside = FALSE;
    MKMapPoint mapPoint = MKMapPointForCoordinate(tapPoint);
    CGMutablePathRef mpr = CGPathCreateMutable();
    MKMapPoint *polygonPoints = myPolygon.points;
    for (int p=0; p < myPolygon.pointCount; p++)
    {
        MKMapPoint mp = polygonPoints[p];
        if (p == 0)
            CGPathMoveToPoint(mpr, NULL, mp.x, mp.y);
        else
            CGPathAddLineToPoint(mpr, NULL, mp.x, mp.y);
    }

    CGPoint mapPointAsCGP = CGPointMake(mapPoint.x, mapPoint.y);
    BOOL pointIsInPolygon = CGPathContainsPoint(mpr, NULL, mapPointAsCGP, FALSE);
    if (pointIsInPolygon)
    {
        isInside = TRUE;
    }

    CGPathRelease(mpr);
}