2010-04-16 13 views
16

Mam szerokość i długość geograficzną konkretnego miejsca i chcę obliczyć odległość, więc jak mogę to obliczyć?Jak obliczyć odległość między dwoma punktami szerokości i długości geograficznej?

+3

Nie można uzyskać odległości od szerokości i długości geograficznej. Odległość wymaga dwóch szerokości i długości. –

+1

To był temat kilku ostatnich pytań SO, rozejrzyj się. –

+0

Mam 2 szerokości i długości geograficznej ... –

Odpowiedz

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]; 

Trzeba także dodać CoreLocation.framework do projektu i dodaj instrukcję import:

#import <CoreLocation/CoreLocation.h> 
5

To może nie być najbardziej skuteczny sposób to robić, ale to będzie działać.

Twoje dwie lokalizacje określone przez długość i szerokość geograficzną mogą być uważane za wektory. Zakładając, że współrzędne zostały zamienione na współrzędne kartezjańskie, obliczyć iloczyn punktowy dwóch wektorów.

Biorąc v1 = (x1, y1, z1) i v2 = (x2, y2, z2), a następnie ...

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

Wygodnie, wielkość V1 i V2 będzie taki sam .. Promień Ziemi (R).

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

Rozwiąż dla theta.

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

Teraz masz kąt między dwoma wektorami w radianach. Odległość między obu tymi punktami podczas podróży po powierzchni ziemi jest więc ...

distance = theta * R. 

Nie ma chyba łatwiejszy sposób to zrobić wyłącznie w kontekście współrzędnych sferycznych, ale moja matematyka w tym obszarze jest zbyt rozmyte - stąd zamiana na współrzędne kartezjańskie.

Aby przekonwertować do współrzędnych kartezjańskich ...

Let alfa jest szerokość i długość geograficzna beta być.

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

Nie zapominaj, że funkcja matematyczna zazwyczaj zajmuje się radianami, a szerokość/długość geograficzna dotyczą stopni.

+3

Zauważ, że jest to przybliżenie, ponieważ Ziemia jest bardziej spłaszczona (ma teraz kształt gruszki, aby była dokładniejsza), a jej powierzchnia nie jest płaska. – outis

+1

Zobacz stronę "proj.4", aby omówić błąd w używaniu modelu sferycznego (http://trac.osgeo.org/proj/wiki/GeodesicCalculations) dla Ziemi. Podsumowując, mówią, że jeśli wybierzesz dobrą wartość dla R, możesz osiągnąć 1% z takim podejściem. – mtrw

+0

+1. Można przypuszczać, że ta odpowiedź może brzmieć "Jak obliczyć wielką trasę" (morski termin nawigacji). UPVOTE DISCLAIMER: Mam zerową zdolność do sprawdzania matematyki na ten temat. Po prostu zazdroszczę zdolności, która to stworzyła i cenię sobie jasną prezentację. – Smandoli

1

Przeszedłem przez matematykę i mogę teraz znacznie uprościć rozwiązanie.

Wyobraź sobie, że obracamy ziemię, aby nasz pierwszy wektor miał 0 stopni szerokości i 0 stopni długości geograficznej. Drugi wektor będzie miał szerokość (alpha2 - alpha1) i szerokość (beta2 - beta1).

Od ...

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

nasze simplies iloczynu skalarnego do ...

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

Reszta matematyki pozostaje niezmieniona.

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

Mam nadzieję, że to pomoże.