Saltar al contenido

¿Cómo calculo el acimut (ángulo al norte) entre dos coordenadas WGS84?

Solución:

Las fórmulas a las que se refiere en el texto son para calcular la distancia del gran círculo entre 2 puntos. Así es como calculo el ángulo entre puntos:

uses Math, ...;
...

const
  cNO_ANGLE=-999;

...

function getAngleBetweenPoints(X1,Y1,X2,Y2:double):double;
var
  dx,dy:double;
begin
  dx := X2 - X1;
  dy := Y2 - Y1;

  if (dx > 0) then  result := (Pi*0.5) - ArcTan(dy/dx)   else
  if (dx < 0) then  result := (Pi*1.5) - ArcTan(dy/dx)   else
  if (dy > 0) then  result := 0                          else
  if (dy < 0) then  result := Pi                         else
                    result := cNO_ANGLE; // the 2 points are equal

  result := RadToDeg(result);
end;
  • Recuerde manejar la situación donde 2 puntos son iguales (verifique si el resultado es igual a cNO_ANGLE, o modifique la función para lanzar una excepción);

  • Esta función asume que estás en una superficie plana. Con las pequeñas distancias que ha mencionado, todo está bien, pero si va a calcular el rumbo entre ciudades de todo el mundo, es posible que desee buscar algo que tome la forma de la tierra en el recuento;

  • Es mejor proporcionar esta función con coordenadas que ya estén asignadas a una superficie plana. Sin embargo, puede alimentar WGS84 Latitude directamente en Y (y lon en X) para obtener una aproximación aproximada.

Aquí está la solución de C #. Probado para ángulos de 0, 45, 90, 135, 180, 225, 270 y 315.

Editar Reemplacé mi fea solución anterior, por la traducción C # de la solución de Wouter:

public double GetAzimuth(LatLng destination)
{
    var longitudinalDifference = destination.Lng - this.Lng;
    var latitudinalDifference = destination.Lat - this.Lat;
    var azimuth = (Math.PI * .5d) - Math.Atan(latitudinalDifference / longitudinalDifference);
    if (longitudinalDifference > 0) return azimuth;
    else if (longitudinalDifference < 0) return azimuth + Math.PI;
    else if (latitudinalDifference < 0) return Math.PI;
    return 0d;
}
public double GetDegreesAzimuth(LatLng destination)
{
    return RadiansToDegreesConversionFactor * GetAzimuth(destination);
}

Encontré este enlace

http://williams.best.vwh.net/avform.htm

dado en la respuesta a

Lat / Lon + Distancia + Rumbo -> Lat / Lon

Esto parece prometedor, especialmente la aproximación de tierra plana dada cerca del final.

¡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 *