2010-12-04 21 views

cevap

37

şu çokgen görünümünde bir CGPoint koordine dönüştürür ve bu nokta, yolun ise (dikdörtgen-olmayan olabilir) test etmek için CGPathContainsPoint kullanır:

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

Bu, herhangi bir kaplaması ile çalışmalıdır Bu, MKOverlayPathView'ın bir alt sınıfıdır. Örnekte MKPolygonView'ı MKOverlayPathView ile değiştirebilirsiniz.

+1

Bu delikler (iç poligonlar) ile MKPolygons üzerinde çalışır mı? –

+7

@Greg Combs: Çokgen (veya kaplama yolu) deliklere sahipse, sorgulanan nokta bir delikte ise, CGPathContainsPoint NO döndürür. – Anna

+0

@AnnaKarenina - Bu harita nasıl belirlenir MKPolygon'lu bir senaryo içinCoordinateIsInPolygon değeri, ancak harita görünümü yok? (çünkü sahip olduğum tek şey koordinatlar kümesidir, fakat bir görüşe gerek yoktur) –

9

hafifçe puan için hesaplamaları yapmak için yukarıdaki modifiye/MKPolygon sınıfına bir uzantısı olarak biçimlendirilmiş bir MKMapView kullanmadan çokgen koordinatları:

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

tadını çıkarın!

+1

'[MKPolygonView initWithPolygon]', iOS 7'de kullanımdan kaldırılmıştır, ancak 'MKPolygonRenderer' ile değiştirilebilir. –

+0

Teşekkürler! IOS7 kodunu şimdi güncelledim. – capikaw

İlgili konular