Domanda

Sto cercando di calcolare se un'annotazione specifica (come il cerchio blu della posizione dell'utente) o un MKPinAnnotation è all'interno di uno strato MKPolygon sul mapview.

Qualche consiglio per raggiungere questo obiettivo?

È stato utile?

Soluzione

I seguenti converte le coordinate di un CGPoint nella vista poligono e utilizza CGPathContainsPoint di prova se quel punto nel percorso (che può essere non rettangolare):

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

Questo dovrebbe funzionare con qualsiasi vista di sovrapposizione che è una sottoclasse di MKOverlayPathView. Si può effettivamente sostituire MKPolygonView con MKOverlayPathView nell'esempio.

Altri suggerimenti

leggermente modificati in alto per fare calcoli per punti / coordinate poligoni senza l'uso di un MKMapView formattato come un'estensione classe 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

Enjoy!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top