2010-04-16 35 views
16

ho latitudine e longitudine di un luogo particolare e voglio calcolare la distanza, quindi come posso calcolarlo?Come si calcola la distanza tra due punti di latitudine e longitudine?

+3

Non è possibile ottenere la distanza dalla latitudine e dalla longitudine. La distanza richiede due latitudini e longitudini. –

+1

Questo è stato l'argomento di alcune recenti domande su SO, dare un'occhiata in giro. –

+0

ho 2 latitudine e longitudine ... –

risposta

32
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1]; 
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:lat2 longitude:long2]; 
NSLog(@"Distance i meters: %f", [location1 distanceFromLocation:location2]); 
[location1 release]; 
[location2 release]; 

È inoltre necessario aggiungere CoreLocation.framework al progetto, e aggiungere l'istruzione import:

#import <CoreLocation/CoreLocation.h> 
5

questo potrebbe non essere il metodo più efficiente di farlo, ma funzionerà.

Le due posizioni specificate in latitudine e longitudine possono essere considerate vettori. Supponendo che le coordinate siano state convertite in coordinate di cartesione, calcola il prodotto punto dei due vettori.

v1 Dato = (x1, y1, z1) e v2 = (x2, y2, z2), quindi ...

v1 dot v2 = magnitude(v1) * magnitude(v2) * cos (theta) 

comoda, la grandezza di v2 v1 e sarà lo stesso .. il raggio della terra (R).

x1*x2 + y1*y2 + z1*z2 = R*R*cos(theta) 

Risolvere per theta.

theta = acos ((x1*x2 + y1*y2 + z1*z2)/(R * R)); 

Ora si ha un angolo tra i due vettori in radianti. La distanza betwen i due punti quando si viaggia attraverso la superficie della terra è così ...

distance = theta * R. 

Probabilmente c'è un modo più semplice per fare questo tutto nel contesto di coordinate sferiche, ma la mia matematica in quella zona è troppo fuzzy - da qui la conversione in coordinate cartesiane.

Per convertire le coordinate cartesiane ...

Let alfa essere la latitudine, e beta essere la longitudine.

x = R * cos (alpha) * cos (beta) 
y = R * sin (alpha) 
z = R * cos (alpha) * sin (beta) 

Non dimenticare che la funzione matematica si occupa in genere di radianti e l'accordo di latitudine/longitudine in gradi.

+3

Nota che questa è un'approssimazione, poiché la terra è più di uno sferoide oblato (è andato a forma di pera, per essere più preciso) e la sua superficie non è piana. – outis

+1

Vedere il sito Web 'proj.4' per una discussione dell'errore nell'utilizzo di un modello sferico (http://trac.osgeo.org/proj/wiki/GeodesicCalculations) per la terra. In conclusione, dicono che se scegli un buon valore per R, puoi raggiungere l'1% con questo approccio. – mtrw

+0

+1. Presumibilmente questa risposta potrebbe essere intitolata "Come calcolare un grande percorso circolare" (termine di navigazione nautica). ESCLUSIONE DI RESPONSABILITÀ: Ho zero possibilità di convalidare la matematica su questo. Invidio solo l'abilità che l'ha prodotto, e stimo la presentazione chiara. – Smandoli

1

Ho superato la matematica e ora posso semplificare notevolmente la soluzione.

Immaginate se giriamo la terra in modo che il nostro primo vettore sia a 0 gradi di latitudine e 0 gradi di longitudine. Il secondo vettore sarebbe a gradi (alfa2 - alfa1) e latitudine (beta2 - beta1).

Dal ...

sin(0) = 0 and cos(0) = 1 

nostri simplies prodotto punto a ...

cos(delta_alpha) * cos(delta_beta) = cos(theta) 

Il resto della matematica rimane invariato.

theta = acos (cos(delta_alpha) * cos(delta_beta)) 
distance = radius * theta 

Spero che questo aiuti.

Problemi correlati