2010-07-06 16 views
5

Necesito saber la distancia (en kilómetros) desde el mapa central al otro lado de la pantalla, (y si el zoom cambia la distancia cambiará).Calcular el radio en metros usando mapkit

necesito para implementar esta característica en esta función

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

Alguna idea de cómo puedo hacer esto?

Gracias

Respuesta

17

MKMapView tiene propiedades denominadas centerCoordinate (CLLocationCoordinate2D) y la región (MKCoordinateRegion). Región es una estructura que:

typedef struct { 
    CLLocationDegrees latitudeDelta; 
    CLLocationDegrees longitudeDelta; 
}MKCoordinateSpan 

Usted debe ser capaz de crear otro punto, basado en centerCoordinate, digamos, mediante la adición de latitudeDelta a que la latitud propiedad o centerCoordinate, y calcular la distancia utilizando el método de CLLocation:

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

Algo como esto

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 

Y justo calcular cada vez que un delegado dispara un determinado método (decidir qué se necesita: MKMapViewDelegate)

+0

Esta es una gran respuesta. – sudo

+0

¡excelente respuesta! ¡muchas gracias! – Andres

+3

'centerCoordinate.latitude + region.span.latitudeDelta' tiene que ser' centerCoordinate.latitude + region.span.latitudeDelta/2' para obtener el radio correcto. –

0

Como los rectángulos no son círculos, no se puede obtener un radio.

Pero aún puede obtener la distancia más alejada del centro de una región. Reutilizando la misma idea que la anterior pero embebida en una extensión rápida.

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

Uso

let radius = mapView.region.distanceMax() 
Cuestiones relacionadas