Determină direcția busola de la un lat / lon la alta

voturi
0

Are cineva un algoritm pentru a determina direcția de la un lat / lon la alta (pseudo-cod):

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

În cazul în care titlul este de exemplu, NV, SV, E, etc.

Practic, am două puncte pe o hartă și vreau să obțineți o idee generală a direcției, ținând cont de faptul că 50 de mile est și o mila de Nord-Est este pur și simplu și nu de Nord-Est.

Întrebat 09/07/2010 la 05:44
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
2

Îți amintești funcțiile trigonometrie? Ie SOHCAHTOA:

  • SOH : Sin (θ) = Opus peste ipotenuzei
  • CAH : Cos (θ) = Adiacent peste ipotenuzei
  • TOA : Tan (θ) = opusă pe Adiacent

În pseudo-cod:

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: După cum Pete și Dean a subliniat, acest lucru nu ia în considerare curbura Pământului. Pentru mai multe calcule precise pentru puncte departe de ecuator, va trebui să folosească formule de triunghi sferice , așa cum este utilizat în răspunsul lui Dean.

Edit 2: O altă corecție; după cum sa menționat Pete, arctan()nu dă unghiurile corecte, ca -1 / -1 și 1/1 sunt aceleași (ca sunt -1/1 și 1 / -1). arctan2(y, x)este o variantă cu două argument arctan()care este proiectat pentru a compensa acest lucru. arctan()are o rază de (-π, π], pozitive y >= 0și negative y < 0.

Publicat 09/07/2010 la 05:51
sursa de către utilizator

voturi
0

Conversia la un unghi numeric și de a folosi rezultatul pentru a căuta text. De exemplu, -22.5 .. + 22,5 = N + 22.5..67.5 = NE, 67.5..112.5 = E, etc Desigur, asta presupunând că utilizați numai N, NE, E, SE, S, SV , V, NV - în cazul în care vă decideți (de exemplu) pentru a merge cu vechile „32 de puncte cardinale“, fiecare șir de text reprezintă în mod evident, un interval mai mic.

Publicat 09/07/2010 la 05:51
sursa de către utilizator

voturi
16

Acest site are algoritmul de bază:

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

UPDATED: Vezi aici pentru completă algorith Mapping Math și Javascript

Asta să-ți dau un număr între 0 și 360, atunci este doar o chestiune de a avea o căutare simplă:

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

Este important de reținut faptul că , mai dvs. de fapt , se schimbă pe măsură ce mutați în jurul Pământului. Algoritmul de mai sus vă arată inițial care poartă, dar dacă călătoriți o distanță lungă, care poartă dumneavoastră să fie semnificativ diferite , atunci când ajunge la destinație (dacă sunteți doar o distanță scurtă călătorie [<câteva sute de kilometri] , atunci , probabil , a câștigat „t schimba suficient pentru a fi un motiv de îngrijorare).

Publicat 09/07/2010 la 05:56
sursa de către utilizator

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