How to determine if an annotation is inside of MKPolygonView (iOS) How to determine if an annotation is inside of MKPolygonView (iOS) ios ios

How to determine if an annotation is inside of MKPolygonView (iOS)


The following converts the coordinate to a CGPoint in the polygon view and uses CGPathContainsPoint to test if that point is in the path (which may be non-rectangular):

CLLocationCoordinate2D mapCoordinate = ...; //user location or annot coordMKMapPoint mapPoint = MKMapPointForCoordinate(mapCoordinate);MKPolygonView *polygonView =     (MKPolygonView *)[mapView viewForOverlay:polygonOverlay];CGPoint polygonViewPoint = [polygonView pointForMapPoint:mapPoint];BOOL mapCoordinateIsInPolygon =     CGPathContainsPoint(polygonView.path, NULL, polygonViewPoint, NO);

This should work with any overlay view that is a subclass of MKOverlayPathView. You can actually replace MKPolygonView with MKOverlayPathView in the example.


Slightly modified above to do calculations for points/coordinates in polygons without the use of a MKMapView formatted as an extension to MKPolygon class:

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

Enjoy!