Prüfen, ob ein MKCircle getapped wurde (MKMapView)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Prüfen, ob ein MKCircle getapped wurde (MKMapView)

    Hi zusammen,
    Ich habe einen MKMapView mit mehreren MKCircles als Map Overlays. Die MKCircles haben einen Radius (in Metern), sowie eine Latitude/Longitude-Koordinate als Center-Punkt.
    Ich möchte nun prüfen, ob bei einem Tap auf die Map ein Circle ausgewählt wurde.

    Mein Ansatz: Ich berechne die Distanz zwischen dem Tap-Punkt auf der Map und dem Center-Punkt des MKCircles. Ist diese Distanz geringer als der Radius des MKCircles, muss der Tap innerhalb des MKCircles stattgefunden haben.

    Wenn ich jetzt diese Distanz mit dem Radius des MKCircles in Metern vergleiche, kommt selbstverständlich ein völlig falsches Ergebnis raus, weil die Einheiten nicht übereinstimmen.
    Die berechnete Distanz hat ja die Einheit der Karte (Längen-/Breitengrade, weiß nicht genau wie sich diese Einheit hier nennt), der Radius des Circles hat die Einheit Meter.
    Daher meine Frage: Wie bringe ich diese beiden Werte nun auf die selbe Einheit? Wie rechne ich diesen Circle Radius (der in Meter gespeichert wurde) ebenfalls in diese Längen-/Breitengrad Einheit um, sodass ich diese beiden Werte korrekt vergleichen kann?


    Hier mal mein Code, der bei einem Tap auf die Karte ausgeführt wird:

    C-Quellcode

    1. -(void)handleMapTap:(UIGestureRecognizer*)tap{
    2. CGPoint tapPoint = [tap locationInView:self.mapView];
    3. CLLocationCoordinate2D tapCoord = [self.mapView convertPoint:tapPoint toCoordinateFromView:self.mapView];
    4. CGPoint tapPointMap = CGPointMake(tapCoord.latitude, tapCoord.longitude);
    5. for (CustomCircle *circleOverlay in self.mapView.overlays) {
    6. if([circleOverlay isKindOfClass:[CustomCircle class]]){
    7. CGFloat lat = [circleOverlay.latitude floatValue];
    8. CGFloat longit = [circleOverlay.longitude floatValue];
    9. CGPoint circleCenterCGP = CGPointMake(lat, longit);
    10. CGFloat distance = DistanceBetweenTwoPoints(circleCenterCGP, tapPointMap);
    11. CGFloat circleRadius = circleOverlay.radius;
    12. if(distance < circleRadius){
    13. NSLog(@"Tapped Circle");
    14. }
    15. }
    16. }
    17. }
    18. CGFloat DistanceBetweenTwoPoints(CGPoint point1,CGPoint point2)
    19. {
    20. CGFloat dx = point2.x - point1.x;
    21. CGFloat dy = point2.y - point1.y;
    22. return sqrt(dx*dx + dy*dy );
    23. }
    Alles anzeigen


    Ich hoffe ich konnte mein Problem einigermaßen gut erklären. Arbeite leider zum ersten mal wirklich mit einem MapView. Sollte jemand eine bessere Lösung für mein ursprüngliches Problem haben, könnt Ihr das natürlich auch gern schreiben.

    Vielen Dank im Voraus! :)
  • Um die Distanz zwischen dem Mittelpunkt eines der Overlays und des angetippten Ortes zu berechnen, erstellst du aus der tapCoord aus Zeile 3 und der Mittelpunktkoordinate vom jeweiligen Overlay je eine CLLocation Instanz. Mit den beiden CLLocations kannst du dir dann mit der Methode distanceFromLocation(_:) den Abstand der beiden Punkte in Metern ausrechnen lassen.
  • Michael schrieb:

    Um die Distanz zwischen dem Mittelpunkt eines der Overlays und des angetippten Ortes zu berechnen, erstellst du aus der tapCoord aus Zeile 3 und der Mittelpunktkoordinate vom jeweiligen Overlay je eine CLLocation Instanz. Mit den beiden CLLocations kannst du dir dann mit der Methode distanceFromLocation(_:) den Abstand der beiden Punkte in Metern ausrechnen lassen.
    Genau so funktioniert es, klasse.
    Vielen Dank!