2016-11-09 2 views
0

Ich habe ein MapView mit < 5 Annotationen. Wenn die Karte geladen wird, möchte ich zoomen, um die Karte auf diese Anmerkungen zu zentrieren, z. B. this. Die verknüpfte Methode funktioniert jedoch nicht, wenn die Anmerkungen über den 180. Meridian verteilt sind (wobei der Längengrad zwischen -180 und +180 liegt). Wie kann ich robust auf die Annotationen zoomen, selbst wenn sie um den Nullmeridian gruppiert sind?Zoom MapView zum Anzeigen von Annotationen über den 180. Meridian

Zum Beispiel, wenn ich x haben (0179) und y (0, -179), dann würde ich einen enthält rect mit einer Breite von zwei Grad Länge wollen, nicht 358.

Antwort

0

MapKit für iOS tatsächlich hat eine eingebaute Funktion in MKMapView, die dies tut:

showAnnotations(annotations: [MKAnnotation], animated: Bool) 

Allerdings ist diese Funktion nicht die Kontrolle über die Zoomstufe bieten, so hatte ich noch meine eigene Funktion zu machen. Hier ist der Pseudo-Code:

zoomToAnnotations(annotations, zoomLimit) { 
    // calculate the midpoint as the average latitude and longitude 
    average_latitude = mean(a.coordinate.latitude for a in annotations) 
    average_longitude = atan2(mean(sin(a.coordinate.longitude) for a in annotations), mean(cos(a.coordinate.longitude) for a in annotations)) // be careful with degrees and radians in real code 
    regular_midpoint = coordinate(average_latitude, average_longitude) 
    // subtract 180 from longitude for the midpoint of the region crossing the meridian 
    meridian_midpoint = coordinate(average_latitude, average_longitude - 180.0) 
    if (meridian_midpoint.longitude < -180) { 
     meridian_midpoint.longitude += 360.0 
    } 

    // work out which region will be smaller and center map there 
    meridian_sum = sum(a.coordinate.distance(meridian_midpoint) for a in annotations) 
    regular_sum = sum(a.coordinate.distance(regular_midpoint) for a in annotations) 
    regular_max_distance = max(a.coordinate.distance(regular_midpoint) for a in annotations) 
    if meridian_sum < regular_sum { 
     meridian_max_distance = max(a.coordinate.distance(meridian_midpoint) for a in annotations) 
     centerMapWithRadius(meridian_midpoint, max(zoomLimit, meridian_max_distance)) 
    } else { 
     regular_max_distance = max(a.coordinate.distance(regular_midpoint) for a in annotations) 
     centerMapWithRadius(regular_midpoint, max(zoomLimit, regular_max_distance)) 
    } 
} 

Diese Methode ist nicht perfekt, da es auf dem Mittelwert der Punkte zentriert anstelle den weitesten Punkten gleiche Abstände von der Kante aufweist.

Verwandte Themen