2012-04-12 11 views
16

Ciężko mi owijać głowę wokół jakiejś trygonometrii. Próbuję wywnioskować szerokość i długość geograficzną miejsca docelowego od początku lat i dziennika oraz odległości i namiaru.obliczanie Lat i Long z namiaru i dystansu

szczęście znalazłem niesamowite miejsce, które opisuje dokładnie taką funkcję, czego potrzebuję: http://www.movable-type.co.uk/scripts/latlong.html „punkt docelowy daną odległość i namiar od punktu startu” próbowałem go w moim programie java, ale to nie działa dla mnie. Rozmieściłem to tak, jak powiedziała strona internetowa. Tu jest mój kodu:

double dist = 150/6371; 
double brng = Math.toRadians(90); 
double lat1 = Math.toRadians(26.88288045572338); 
double lon1 = Math.toRadians(75.78369140625); 

double lat2 = Math.asin(Math.sin(lat1)*Math.cos(dist) + Math.cos(lat1)*Math.sin(dist)*Math.cos(brng)); 
double a = Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1), Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2)); 
System.out.println("a = " + a); 
double lon2 = lon1 + a; 

lon2 = (lon2+ 3*Math.PI) % (2*Math.PI) - Math.PI; 

System.out.println("Latitude = "+Math.toDegrees(lat2)+"\nLongitude = "+Math.toDegrees(lon2)); 

Ale to pokazuje wyjście jest:

a = 0.0 
Latitude = 26.882880455723377 
Longitude = 75.78369140625 

nie otrzymuję gdzie robię błąd. Proszę, niech ktoś mi pomoże rozwiązać ten problem.

Thanx in Advance. :-)

+4

Są to ładne małe biblioteki, które mogą pomóc w tym, np. http://code.google.com/p/simplelatlng/wiki/GettingStarted –

+0

Mark - wielkie dzięki za to małe podłączenie. – Vaiden

Odpowiedz

13

Twój problem dotyczy pierwszej linii.

Spróbuj

double dist = 150.0/6371.0; 

Powodem jest to, że 150/6371 zostaje obliczona jako 0, ponieważ wykonuje on podział całkowitej (zamiast zmiennoprzecinkowej podziału). Jest to prawdą, mimo że wynik jest przechowywany w double. Możesz wymusić podział zmiennoprzecinkowy, czyniąc jedną z dwóch liczb literałem zmiennoprzecinkowym.

+1

Czy ktoś może mi powiedzieć, co to jest 150, czy to mile? patrzę na wdrażanie tego samego scenariusza – devdar

+2

Myślę, że to kilometry, biorąc pod uwagę promień ziemi. – lcguida

+0

I stosuje się w tym celu przekształcenia szerokość i długość: 22.369131978392012,114.11357168108225 do startowy szerokość, długość: 0.39041812966877465,1.991668182365113 przenoszone odległości (km) jako 0.06574748992919921 Czy możesz mi powiedzieć, jak obliczyć odległość między? –

5

jeśli ktokolwiek potrzebuje funkcji, która oblicza współrzędne punktu z innego punktu przesuniętego o pewną odległość, poniżej znajduje się działający kod. Dla mnie jest to po prostu przesuwanie punktu o pewną odległość.

import static java.lang.Math.*; 

void movePoint(double latitude, double longitude, double distanceInMetres, double bearing) { 
    double brngRad = toRadians(bearing); 
    double latRad = toRadians(latitude); 
    double lonRad = toRadians(longitude); 
    int earthRadiusInMetres = 6371000; 
    double distFrac = distanceInMetres/earthRadiusInMetres; 

    double latitudeResult = asin(sin(latRad) * cos(distFrac) + cos(latRad) * sin(distFrac) * cos(brngRad)); 
    double a = atan2(sin(brngRad) * sin(distFrac) * cos(latRad), cos(distFrac) - sin(latRad) * sin(latitudeResult)); 
    double longitudeResult = (lonRad + a + 3 * PI) % (2 * PI) - PI; 

    System.out.println("latitude: " + toDegrees(latitudeResult) + ", longitude: " + toDegrees(longitudeResult)); 
} 
  • szerokość, geograficznej - punkt wejścia współrzędne
  • distanceInMetres - odległość, które chcesz przenieść punkt przez
  • mając - kąt, kierunek, którego chcesz przenieść punkt. 0 to kierunek północny, 90 - wschód, 180 - południe, 270 - zachód. A wszystko pomiędzy, tj. 45 to północny wschód.
  • earthRadiusInMetres - Promień Ziemi w metrach.

Możesz zmienić promień na 6371, jeśli chcesz wprowadzić dane w kilometrach lub w milach, jeśli chcesz wprowadzić dane w milach.

Powiązane problemy