Distancia entre dos puntos geográficos.

Distancia entre dos puntos geográficos.

mario.hernandez 28 March 2019

Conocer la distancia entre dos puntos en un mapa es uno de los parámetros más útiles cuando se trabaja con el análisis de datos georreferenciados.

El método que utilizaremos para calcular la distancia entre dos puntos geográficos es denominado método del gran círculo, mismo que conocí por primera vez en las actas finales del Acuerdo de Río de Janeiro RJ81 (Documento sobre radiodifusión sonora en amplitud modulada AM), sin embargo, es necesario conocer un par de conceptos.

Coordenadas geográficas

Cualquier punto puede ser representado en un mapa mediante una latitud y una longitud, como se observa en la Figura 1:

latitud y longitud, proyeccion cilindrica equidistantes

De la Figura 1, se puede determinar lo siguiente:

  1. Las latitudes (eje y) por arriba del ecuador serán consideradas positivas y por debajo de él, negativas.
  2. Las longitudes (eje x) a la izquierda del meridiano de Greenwich serán negativas y las que estén por la derecha, positivas.
  3. Por ejemplo, todos los puntos coordenados ubicados dentro del territorio mexicano tendrán una latitud positiva (Norte N) y una longitud negativa (Oeste W), por otra parte, en Australia, todos los puntos georreferenciados tendrán latitudes negativas (Sur S) y longitudes positivas (Este E).

Genera puntos dando click en el mapa aquí.

Proyección cartográfica

Existen diversas proyecciones para representar mapas, en la Figura 1, se utilizó una proyección cilíndrica, la cual es una de las más conocidas y utilizadas, consiste en representar las latitudes y longitudes como líneas horizontales (paralelos) y líneas verticales (meridianos), respectivamente. Esta proyección tiene la particularidad de representar bien las áreas que se encuentran cerca del ecuador, sin embargo, a medida que nos acercamos a los polos la distorsión aumenta. La proyección cartográfica a utilizar dependerá de la aplicación a desarrollar o implementar, por ejemplo, la proyección de la Figura 2, es conocida como geoestacionaria y muestra a la tierra vista desde un satélite en una órbita geoestacionaria (satélite a una altura sobre el nivel del mar aproximada de 36000 km).

 

Orbita geoestacionaria 116.8 W

Figura 2. Mapa geoestacionario centrado en 116.8° W.

Formato de coordenadas geográficas

Uno de los formatos más común en las que pueden ser expresadas las latitudes o longitudes son:

  • Grados Minutos y Segundos (G°M'S'' - GMS), por ejemplo:
    • 23°12'34.0'' N y 99°23'00.0'' W;
    • 231234.0 N y 992300.0 W;
    • 231234.0, -992300.0;
  • Decimales (DEC), por ejemplo:
    • 23.209444, -99.383333;
    • 23.209444 -99.383333.

 

Para convertir de GMS a DEC:

dec = grad + (min/60) + (seg/3600)

Es importante mencionar que tanto como las latitudes Sur (S) y
longitudes Oeste (W) serán negativas, por lo que para ellas, la
expresión a utilizar es:

dec = grad - (min/60) - (seg/3600)

Bastará con saber lo anterior para los fines de este post, no obstante, si deseas conocer más al respecto te recomiendo leer el siguiente documento sobre el sistema de coordenadas por el Instituto Nacional de Estadística, Geografía e Informática (INEGI) de México. Además, las Figuras 1 y 2, fueron realizadas con python y la librería basemap, publicaré más adelante cómo representar datos mediante esta excelente librería.

Distancia entre dos puntos geográficos

Sean lat1 y lon1 la latitud y la longitud, respectivamente, del primer punto (P1) y lat2 y lon2 las del segundo punto (P2). La distancia en km entre los dos puntos está dada por:

distnacia en km

donde:

distancia en grados

Además, para conocer el ángulo (acimut) entre el punto 1 y el punto 2, con respecto al Norte verdadero (Figura 3):

angulo entre el punto 1 y el punto 2Lo anterior nos dará valores del ángulo entre angulo de 0 a 180. El ángulo en grados con respecto al Norte verdadero en dirección al punto P2 tendrá un valor de angulo del punto 1 al punto 2 si condicion 1, o realizar un ajuste del ángulo de ajuste de angulo si condicion 2. Para mayor referencia se tiene la Figura 3:

Norte verdadero, ángulo entre dos puntos

Figura 3. Ángulo entre dos puntos coordenados.

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 distancia12(lat1, lon1, lat2, lon2):
    """
    Obtiene la distancia y el angulo (acimut) entre entre dos puntos de
    coordenadas geograficas P1 a P2
    """

    #  Conversion de GMS a DEC y posteriormente a radianes
    lat1rad = math.radians(dms2dec(*lat1))
    lon1rad = math.radians(dms2dec(*lon1))

    lat2rad = math.radians(dms2dec(*lat2))
    lon2rad = math.radians(dms2dec(*lon2))

    #  Si las latitudes y longitudes son iguales se encuentran en el mismo sitio geografico
    if lat1rad == lat2rad and lon1rad == lon2rad:
        return 0, 0

    #  Calculo de la distancia P1 a P2
    a = math.sin(lat1rad)*math.sin(lat2rad)
    b = math.cos(lat1rad)*math.cos(lat2rad)*math.cos(lon2rad - lon1rad)
    D = math.acos(a + b)  # Formula (2)

    d = 111.18*math.degrees(D)  # Formula (1)

    #  Calculo del angulo del P1 al P2
    ang_n = math.sin(lat2rad) - math.cos(D)*math.sin(lat1rad)
    ang_d = math.sin(D)*math.cos(lat1rad)

    try:
        ang12 = math.acos(round((ang_n / ang_d), 3))  # Formula (3)
    except:
        ang12 = 0

    #  Ajuste del angulo de conformidad con la condicion sin(lon2-lon1)
    if math.sin(lon2rad - lon1rad) < 0:
        ang12 = 360 - math.degrees(ang12)
    else:
        ang12 = math.degrees(ang12)

    # Regresa distancia y angulo
    return round(d, 2), round(ang12, 2)


# P1 --> Punto en Colombia
lat1 = (1, 35, 55)    # 1 35 55 N
lon1 = (-77, 43, 21)  # 77 43 21  W

# P2 --> Punto en Peru
lat2 = (-5, 33, 48)   # 5 33 48 S
lon2 = (-76, 27, 27)  # 76 27 27 W

distancia, angulo = distancia12(lat1, lon1, lat2, lon2)

print(
'''Distancia = {distancia} km
Angulo = {angulo} grados'''.format(distancia=distancia, angulo=angulo)
)

Salida:

Distancia = 808.56 km
Ángulo = 170.06 grados

Finalmente, si deseas realizar mediciones de distancias directo en el mapa, da click en el icono mide distacia en el siguiente mapa.