2015-08-21 9 views
5

In questo momento, sto cercando di capire se una coordinata su un MKMapView è all'interno di un MKPolygon disegnato in anticipo con latitudini/longitudini.Determinare se Latitude/Longitude Point si trova in un MKPolygon all'interno di Mapview?

Sto utilizzando CGPathContainsPoint per determinare se una coordinata si trova all'interno del poligono sulla mappa ma restituisce sempre false indipendentemente dalla coordinata che scelgo.

Qualcuno può spiegare, per favore, esattamente cosa sta andando storto? Di seguito è riportato il mio codice in 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.redColor() 

      if CGPathContainsPoint(polygonView.path, nil, CGPointMake(43.656734, -79.381576), true) { 
       print("True!!!!!") 
      } else { 
       println("False") 
      } 

      return polygonView 
     } 
     return nil 
    } 
+0

hey non vuoi usare "false" (per ottenere il percorso in stile avvolgimento) .. ultimo argomento CGPathContainsPoint. – Fattie

+0

Ho provato sia vero che falso ma inutilmente. :( –

risposta

3

Sei CGPoints confusione, che sono xey coppie di coordinate che indicano una posizione sul immagine, con CLLocationCoordinate2Ds, che sono coordinate sulla Terra.

Per CGPathContainsPoint, si desidera passare nel percorso polygonRenderer (creato dal poligono nel viewDidLoad()) e la posizione corrente come questo:

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.") 
} 

Così si vuole pensare a dove si dovrebbe mettere questo codice, come nel caso in cui lo hai attualmente, è all'interno della funzione che viene chiamata ogni volta che un MKOverlay viene disegnato sullo schermo, e questo è completamente estraneo a questo.

2

aggiornato per 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.") 
} 
Problemi correlati