26

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

有什么建议可以实现这一目标吗?

4

2 回答 2

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);

这应该适用于任何作为 MKOverlayPathView 子类的覆盖视图。在示例中,您实际上可以将 MKPolygonView 替换为 MKOverlayPathView。

于 2010-12-04T15:29:06.177 回答
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

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

享受!

于 2013-07-18T19:22:55.903 回答