问题描述
我希望能够判断tap是否在MKPolygon中。
I want to be able to tell if tap is within a MKPolygon.
我有一个MKPolygon:
I have a MKPolygon:
CLLocationCoordinate2D points[4];
points[0] = CLLocationCoordinate2DMake(41.000512, -109.050116);
points[1] = CLLocationCoordinate2DMake(41.002371, -102.052066);
points[2] = CLLocationCoordinate2DMake(36.993076, -102.041981);
points[3] = CLLocationCoordinate2DMake(36.99892, -109.045267);
MKPolygon* poly = [MKPolygon polygonWithCoordinates:points count:4];
[self.mapView addOverlay:poly];
//create UIGestureRecognizer to detect a tap
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(foundTap:)];
tapRecognizer.numberOfTapsRequired = 1;
tapRecognizer.numberOfTouchesRequired = 1;
[self.mapView addGestureRecognizer:tapRecognizer];
它只是科罗拉多州的基本轮廓。
its just a basic outline of the state Colorado.
我点击了转/长转换设置:
I got the tap to lat/long conversion set up:
-(IBAction)foundTap:(UITapGestureRecognizer *)recognizer
{
CGPoint point = [recognizer locationInView:self.mapView];
CLLocationCoordinate2D tapPoint = [self.mapView convertPoint:point toCoordinateFromView:self.view];
}
但如果我的分接点在MKPolygon内,我不确定如何技术。似乎没有办法做这个检查,所以我猜我需要将MKPolygon转换为CGRect并使用CGRectContainsPoint。
but i am unsure how to tech if my tap point is within the MKPolygon. there does not seem to be a method to do this check, so i'm guessing i need to convert the MKPolygon to a CGRect and use CGRectContainsPoint.
MKPolygon有一个.points属性,但我似乎无法让它们退出。
MKPolygon has a .points property but i can't seem to get them back out.
有什么建议吗?
编辑:
以下两种解决方案均适用于iOS 6或更低版本,但在iOS 7中有效。在iOS 7中, polygon.path
属性全部返回 NULL
。安娜女士非常友好地提供。它涉及从多边形点创建自己的路径以传递到 CGPathContainsPoint()
。
Both solutions below work in iOS 6 or lower, but breaks in iOS 7. In iOS 7 the polygon.path
property allways returns NULL
. Ms Anna was kind enough to provide a solution in another SO question here. It involves creating your own path from the polygon points to pass into CGPathContainsPoint()
.
我的多边形的图像:
推荐答案
我创建了这个MKPolygon类别,以防有人想要使用它。似乎运作良好。您必须考虑内部多边形(即多边形中的孔):
I created this MKPolygon category in case anyone wants to use it. Seems to work well. You have to account for the interior polygons (i.e. holes in the polygon):
@interface MKPolygon (PointInPolygon)
-(BOOL) pointInPolygon:(CLLocationCoordinate2D) point mapView: (MKMapView*) mapView;
@end
@implementation MKPolygon (PointInPolygon)
-(BOOL) pointInPolygon:(CLLocationCoordinate2D) point mapView: (MKMapView*) mapView {
MKMapPoint mapPoint = MKMapPointForCoordinate(point);
MKPolygonView * polygonView = (MKPolygonView*)[mapView viewForOverlay:self];
CGPoint polygonViewPoint = [polygonView pointForMapPoint:mapPoint];
return CGPathContainsPoint(polygonView.path, NULL, polygonViewPoint, NO) &&
![self pointInInteriorPolygons:point mapView:mapView];
}
-(BOOL) pointInInteriorPolygons:(CLLocationCoordinate2D) point mapView: (MKMapView*) mapView {
return [self pointInInteriorPolygonIndex:0 point:point mapView:mapView];
}
-(BOOL) pointInInteriorPolygonIndex:(int) index point:(CLLocationCoordinate2D) point mapView: (MKMapView*) mapView {
if(index >= [self.interiorPolygons count])
return NO;
return [[self.interiorPolygons objectAtIndex:index] pointInPolygon:point mapView:mapView] || [self pointInInteriorPolygonIndex:(index+1) point:point mapView:mapView];
}
@end
这篇关于检测点是否在MKPolygon叠加层内的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!