Déterminer l'orientation de la boussole d'une latitude / longitude à l'autre

voix
0

Quelqu'un at-il un algorithme pour déterminer la direction d'une latitude / longitude à un autre (pseudo-code):

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

Où titre est par exemple NW, SW, E, etc.

Au fond, j'ai deux points sur une carte et je veux avoir une idée générale de la direction en tenant compte du fait que 50 miles à l'est et un mile au nord est tout simplement de l'Est et du Nord-pas.

Créé 09/07/2010 à 05:44
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
2

Vous souvenez-vous de vos fonctions trigonométriques? SOHCAHTOA-à-dire:

  • SOH : Sin (θ) = opposée sur Hypotenuse
  • CAH : Cos (θ) = Adjacent plus hypoténuse
  • TOA : Tan (θ) = En face sur Adjacent

En pseudo-code:

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: Comme Pete et Dean ont fait remarquer, cela ne prend pas en compte la courbure de la Terre. Pour des calculs plus précis pour les points loin de l'équateur, vous aurez besoin d'utiliser des formules de triangle sphérique , tel qu'il est utilisé dans la réponse de Dean.

Edit 2: Une autre correction; comme noté Pete, arctan()ne donne pas les angles corrects, comme -1 / -1 et 1/1 sont les mêmes (comme le sont -1/1 et 1 / -1). arctan2(y, x)est une variation de l' argument de deux arctan()qui est conçu pour compenser cela. arctan()a une gamme de (-π, π], positif y >= 0et négatif pour y < 0.

Créé 09/07/2010 à 05:51
source utilisateur

voix
0

Convertir en un angle numérique et utiliser le résultat pour rechercher le texte. Par exemple, -22,5 .. + 22,5 = N. + 22.5..67.5 = NE, 67.5..112.5 = E, etc. Bien sûr, c'est en supposant que vous utilisez seulement N, NE, E, SE, S, SW , W, NW - si vous décidez (par exemple) pour aller avec les anciens « 32 points de la boussole », chaque chaîne de texte représente évidemment une plus petite gamme.

Créé 09/07/2010 à 05:51
source utilisateur

voix
16

Ce site a l'algorithme de 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();

MISE À JOUR: Voir ici pour algorith complète Mapping Math et Javascript

Cela vous donnera un nombre compris entre 0 et 360 il est juste une question d'avoir une recherche 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]);

Il est important de noter que votre roulement change réellement que vous vous déplacez autour de la terre. L'algorithme ci-dessus montre initial roulement, mais si vous voyagez sur une longue distance, votre appui pour être sensiblement différent lorsque vous atteignez la destination (si vous ne voyagez à une courte distance [<quelques centaines de kms] , puis il a probablement gagné « t changer assez pour être une préoccupation).

Créé 09/07/2010 à 05:56
source utilisateur

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