如何确定一个注释是否在MKPolygonView(iOS)内部

28
我正在尝试计算特定注释(比如用户位置的蓝色圆圈)或MKPinAnnotation是否在地图视图上的MKPolygon图层内。
有什么建议实现这个功能吗?
2个回答

39
以下代码将坐标转换为多边形视图中的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);

这应该适用于任何 MKOverlayPathView 的子类浮层视图。 你实际上可以在示例中替换 MKPolygonView 为 MKOverlayPathView。


1
这对于带有洞(内多边形)的MKPolygons有效吗? - Greg Combs
7
如果多边形(或叠加路径)有洞,CGPathContainsPoint将返回NO,如果查询的点在洞中。 - user467105
2
在当前的iOS 7版本中,path属性似乎会错误地返回NULL,导致上述方法失败。有一个解决方法,请参见https://dev59.com/Y2Mk5IYBdhLWcg3wvAVo。 - user467105
IOS7有没有解决这个问题的方案? - Jagdev Sendhav
@UserDev,请查看上面以“在当前版本的iOS 7中...”开头的评论。它提供了一个解决方法的链接。 - user467105
显示剩余4条评论

9
稍作修改后,可以在不使用格式化为MKMapView的情况下对多边形中的点/坐标进行计算,这是作为MKPolygon类的扩展实现的:
//MKPolygon+PointInPolygon.h

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

@interface MKPolygon (PointInPolygon)

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

@end

//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

享受吧!


1
[MKPolygonView initWithPolygon]在iOS 7中已经被弃用,但可以使用MKPolygonRenderer来替代它。 - Trasplazio Garzuglio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接