Come determinare se un'annotazione è dentro di MKPolygonView (iOS)
-
08-10-2019 - |
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?
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!