2013-04-08 37 views
5

Sto cercando un modo semplice per calcolare la distanza tra due punti GPS, quindi ottengo il risultato come: "Devi andare x metri su e y metri a sinistra - quindi posso lavorare con un sistema a coordinate 2d, dove ho la mia posizione come (0,0) e le altre posizioni mostra la distanza in (x, y) in metri dalla mia posizioneCalcola la distanza in (x, y) tra due punti GPS

la mia idea era quella di calcolare la distanza tra i punti utilizzando la formula haversine. (restituisce il mio ipotenusa)

In aggiunta a ciò, sto calcolando il cuscinetto tra questi due punti. Questa è la mia alfa.

Con questi due valori, ho voluto utilizzare le funzioni di trigonometria di base per risolvere il mio problema.

Così ho provato a calcolare: catheti_1 = sin(alpha) * hypotenuse, catheti_2 = cos(alpha) * hypotenuse.

Forse sto facendo qualcosa di sbagliato, ma i miei risultati sono inutili al momento.

Quindi la mia domanda è: come posso calcolare la distanza in direzione xey tra due punti GPS?

Sto calcolando alfa nella seguente procedura:

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

come stai calcolando 'alpha'? – Barranka

+0

Ho aggiunto il metodo per alpha;) – Frame91

+0

@Borian No. Non è un duplicato, perché non ho bisogno della distanza diretta tra questi due punti. Conosco la formula di harversine, ma devo "camminare" nella geometria del taxi;) – Frame91

risposta

5

Ho appena implementato il codice, utilizzando le coordinate approssimative di New York e Boston come punti di riferimento, e attuare la formula Haversine come si trova a http://www.movable-type.co.uk/scripts/latlong.html (che si non ha mostrato):

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; 

Quando ho eseguito questo codice, ottengo d = 306, che concorda con la risposta dal sito di cui sopra.

Per il rilevamento ottengo 52 gradi - di nuovo, vicino a ciò che il sito ha dato.

Senza vedere il resto del codice, è difficile sapere perché la risposta è diversa.

Nota: quando i due punti sono ravvicinati, è possibile effettuare tutti i tipi di approssimazioni, ma questo codice dovrebbe ancora funzionare - la formula ha una buona stabilità numerica perché utilizza lo sin della differenza tra longitudini, latitudini (anziché la differenza del peccato).

Addendum:

Utilizzando il codice per x, y (nella sua domanda), ottengo valori ragionevoli per la distanza - d'accordo con la risposta "corretta" entro 120 m (che non è male dal momento che uno è un'approssimazione linea retta e l'altra segue la curvatura della terra). Quindi penso che il tuo codice sia fondamentalmente OK ora hai corretto l'errore di battitura.

+0

Ehi, grazie. L'ho provato anch'io, dopo aver corretto l'errore di battitura e ottenuto alcuni valori possibili. Forse era solo l'errore di battitura;) – Frame91

+0

@richard - grazie per aver corretto l'errore! – Floris

+0

Prego, @Floris :-) – Richard

2

Usa Haversine formula per calcolare la distanza (in km) tra due punti specificati dalla latitudine/longitudine (in gradi numerici)

da: formula Haversine - R. W.Sinnott, "Virtù del Haversine"

Sky and Telescope, vol 68, n ° 2, 1984

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

Esempio di utilizzo dalla forma:

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; 
} 
Problemi correlati