Determinar si el punto de latitud / longitud está en un polígono MK dentro de Mapview?

En este momento, estoy tratando de averiguar si una coorderada en un MKMapView está dentro de un polígono MK dibujado antes de time con latitudes / longitudes.

Estoy usando CGPathContainsPoint para determinar si una coorderada está dentro del polígono en el map, pero siempre devuelve falso, independientemente de la coorderada que elija.

¿Alguien puede explicar qué va mal exactamente? A continuación se muestra mi código en Swift.

class ViewController: UIViewController, MKMapViewDelegate @IBOutlet weak var mapView: MKMapView! let initialLocation = CLLocation(latitude: 43.656734, longitude: -79.381576) let point = CGPointMake(43.656734, -79.381576) let regionRadius: CLLocationDistance = 500 let point1 = CLLocationCoordinate2D(latitude: 43.656734, longitude: -79.381576) var points = [CLLocationCoordinate2DMake(43.655782, -79.382094), CLLocationCoordinate2DMake(43.657499, -79.382310), CLLocationCoordinate2DMake(43.656656, -79.380497), CLLocationCoordinate2DMake(43.655782, -79.382094)] override func viewDidLoad() { super.viewDidLoad() centerMapOnLocation(initialLocation) let polygon = MKPolygon(coordinates: &points, count: points.count) mapView.addOverlay(polygon) var annotation = MKPointAnnotation() annotation.coordinate = point1 annotation.title = "Test" annotation.subtitle = "Test" mapView.addAnnotation(annotation) self.mapView.delegate = self } func centerMapOnLocation(location: CLLocation) { let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, regionRadius * 2.0, regionRadius * 2.0) mapView.setRegion(coordinateRegion, animated: true) } func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { if overlay is MKPolygon { let polygonView = MKPolygonRenderer(overlay: overlay) polygonView.strokeColor = UIColor.networkingColor() if CGPathContainsPoint(polygonView.path, nil, CGPointMake(43.656734, -79.381576), true) { print("True!!!!!") } else { println("False") } return polygonView } return nil } 

Está confundiendo CGPoints, que son pares de coorderadas x e y que apuntan a una location en su vista, con CLLocationCoordinate2Ds, que son coorderadas en la Tierra.

Para CGPathContainsPoint, desea pasar su ruta polygonRenderer (creada desde su polígono en viewDidLoad ()) y la location actual como esta:

 let polygonRenderer = MKPolygonRenderer(polygon: polygon) let currentMapPoint: MKMapPoint = MKMapPointForCoordinate(locationManager.location?.coordinate) let polygonViewPoint: CGPoint = polygonRenderer.pointForMapPoint(currentMapPoint) if CGPathContainsPoint(polygonRenderer.path, nil, polygonViewPoint, true) { print("Your location was inside your polygon.") } 

Entonces, usted quiere pensar dónde debería colocar este código, ya que donde lo tiene actualmente está dentro de la function que recibe la llamada cada vez que se dibuja un MKOverlay en la pantalla, y eso no está relacionado con esto.

Actualizado para Swift 3

 let polygonRenderer = MKPolygonRenderer(polygon: polygon) let mapPoint: MKMapPoint = MKMapPointForCoordinate(coordinate) let polygonViewPoint: CGPoint = polygonRenderer.point(for: mapPoint) if polygonRenderer.path.contains(polygonViewPoint) { print("Your location was inside your polygon.") }