2015-08-21 21 views
5

In diesem Moment versuche ich herauszufinden, ob eine Koordinate auf einem MKMapView innerhalb eines MKPolygon ist, das vorher mit Breiten-/Längengraden gezeichnet wurde.Bestimmen, ob sich der Breiten-/Längengrad in MapView in einem MKPolygon befindet?

Ich benutze CGPathContainsPoint, um zu bestimmen, ob eine Koordinate innerhalb des Polygons auf der Karte ist, aber es gibt immer falsch zurück, unabhängig von der Koordinate, die ich auswähle.

Kann mir bitte jemand erklären, was genau falsch läuft? Unten ist mein Code 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 würden Sie nicht "false" verwenden (den Wickel Stil Pfad zu bekommen) .. letztes Argument zu CGPathContainsPoint. – Fattie

+0

Ich habe versucht sowohl wahr als auch falsch, aber ohne Erfolg. :( –

Antwort

3

Sie sind verwirrend CGPoints, die x und y-Paare, die Koordinatenpunkt zu einer Stelle auf dem Ansicht, mit CLLocationCoordinate2Ds, die Koordinaten auf der Erde.

Für CGPathContainsPoint, die Sie wünschen und aktuellen Standort wie dies in Ihrem polygonRenderer Weg passieren (von Ihrem Polygon in viewDidLoad() erstellt wurde):

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

So Sie, wo denken wollen über Sie dies werden setzen sollten Code, wie Sie ihn gerade haben, befindet sich in der Funktion, die immer dann aufgerufen wird, wenn ein MKOverlay auf dem Bildschirm gezeichnet wird, und das ist völlig unabhängig davon.

2

Aktualisiert für 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.") 
}