Saltar al contenido

Problema al calcular el rumbo de la brújula entre dos coordenadas GPS

Intenta entender el código bien previamente a aplicarlo a tu proyecto y si ttienes algo que aportar puedes decirlo en los comentarios.

Solución:

Pruébalo, no puedo por mi vida recordar dónde lo conseguí …

    /**
     * Calculate the bearing between two positions as a value from 0-360
     *
     * @param lat1 - The latitude of the first position
     * @param lng1 - The longitude of the first position
     * @param lat2 - The latitude of the second position
     * @param lng2 - The longitude of the second position
     *
     * @return int - The bearing between 0 and 360
     */
    bearing : function (lat1,lng1,lat2,lng2) 
        var dLon = (lng2-lng1);
        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 = this._toDeg(Math.atan2(y, x));
        return 360 - ((brng + 360) % 360);
    ,

   /**
     * Since not all browsers implement this we have our own utility that will
     * convert from degrees into radians
     *
     * @param deg - The degrees to be converted into radians
     * @return radians
     */
    _toRad : function(deg) 
         return deg * Math.PI / 180;
    ,

    /**
     * Since not all browsers implement this we have our own utility that will
     * convert from radians into degrees
     *
     * @param rad - The radians to be converted into degrees
     * @return degrees
     */
    _toDeg : function(rad) 
        return rad * 180 / Math.PI;
    ,

Esta es una edición de la respuesta aceptada con algunas modificaciones que la hicieron funcionar para mí (principalmente el uso de la función toRad en valores lat, lng).

    var geo = 
        /**
         * Calculate the bearing between two positions as a value from 0-360
         *
         * @param lat1 - The latitude of the first position
         * @param lng1 - The longitude of the first position
         * @param lat2 - The latitude of the second position
         * @param lng2 - The longitude of the second position
         *
         * @return int - The bearing between 0 and 360
         */
        bearing : function (lat1,lng1,lat2,lng2) 
            var dLon = this._toRad(lng2-lng1);
            var y = Math.sin(dLon) * Math.cos(this._toRad(lat2));
            var x = Math.cos(this._toRad(lat1))*Math.sin(this._toRad(lat2)) - Math.sin(this._toRad(lat1))*Math.cos(this._toRad(lat2))*Math.cos(dLon);
            var brng = this._toDeg(Math.atan2(y, x));
            return ((brng + 360) % 360);
        ,

       /**
         * Since not all browsers implement this we have our own utility that will
         * convert from degrees into radians
         *
         * @param deg - The degrees to be converted into radians
         * @return radians
         */
        _toRad : function(deg) 
             return deg * Math.PI / 180;
        ,

        /**
         * Since not all browsers implement this we have our own utility that will
         * convert from radians into degrees
         *
         * @param rad - The radians to be converted into degrees
         * @return degrees
         */
        _toDeg : function(rad) 
            return rad * 180 / Math.PI;
        ,
    ;

    /** Usage **/
    var myInitialBearing = geo.bearing(0,0,45,45);

Encuentre teoría y calculadora en línea en: http://www.movable-type.co.uk/scripts/latlong.html

Si desea un método muy aproximado para distancias cortas, puede usar un radio de la Tierra de 6.378.137 m (la longitud del eje semi-mayor del esferoide WGS84) para calcular los lados del triángulo en función de la diferencia de latitud y longitud. Luego calcule el rumbo apropiado. Será un true cojinete, pero probablemente lo suficientemente cerca en distancias cortas.

Deberá dejar que los usuarios calculen la declinación magnética local.

por ejemplo, para su ejemplo:

startLat  = 43.6822
startLong = -70.450769

endLat  = 43.682211
endLong = -70.45070

diff lat  = 0.000011 = 1.22m
diff long = 0.000069 = 7.68m

El punto final está al norte y al este del inicio, por lo que el rumbo se puede encontrar mediante:

tan a = 7.68 / 1.22
    a = 81°

Entonces la dirección es de Este a Norte.

Esto probablemente debería estar en un hilo de mapeo y topografía. Una vez que haya resuelto las matemáticas, venga aquí en busca de la solución.

Editar

Para convertir grados de latitud a metros, primero calcule la circunferencia de la Tierra en el ecuador (o cualquier círculo máximo):

c = 2πR where r = 6378137m
  = 40,075,000 (approx)

Luego obtenga la razón de la circunferencia de 360 ​​°:

dist = c * deg / 360
     = 40,075,000m * 0.000011° / 360°
     = 1.223m

Para la longitud, la distancia se estrecha a medida que la latitud se acerca al polo, por lo que se usa la misma fórmula y el resultado se multiplica por el coseno de la latitud:

     = 40,075,000m * 0.000069° / 360° * cos(0.000011°)
     = 7.681m

El valor del radio de la Tierra no es necesariamente exacto, la Tierra no es una esfera perfecta (es un esferoide achatado, en forma de pera). Se usan diferentes aproximaciones en diferentes lugares para una mayor precisión, pero la que he usado debería ser lo suficientemente buena.

Si piensas que ha sido provechoso nuestro post, sería de mucha ayuda si lo compartieras con otros juniors de esta forma contrubuyes a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *