我正在努力找出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)
注意:我知道我的解决方案依赖于假设区域/路径定义了足够的点,以便至少有一个点落入圆圈。
提前致谢,
干杯,帕维
答案 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);
}