2012-04-12 15 views
16

Sto attraversando un periodo difficile che avvolge la mia Trigonometria. Sto cercando di dedurre una latitudine e longitudine di destinazione da un lat e log di inizio e distanza e direzione.calcolare Lat e Long dal rilevamento e dalla distanza

Per fortuna, ho trovato un sito eccezionale che descrive esattamente la funzione che ho bisogno: http://www.movable-type.co.uk/scripts/latlong.html "punto di destinazione data distanza e la direzione da punto di partenza" ho provato nel mio programma Java, ma non funziona per me. L'ho distribuito come il sito web ha detto. Ecco il mio codice:

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

Ma mostra l'output è:

a = 0.0 
Latitude = 26.882880455723377 
Longitude = 75.78369140625 

Non ricevo in cui sto facendo l'errore. Per favore qualcuno può aiutarmi a scoprire il problema.

Grazie in anticipo. :-)

+4

Thre sono alcune piccole librerie per aiutare con questo, ad es. http://code.google.com/p/simplelatlng/wiki/GettingStarted –

+0

Mark - grazie mille per questo piccolo collegamento. – Vaiden

risposta

13

Il tuo problema è sulla prima linea.

Prova

double dist = 150.0/6371.0; 

La ragione è che 150/6371 ottiene calcolato come 0, quanto esegue la divisione intera (anziché divisione in virgola mobile). Questo è vero anche se il risultato è stato memorizzato in un double. Puoi forzare la divisione in virgola mobile rendendo uno dei due numeri un letterale in virgola mobile.

+1

Qualcuno può dirmi che cos'è 150, è miglia? Sto cercando di implementare questo stesso scenario – devdar

+2

Penso che sia chilometri, dato il raggio di terra. – lcguida

+0

Ho usato questo per convertire latitudine e longitudine: 22.369131978392012,114.11357168108225 per startpoint latitudine, longitudine: 0.39041812966877465,1.991668182365113 con distanza percorsa (in KM) come 0.06574748992919921 Potresti dirmi come calcolare la distanza? –

5

se qualcuno ha bisogno di una funzione che calcola coordinate punto da un altro punto spostato da una certa distanza, di seguito è riportato il codice di lavoro. Per me, sta semplicemente spostando un punto da una certa distanza.

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)); 
} 
  • latitudine, longitudine - punto di ingresso coordina
  • distanceInMetres - distanza che si desidera spostare il punto da
  • cuscinetto - un angolo, la direzione verso la quale si voglio spostare il punto. 0 è verso Nord, 90 - Est, 180 - Sud, 270 - Ovest. E tutto tra, 45 è Nord Est.
  • earthRadiusInMetres - Raggio di terra in metri.

È possibile modificare il raggio su 6371 se si desidera avere l'input in chilometri o miglia se si desidera avere l'input in miglia.

Problemi correlati