2010-07-06 23 views
5

Ho bisogno di conoscere la distanza (in chilometri) dalla mappa centrale all'altro lato dello schermo, (e se lo zoom cambia la distanza cambierà).Calcolare il raggio in metri utilizzando mapkit

ho bisogno di implementare questa funzione in questa funzione

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

Tutte le idee come posso fare questo?

Grazie

risposta

17

MkMapView ha proprietà denominate centerCoordinate (CLLocationCoordinate2D) e regione (MKCoordinateRegion). Regione è una struttura che:

typedef struct { 
    CLLocationDegrees latitudeDelta; 
    CLLocationDegrees longitudeDelta; 
}MKCoordinateSpan 

Si dovrebbe essere in grado di creare un altro punto, sulla base di centerCoordinate, diciamo, con l'aggiunta di latitudeDelta a voi Latitude proprietà o centerCoordinate, e calcolare la distanza con il metodo di CLLocation:

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

Qualcosa di simile

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 

E solo calcolare ogni volta che un delegato spara un certo metodo (decidere quale è necessario: MKMapViewDelegate)

+0

Questa è una grande risposta. – sudo

+0

ottima risposta! molte grazie! – Andres

+3

'centerCoordinate.latitude + region.span.latitudeDelta' deve essere' centerCoordinate.latitude + region.span.latitudeDelta/2' per ottenere il raggio corretto. –

0

Poiché i rettangoli non sono cerchi, non è possibile ottenere un raggio.

Ma è ancora possibile ottenere la distanza più lontana dal centro di una regione. Riutilizzare la stessa idea di cui sopra ma incorporata in un'estensione rapida.

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() 
Problemi correlati