Determinar dirección de la brújula de un lat / lon a la otra

votos
0

¿Alguien tiene un algoritmo para determinar la dirección de un lat / lon a otro (pseudo-código):

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

¿Dónde está encabezado por ejemplo, NW, SW, E, etc.

Básicamente, tengo dos puntos en un mapa y quiero tener una idea general de la dirección teniendo en cuenta que 50 millas al este y una milla al norte es simplemente Medio y no Noreste.

Publicado el 09/07/2010 a las 05:44
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
2

¿Recuerdas sus funciones trigonométricas? Es decir SOHCAHTOA:

  • SOH : Sin (θ) = opuesto sobre la hipotenusa
  • CAH : Cos (θ) = adyacente sobre la hipotenusa
  • TOA : Tan (θ) = opuesto sobre Adyacente

En pseudo-código:

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";
    }
}

Editar 1: Como Pete y Dean señalaron, esto no toma en cuenta la curvatura de la Tierra. Para cálculos más precisos para los puntos de distancia del ecuador, que tendrá que utilizar fórmulas triángulo esférico , tal como se utiliza en la respuesta de Dean.

Edición 2: Otra corrección; como se señaló Pete, arctan()no da los ángulos correctos, como -1 / -1 y 1/1 son los mismos (como lo son -1/1 y 1 / -1). arctan2(y, x)es una variación de dos argumentos arctan()que está diseñado para compensar esto. arctan()tiene un rango de (-π, π], positivo para y >= 0y negativo para y < 0.

Respondida el 09/07/2010 a las 05:51
fuente por usuario

votos
0

Convertir a un ángulo numérico y utilizar el resultado para buscar el texto. Por ejemplo, -22.5 .. + 22,5 = N. + 22.5..67.5 = NE, E = 67.5..112.5, etc. Por supuesto, esto es suponiendo que solamente va a utilizar N, NE, E, SE, S, SW , W, NW - si decide (por ejemplo) para ir con los viejos "32 puntos de la brújula", cada cadena de texto, obviamente, representa un rango menor.

Respondida el 09/07/2010 a las 05:51
fuente por usuario

votos
16

Este sitio tiene el algoritmo básico:

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

ACTUALIZADO: Ver aquí por completo algorith Mapeo de Matemáticas y Javascript

Eso te dará un número entre 0 y 360 entonces es sólo una cuestión de tener una búsqueda simple:

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

Es importante tener en cuenta que su rodamiento realidad cambia a medida que se mueve alrededor de la Tierra. El algoritmo anterior muestra inicial de rodamiento, pero si va a viajar una larga distancia, el rodamiento sea significativamente diferente cuando se llega al destino (si sólo va a viajar una distancia corta [<unos pocos cientos de kilómetros], entonces probablemente lo ganó 't cambiar lo suficiente como para ser una preocupación).

Respondida el 09/07/2010 a las 05:56
fuente por usuario

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