Distancia entre dos puntos geográficos.
mario.hernandez 28 March 2019Conocer 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:
De la Figura 1, se puede determinar lo siguiente:
- Las latitudes (eje y) por arriba del ecuador serán consideradas positivas y por debajo de él, negativas.
- Las longitudes (eje x) a la izquierda del meridiano de Greenwich serán negativas y las que estén por la derecha, positivas.
- 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).
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:
donde:
Además, para conocer el ángulo (acimut) entre el punto 1 y el punto 2, con respecto al Norte verdadero (Figura 3):
Lo anterior nos dará valores del ángulo entre . El ángulo en grados con respecto al Norte verdadero en dirección al punto P2 tendrá un valor de si , o realizar un ajuste del ángulo de si . Para mayor referencia se tiene la Figura 3:
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 en el siguiente mapa.