2015-08-21 8 views
5

W tym momencie próbuję dowiedzieć się, czy współrzędne na MKMapView jest w MKPolygon sporządzony z wyprzedzeniem z szerokości/długości.Określanie, czy punkt szerokości/długości geograficznej znajduje się w obszarze MKPolygon w widoku mapy?

Używam CGPathContainsPoint do określenia, czy współrzędne znajdują się w wielokącie na mapie, ale zawsze zwraca wartość false, niezależnie od wybranej współrzędnej.

Czy ktoś może wyjaśnić, co dokładnie dzieje się nie tak? Poniżej znajduje się mój kod w 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

hej nie używać "false" (aby uzyskać ścieżkę likwidacji stylu) .. ostatni argument CGPathContainsPoint. – Fattie

+0

Próbowałem zarówno prawda i fałsz, ale bez skutku. :( –

Odpowiedz

3

Jesteś mylące CGPoints, będące x i y par współrzędnych tego punktu do miejsca na widoku, z CLLocationCoordinate2Ds, które są współrzędnymi na Ziemi.

Dla CGPathContainsPoint, chcesz przejść na swojej drodze polygonRenderer (utworzony z poligonu w viewDidLoad()) i bieżącej lokalizacji tak:

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

więc warto pomyśleć o tym, gdzie powinien być wprowadzenie tego kod, tak jak tam, gdzie aktualnie go masz, znajduje się wewnątrz funkcji, która jest wywoływana za każdym razem, gdy MKOverlay zostanie narysowany na ekranie, a to jest całkowicie niezwiązane z tym.

2

Aktualizacja dla 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.") 
} 
Powiązane problemy