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!