Determinare la direzione bussola da un lat / lon all'altro

voti
0

Qualcuno ha un algoritmo per determinare la direzione da un lat / lon ad un altro (pseudo-codice):

CalculateHeading( lat1, lon1, lat2, long2 ) returns string heading

Dove titolo è ad esempio NW, SW, E, ecc

Fondamentalmente, ho due punti su una mappa e voglio avere un'idea generale della direzione tenendo conto che 50 miglia a est e un miglio a nord è semplicemente Est e non Nordest.

È pubblicato 09/07/2010 alle 05:44
fonte dall'utente
In altre lingue...                            


3 risposte

voti
2

Vi ricordate le funzioni trigonometriche? Ie Sohcahtoa:

  • SOH : Sin (θ) = opposta sulla Hypotenuse
  • CAH : Cos (θ) = Adiacente sopra Hypotenuse
  • TOA : Tan (θ) = opposta sulla Adiacente

In pseudo-codice:

function getDir(lat1, long1, lat2, long2) {
    margin = π/90; // 2 degree tolerance for cardinal directions
    o = lat1 - lat2;
    a = long1 - long2;
    angle = atan2(o,a);

    if (angle > -margin && angle < margin):
            return "E";
    elseif (angle > π/2 - margin && angle < π/2 + margin):
            return "N";
    elseif (angle > π - margin && angle < -π + margin):
            return "W";
    elseif (angle > -π/2 - margin && angle < -π/2 + margin):
            return "S";
    }
    if (angle > 0 && angle < π/2) {
        return "NE";
    } elseif (angle > π/2 && angle < π) {
        return "NW";
    } elseif (angle > -π/2 && angle < 0) {
        return "SE";
    } else {
        return "SW";
    }
}

Edit 1: Come Pete e Dean hanno sottolineato, questo non tiene conto della curvatura della Terra. Per ulteriori calcoli precisi per i punti di distanza dall'equatore, è necessario utilizzare le formule triangolo sferico , come usato in risposta di Dean.

Edit 2: Un'altra correzione; come osservato Pete, arctan()non dà angoli corretti, come -1 / -1 e 1/1 sono uguali (come sono -1/1 e 1 / -1). arctan2(y, x)è una variante due argomento arctan()che è stato progettato per compensare questo. arctan()ha una gamma di (-π, π], positivo per y >= 0e negativo per y < 0.

Risposto il 09/07/2010 a 05:51
fonte dall'utente

voti
0

Conversione in un angolo numerica e usare il risultato per cercare il testo. Ad esempio, -22,5 .. + 22,5 = N. + 22.5..67.5 = NE, 67.5..112.5 = E, ecc Naturalmente, che è supponendo che si sta utilizzando solo N, NE, E, SE, S, SW , W, NW - se si decide (per esempio) per andare con il vecchio "32 punti cardinali", ogni stringa di testo rappresenta ovviamente una gamma più ridotta.

Risposto il 09/07/2010 a 05:51
fonte dall'utente

voti
16

Questo sito ha l'algoritmo di base:

// in javascript, not hard to translate...
var y = Math.sin(dLon) * Math.cos(lat2);
var x = Math.cos(lat1)*Math.sin(lat2) -
        Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
var brng = Math.atan2(y, x).toDeg();

AGGIORNAMENTO: Vedi qui per una completa algoritmo mappatura matematica e Javascript

Che ti do un numero compreso tra 0 e 360 ​​quindi è solo una questione di avere una semplice ricerca:

var bearings = ["NE", "E", "SE", "S", "SW", "W", "NW", "N"];

var index = brng - 22.5;
if (index < 0)
    index += 360;
index = parseInt(index / 45);

return(bearings[index]);

E 'importante notare che il cuscinetto in realtà cambia come ci si sposta intorno alla terra. L'algoritmo di cui sopra vi mostra iniziale cuscinetto, ma se si viaggia una lunga distanza, la propria posizione per essere molto diversa quando si raggiunge la destinazione (se siete solo in viaggio a breve distanza [<a poche centinaia di chilometri] allora probabilmente ha vinto 't cambiare abbastanza per essere un problema).

Risposto il 09/07/2010 a 05:56
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more