Как определить, находится ли аннотация внутри MKPolygonView (iOS) - PullRequest
26 голосов
/ 04 декабря 2010

Я пытаюсь вычислить, находится ли конкретная аннотация (например, синий круг в пользовательском местоположении) или MKPinAnnotation внутри слоя MKPolygon на карте.

Какой-нибудь совет, чтобы достигнуть этого?

Ответы [ 2 ]

37 голосов
/ 04 декабря 2010

Следующее преобразует координату в CGPoint в представлении многоугольника и использует CGPathContainsPoint для проверки, находится ли эта точка в пути (которая может быть не прямоугольной):

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

Это должно работать спредставление наложения, которое является подклассом MKOverlayPathView.Вы можете фактически заменить MKPolygonView на MKOverlayPathView в этом примере.

9 голосов
/ 18 июля 2013

Немного изменено выше, чтобы выполнять вычисления для точек / координат в многоугольниках без использования MKMapView, отформатированного как расширение класса 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

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...