2010-12-04 2 views

Antwort

37

Nachfolgend wandelt die zu einer CGPoint im Polygon Ansicht Koordinate und verwendet CGPathContainsPoint zu testen, ob dieser Punkt in dem Pfad ist (was nicht rechteckig sein kann):

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

mit jeder Überlagerung arbeitet Dies soll Ansicht, die eine Unterklasse von MKOverlayPathView ist. Im Beispiel können Sie MKPolygonView durch MKOverlayPathView ersetzen.

+1

Funktioniert das auf MKPolygons mit Löchern (interne Polygone)? –

+7

@Greg Combs: Wenn das Polygon (oder der Overlay-Pfad) Löcher aufweist, gibt CGPathContainsPoint NO zurück, wenn sich der abgefragte Punkt in einem Loch befindet. – Anna

+0

@AnnaKarenina - Wie kann man denselben mapCoordinateIsInPolygon-Wert für ein Szenario mit MKPolygon ermitteln, aber keine Kartenansicht? (weil alles, was ich habe, ist eine Menge von Koordinaten, aber keine Notwendigkeit für eine Ansicht) –

9

Etwas oberhalb modifizierte Berechnungen für die Punkte zu tun/Koordinaten in Polygone ohne die Verwendung eines MKMapView als Erweiterung MKPolygon Klasse formatiert:

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

Viel Spaß!

+1

'[MKPolygonView initWithPolygon]' ist in iOS 7 veraltet, kann aber durch 'MKPolygonRenderer' ersetzt werden. –

+0

Danke! Ich habe den Code für iOS7 jetzt aktualisiert. – capikaw