2010-07-06 13 views
5

Ich muss die Entfernung (in Kilometern) von der Mitte Karte auf der anderen Seite des Bildschirms wissen, (und wenn der Zoom ändert sich die Entfernung ändern).Berechnen Sie den Radius in Metern mit Mapkit

Ich brauche diese Funktion in dieser Funktion

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{ 
} 

Irgendwelche Ideen umzusetzen, wie ich dies tun kann?

Dank

Antwort

17

MKMapView hat Eigenschaften genannt centerCoordinate (CLLocationCoordinate2D) und Umgebung (MKCoordinateRegion). Region ist eine Struktur, die:

typedef struct { 
    CLLocationDegrees latitudeDelta; 
    CLLocationDegrees longitudeDelta; 
}MKCoordinateSpan 

Sie sollten in der Lage sein, einen anderen Punkt zu erstellen, basierend auf centerCoordinate, sagen wir mal, durch Zugabe von latitudeDelta Sie Breiten- Eigentum oder centerCoordinate und berechnen Entfernung mit der Methode der CLLocation:

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location 

So etwas wie diese

MkMapView * mapView; // init somewhere 
MKCoordinateRegion region = mapView.region; 
CLLocationCoordinate2D centerCoordinate = mapView.centerCoordinate; 
CLLocation * newLocation = [[[CLLocation alloc] initWithLatitude:centerCoordinate.latitude+region.span.latitudeDelta longitude:centerCoordinate.longitude] autorelease]; 
CLLocation * centerLocation = [[[CLLocation alloc] initWithLatitude:centerCoordinate.latitude:longitude:centerCoordinate.longitude] autorelease]; 
CLLocationDistance distance = [centerLocation distanceFromLocation:newLocation]; // in meters 

Und berechnen nur jedes Mal, wenn ein Delegierter eine bestimmte Methode feuert (entscheiden, die Sie brauchen: MKMapViewDelegate)

+0

Dies ist eine großartige Antwort. – sudo

+0

große Antwort! Danke vielmals! – Andres

+3

'centerCoordinate.latitude + region.span.latitudeDelta' muss' centerCoordinate.latitude + region.span.latitudeDelta/2' sein, um den richtigen Radius zu erhalten. –

0

Da Rechtecke keine Kreise sind, können Sie keinen Radius erhalten.

Aber Sie können immer noch die weiteste Entfernung vom Zentrum einer Region bekommen. Wiederverwenden der gleichen Idee wie oben, aber eingebettet in eine schnelle Erweiterung.

extension MKCoordinateRegion { 
    func distanceMax() -> CLLocationDistance { 
     let furthest = CLLocation(latitude: center.latitude + (span.latitudeDelta/2), 
          longitude: center.longitude + (span.longitudeDelta/2)) 
     let centerLoc = CLLocation(latitude: center.latitude, longitude: center.longitude) 
     return centerLoc.distanceFromLocation(furthest) 
    } 
} 

Nutzungs

let radius = mapView.region.distanceMax() 
Verwandte Themen