如何确定注释是否在MKPolygonView(iOS)中

Mat*_*Mat 26 mkmapview ios mkpolygonview

我正在尝试计算特定注释(如用户位置的蓝色圆圈)或MKPinAnnotation是否在mapview上的MKPolygon图层内.

有什么建议来实现这个目标

小智 38

下面将坐标转换为多边形视图中的CGPoint,并使用CGPathContainsPoint测试该点是否在路径中(可能是非矩形):

CLLocationCoordinate2D mapCoordinate = ...; //user location or annot coord

MKMapPoint mapPoint = MKMapPointForCoordinate(mapCoordinate);

MKPolygonView *polygonView = 
    (MKPolygonView *)[mapView viewForOverlay:polygonOverlay];

CGPoint polygonViewPoint = [polygonView pointForMapPoint:mapPoint];

BOOL mapCoordinateIsInPolygon = 
    CGPathContainsPoint(polygonView.path, NULL, polygonViewPoint, NO);
Run Code Online (Sandbox Code Playgroud)

这应该适用于作为MKOverlayPathView的子类的任何叠加视图.实际上,您可以使用MKOverlayPathView替换MKPolygonView.

  • @Greg Combs:如果多边形(或覆盖路径)有洞,如果查询的点在一个洞中,CGPathContainsPoint将返回NO. (7认同)
  • 在当前版本的iOS 7中,`path`属性似乎错误地返回NULL,导致上述方法失败.有关解决方法,请参阅http://stackoverflow.com/questions/19014926/detecting-a-point-in-a-mkpolygon-broke-with-ios7-cgpathcontainspoint. (2认同)

cap*_*kaw 9

稍微修改上面的方法来计算多边形中的点/坐标,而不使用格式化为MKPolygon类的扩展的MKMapView:

//MKPolygon+PointInPolygon.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MKPolygon (PointInPolygon)

-(BOOL)coordInPolygon:(CLLocationCoordinate2D)coord;
-(BOOL)pointInPolygon:(MKMapPoint)point;

@end
Run Code Online (Sandbox Code Playgroud)
//MKPolygon+PointInPolygon.m

#import "MKPolygon+PointInPolygon.h"

@implementation MKPolygon (PointInPolygon)

-(BOOL)coordInPolygon:(CLLocationCoordinate2D)coord {

    MKMapPoint mapPoint = MKMapPointForCoordinate(coord);
    return [self pointInPolygon:mapPoint];
}

-(BOOL)pointInPolygon:(MKMapPoint)mapPoint {

    MKPolygonRenderer *polygonRenderer = [[MKPolygonRenderer alloc] initWithPolygon:self];
    CGPoint polygonViewPoint = [polygonRenderer pointForMapPoint:mapPoint];
    return CGPathContainsPoint(polygonRenderer.path, NULL, polygonViewPoint, NO);
}

@end
Run Code Online (Sandbox Code Playgroud)

请享用!