2013-04-08 25 views
5

Szukam gładkiego sposobu na obliczenie odległości między dwoma punktami GPS, więc otrzymuję wynik w stylu: "Musisz iść x metry w górę i y metrów w lewo - dzięki czemu mogę pracować z układem współrzędnych 2d, gdzie mam swoją pozycję jako (0,0), a pozostałe pozycje pokazują odległość w (x, y) w metrach od mojej pozycjiOblicz odległość w (x, y) między dwoma punktami GPS

Mój pomysł był aby obliczyć odległość między punktami za pomocą wzoru haversine. (ta zwraca moją przeciwprostokątną)

Poza tym, jestem obliczania łożysko pomiędzy tych dwóch punktów. to jest moja alfa.

Przy tych dwóch wartościach chciałem użyć podstawowych funkcji trygonometrycznych, aby rozwiązać mój problem.

Więc próbowałem obliczyć: catheti_1 = sin(alpha) * hypotenuse, catheti_2 = cos(alpha) * hypotenuse.

Może robię coś złego, ale moje wyniki są w tej chwili bezużyteczne.

Moje pytanie brzmi: Jak obliczyć odległość w kierunku X i Y między dwoma punktami GPS?

jestem obliczania alfa w następującej procedury:

public static double bearingTo(GPSBean point1, GPSBean point2) { 
    double lat1 = Math.toRadians(point1.latitude); 
    double lat2 = Math.toRadians(point2.latitude); 
    double lon1 = Math.toRadians(point1.longitude); 
    double lon2 = Math.toRadians(point2.longitude); 

    double deltaLong = lon2 - lon1; 

    double y = Math.sin(deltaLong) * Math.cos(lat2); 
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) 
      * Math.cos(lat2) * Math.cos(deltaLong); 
    double bearing = Math.atan2(y, x); 

    return (Math.toDegrees(bearing) + 360) % 360; 
} 
+0

jak obliczasz "alfa"? – Barranka

+0

Dodałem metodę alpha;) – Frame91

+0

@Borian No. Nie jest to duplikat, ponieważ nie potrzebuję bezpośredniej odległości między tymi dwoma punktami. Wiem o formule harversine, ale muszę "chodzić" w geometrii taksówki;) – Frame91

Odpowiedz

5

Właśnie realizowany swój kod, wykorzystując przybliżone współrzędne Nowego Jorku i Bostonu jako punkty odniesienia i wdrożenia wzoru Haversine jak znaleźć na http://www.movable-type.co.uk/scripts/latlong.html (które nie pokazać):

long1 = -71.02; lat1 = 42.33; 
long2 = -73.94; lat2 = 40.66; 

lat1 *=pi/180; 
lat2 *=pi/180; 
long1*=pi/180; 
long2*=pi/180; 

dlong = (long2 - long1); 
dlat = (lat2 - lat1); 

// Haversine formula: 
R = 6371; 
a = sin(dlat/2)*sin(dlat/2) + cos(lat1)*cos(lat2)*sin(dlong/2)*sin(dlong/2) 
c = 2 * atan2(sqrt(a), sqrt(1-a)); 
d = R * c; 

Kiedy uruchomić ten kod, otrzymuję d = 306, który zgadza się z odpowiedzią z powyższej strony.

Za łożysko otrzymuję 52 stopni - znowu, blisko tego, co dało miejsce.

Nie widząc reszty kodu, trudno jest ustalić, dlaczego odpowiedź jest inna.

Uwaga: jeśli oba punkty znajdują się blisko siebie, można uzyskać różne przybliżenia, ale ten kod powinien nadal działać - formuła ma dobrą stabilność liczbową, ponieważ używa wartości sin różnicy między długościami, szerokościami geograficznymi (a nie różnica grzechu).

Uzupełnienie:

Używając kodu dla x, y (w pytaniu), otrzymuję wartości sensownych na odległość - zgadzając się z „właściwej” odpowiedzi w ciągu 120 m (co nie jest złe, ponieważ jeden jest aproksymacją liniową, a druga wynika z krzywizny ziemi). Więc myślę, że twój kod jest w zasadzie OK, teraz naprawiłeś literówkę.

+0

Hej dzięki. Sam też ją przetestowałem, po tym, jak poprawiłem literówkę i otrzymałem kilka możliwych wartości. Może to była tylko literówka;) – Frame91

+0

@ richard - dzięki za naprawienie błędu! – Floris

+0

Nie ma za co, @Floris :-) – Richard

2

Zastosowanie Haversine Wzór do obliczenia odległości (km) pomiędzy dwoma punktami określonych szerokości/długości (w stopniach numerycznych)

z: Haversine o wzorze - R.W.Sinnott "walory Haversine"

powietrznej i teleskop, tom 68, nr 2, 1984

http://www.census.gov/cgi-bin/geo/gisfaq?Q5.1

Przykład użycia z formy:

result.value = LatLon.distHaversine(lat1.value.parseDeg(), long1.value.parseDeg(), * lat2.value.parseDeg(), long2.value.parseDeg()); 

JavaScript:

LatLon.distHaversine = function(lat1, lon1, lat2, lon2) { 
    var R = 6371; // earth's mean radius in km 
    var dLat = (lat2-lat1).toRad(); 
    var dLon = (lon2-lon1).toRad(); 
    lat1 = lat1.toRad(), lat2 = lat2.toRad(); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; 

    return d; 
} 
Powiązane problemy