Cálculo de las coordenadas geográficas de un punto a partir de una distancia y un ángulo

Cálculo de las coordenadas geográficas de un punto a partir de una distancia y un ángulo

mario.hernandez 31 March 2019

Considera el siguiente problema:

Se tienen las coordenadas geográficas de la ciudad de Puerto Peñasco, Sonora, México con 31°18'57.56'' de latitud Norte (LN) y 113°32'00.86'' de Longitud Oeste (LW), y desean trazar una línea recta la cual representará la trayectoria más cercana a la frontera con los Estados Unidos de América (EUA). Conocen que la frontera se encuentra a una distancia de 82 km en una dirección de 21° a partir de la Ciudad de Puerto Peñasco (Recuerden que los ángulos en un mapa son respecto al norte verdadero, para más información recomiendo leer el post Distancia entre dos puntos geográficos).

Para poder trazar una línea en un mapa, como lo veremos más adelante, necesitamos conocer la latitud y longitud del punto inicial (Puerto Peñasco) y las del punto final (punto en la frontera con EUA) por lo que necesitaremos determinar la latitud y la longitud del punto final. Para mayor facilidad he representado el problema en la Figura 1:

punto a partir de distancia y ángulo

Figura 1. Deseamos conocer la lat2 y la lon2 del punto P2, a partir del P1, la distancia "d" y el ángulo.

Para determinar la latitud y longitud del punto P2, a partir del P1, la distancia y un ángulo, utilizaremos las siguientes expresiones matemáticas:

ecuacion 1

ecuación 2

Donde:

ecuación 3

ecuación 4

La ecuación 4 dependerá del angulo12, de tal suerte que siajuste de k entonces k = -k.

Implementación en python

import math

def dms2dec(grad, min, seg):
    """
    Convierte coordenadas de grados minutos a segundos a decimal
    """
    if grad > 0:
        dec = grad + min/60.0 + seg/3600.0
    else:
        dec = grad - min/60.0 - seg/3600.0

    return dec


def dec2dms(coord):
    """
    Convierte de coordenadas Decimal a Grado Minutos Segundos
    """
    sign = -1 if coord < 0 else 1
    coord = abs(coord)
    dd = int(coord)
    mm = int((coord - dd)*60)
    ss = (coord - dd - (mm/60.0))*3600

    return sign*dd, mm, ss


def obtener_p2(lat1, lon1, d, ang12):
    """
    Coordenadas de un punto dada una distancia y acimut a partir del punto P1
    """
    ang12 = 0 if ang12 == 360 else ang12

    lat1rad = math.radians(dms2dec(*lat1))
    lon1rad = math.radians(dms2dec(*lon1))

    # Formula 3
    d_grados = d / 111.18
    d_rad = math.radians(d_grados)
    ang12rad = math.radians(ang12)
    
    # Formula 1
    lat2 = math.asin(math.sin(lat1rad) * math.cos(d_rad) +
        math.cos(lat1rad) * math.sin(d_rad) * math.cos(ang12rad))

    x = math.cos(d_rad) - math.sin(lat1rad) * math.sin(lat2)
    y = math.cos(lat1rad) * math.cos(lat2)
    z = x / y

    # Formula 4
    k = math.acos(z)

    # Ajuste en el valor de k
    if ang12 >= 180 and ang12 < 360: k = -k
    
    # Formula 2
    lon2 = lon1rad + k

    return math.degrees(lat2), math.degrees(lon2)


# P1 --> Punto Puerto Penasco
lat1 = (31, 18, 57.56)    # 31 18 57.56 LN
lon1 = (-113, 32, 00.86)  # 113 32 00.86 LW
d = 82
ang12 = 21

lat2, lon2 = obtener_p2(lat1, lon1, d, ang12)

print(
'''lat_2: {lat2}
lon_2: {lon2}'''.format(lat2=dec2dms(lat2), lon2=dec2dms(lon2))
)

Salida:

lat_2: (32, 0, 15.005609458765434)
lon_2: (-113, 13, 18.82022160301173)

El determinar la latitud y longitud de un punto con respecto a otro, por medio de un ángulo y una distancia nos permitirá realizar cualquier figura geométrica en el mapa (líneas, cuadrados, círculos, pentágonos, hexágonos, sectores, etc.), como lo mostraré en el siguiente post.

Finalmente, si deseas consultar las expresiones matemáticas que utilicé, consúltalas en el Acuerdo de Río de Janeiro RJ81.