2010-12-04 25 views

Respuesta

37

El siguiente convierte la coordenada a un CGPoint en la vista de polígono y utiliza CGPathContainsPoint para probar si ese punto está en la ruta de acceso (que puede ser no rectangular):

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

Esto debería funcionar con cualquier superposición ver que es una subclase de MKOverlayPathView. En realidad, puede reemplazar MKPolygonView con MKOverlayPathView en el ejemplo.

+1

¿Funcionaría esto en MKPolygons con agujeros (polígonos internos)? –

+7

@Greg Combs: si el polígono (o ruta de superposición) tiene agujeros, CGPathContainsPoint devolverá NO si el punto consultado está en un agujero. – Anna

+0

@AnnaKarenina: cómo determinar este mismo mapCoordinateIsInPolygon value para un escenario con MKPolygon pero no map view? (porque todo lo que tengo es un conjunto de coordenadas, pero no se necesita una vista) –

9

modificado ligeramente por encima de hacer cálculos para puntos/coordenadas en polígonos sin el uso de un MKMapView formateado como una extensión de la clase 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 

disfrutar!

+1

'[MKPolygonView initWithPolygon]' está en desuso en iOS 7 pero se puede reemplazar por 'MKPolygonRenderer'. –

+0

¡Gracias! Actualicé el código para iOS7 ahora. – capikaw

Cuestiones relacionadas