- Al sumar desplazamientos x,y en metros a coordenadas de latitud/longitud, si la distancia es de unos pocos km o menos y no estás cerca de los polos, se puede calcular rápido solo con una fórmula de aproximación simple
- El cálculo básico considera 111,111 m en dirección y como 1 grado de latitud y
111,111 * cos(latitude) m en dirección x como 1 grado de longitud; así, un desplazamiento de 100 m hacia el norte se obtiene sumando 100 / 111111 grados
- La misma idea también puede calcularse tratando la Tierra como una esfera con radio
R=6378137, usando dLat=dn/R y dLon=de/(R*cos(lat)); si en latitud 51 se usa dn=100 y de=100, se obtiene latO=51.00089832 y lonO=0.001427437
- Si el requisito de precisión es de menos de 10 m y el offset llega hasta 1 km, se pueden usar fórmulas más complejas como las de Aviation Formulary, pero aun así se espera que la aproximación plana simple tenga un error menor a 50 m con un offset de 1 km
- Si también hace falta considerar el efecto de que la longitud de 1 grado varía según la latitud, conviene usar la fórmula de metros por grado o convertir a un sistema local de coordenadas proyectadas, sumar el desplazamiento y luego volver a latitud/longitud
Para distancias cortas, basta la aproximación de 111,111 m/grado
- Para desplazamientos pequeños, el cambio en latitud/longitud puede calcularse con esta aproximación
- dirección y: 111,111 m ≈ 1 grado de latitud
- dirección x:
111,111 * cos(latitude) m ≈ 1 grado de longitud
- Las nuevas coordenadas se obtienen aproximadamente así
lat_new = lat + dy / 111111
lon_new = lon + dx / (111111 * cos(latitude))
- En
cos(latitude) hay que usar la unidad adecuada según el entorno de ejecución
- si el entorno requiere radianes, hace falta convertir con
latitude * pi / 180
- Esta aproximación sirve cuando el desplazamiento no es demasiado grande, no estás justo al lado de los polos y la precisión exigida no es extremadamente alta
De dónde sale el número 111,111 m y cuál es su margen de error
- El valor 111,111 está ligado a la definición histórica del metro
- porque Francia definió originalmente el metro como
1/10^7 de la distancia desde el ecuador hasta el polo norte siguiendo el meridiano de París
- por eso
10^7 / 90 = 111,111.1 m corresponde a 1 grado de latitud
- En una verificación de los comentarios, al comparar un desplazamiento de 1400 m en x y 1400 m en y, con un desplazamiento total de 2 km, contra un cálculo UTM, el resultado coincidió con un error de 8.6 m o menos
- en esas condiciones, la peor latitud fue 81 grados
- el error se mantuvo por debajo de 10 m hasta más allá de los 89.6 grados
- La fórmula simple refleja con
cos(latitude) el efecto de que los grados de longitud se estrechan al acercarse a los polos
- como la distancia real de 1 grado de longitud se reduce, el mismo desplazamiento en metros sobre x se convierte en un cambio mayor de longitud en latitudes altas
El mismo cálculo usando el radio de la Tierra
- El mismo cálculo también puede expresarse con una fórmula basada en el radio de la Tierra
//Position, decimal degrees
lat = 51.0
lon = 0.0
//Earth’s radius, sphere
R=6378137
//offsets in meters
dn = 100
de = 100
//Coordinate offsets in radians
dLat = dn/R
dLon = de/(R*Cos(Pi*lat/180))
//OffsetPosition, decimal degrees
latO = lat + dLat * 180/Pi
lonO = lon + dLon * 180/Pi
- Este ejemplo devuelve el siguiente resultado
latO = 51,00089832
lonO = 0,001427437
- Este método es casi la misma solución que la aproximación de 111,111 m/grado, con la diferencia de que usa un valor basado en el radio más cercano a
111,319.5 m
- El desplazamiento en x debe ser una dirección este-oeste real y el desplazamiento en y una dirección norte-sur
- si el easting/northing de un sistema proyectado local está rotado, primero hay que convertirlo a componentes este-oeste y norte-sur
Opciones cuando se necesita más precisión
- La fórmula “lat/long given radial and distance” de Aviation Formulary puede usarse para calcular la nueva latitud/longitud a partir de una distancia y un rumbo
- en entornos embebidos donde se quiere minimizar el uso de funciones trigonométricas, puede resultar algo compleja
- el parámetro de distancia se maneja como un valor en radianes con la forma
distance / earth radius
- También es posible proyectar primero a un sistema plano de coordenadas adecuado para la zona y luego sumar el offset
flat_coordinate = latlon_to_utm(original_coordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)
- Este método no requiere específicamente UTM; puede usarse cualquier sistema plano de coordenadas adecuado para la región
- Sin embargo, si al desplazarte cruzas un límite de zona UTM y terminas en otra zona, no es fácil aplicarlo tal cual
Ejemplos de implementación por lenguaje y fórmulas precisas por latitud
- El ejemplo en Python convierte directamente la aproximación de 111,111 m/grado en una función
from math import cos, radians
def meters_to_lat_lon_displacement(m, origin_latitude):
lat = m / 111111
lon = m / (111111 * cos(radians(origin_latitude)))
return lat, lon
- El ejemplo en R hace el mismo cálculo
deg2rad = function(deg) {(deg * pi) / (180)}
meters_to_lat_lon_displacement = function(m, origin_latitude){
lat = m / 111111
lon = m / (111111 * cos((deg2rad(origin_latitude))))
return(list(lat=lat,lon=lon))
}
- Una fórmula más precisa de metros por grado según la latitud puede escribirse así
meters_per_degree_lat = (111132.92 - 559.82 * np.cos(2 * lat0_rad) +
1.175 * np.cos(4 * lat0_rad) - 0.0023 * np.cos(6 * lat0_rad))
meters_per_degree_lon = (111412.84 * np.cos(lat0_rad) -
93.5 * np.cos(3 * lat0_rad) + 0.118 * np.cos(5 * lat0_rad))
- Esta fórmula precisa refleja que la longitud de 1 grado de latitud y de 1 grado de longitud sigue cambiando según la latitud
- El ejemplo en Swift usa una forma que calcula el radio terrestre según la latitud y obtiene un nuevo
CLLocationCoordinate2D a partir de la distancia y el rumbo
1 comentarios
Opiniones de Hacker News
El metro se redefinió en 1791 como una diez millonésima parte del meridiano cuadrante que pasa por París, es decir, de un arco de 90 grados.
Por lo tanto, 1° ≡ 1/90 × 10^7 m = 111,111.111... m, y la circunferencia de la Tierra también queda en aproximadamente 40 millones de m, es decir, 40,000 km.
La definición inicial del metro era el péndulo de segundos, es decir, la longitud de un péndulo con un período de 2 segundos; si en T ≈ 2π√(L/g) ponemos T = 2, L = 1, queda 1 = π√(1/g), 1 = π²/g.
Por eso, que g esté cerca de π² tampoco es pura casualidad, y que 1 cm³ de agua sea 1 g también se debe a que durante mucho tiempo esa fue la definición del gramo.
Cuando el metro se definía por el péndulo de segundos, estaba completamente atado a la definición del segundo y al valor de g; escrito como fórmula, 1 m = 1 s² × g / π².
g ≈ π² sale de forma natural, pero que la circunferencia de la Tierra estuviera lo suficientemente cerca de 40,000 km como para redefinir el metro con una potencia de 10 sin cambiarlo demasiado parece una casualidad.
https://en.wikipedia.org/wiki/Second#Fraction_of_solar_day
3 pies ingleses apenas son unos 0.91 m.
La gente de la época no estaba derivando en el vacío la unidad de longitud más principista o cósmicamente bella, sino más bien tratando de definir una unidad que ya usaban de una forma que no fuera “la longitud de aquella barra de allá”.
Usar 40,000 km en vez de 360 grados, y aunque los cálculos reales usen distancias reales, la aproximación estaría lo suficientemente cerca.
Así, al menos para quienes usan el sistema métrico, no haría falta una conversión para pasarlo a distancia.
El problema de los grados es que es difícil convertirlos a una distancia útil, y aunque este truco ayuda, sería mejor no tener que convertir desde el principio.
Una milla náutica, unos 6076 ft, corresponde exactamente a 1 minuto de arco en el ecuador terrestre.
Desde el punto de vista de la navegación, ojalá todas las millas fueran millas náuticas.
La milla náutica tiene un significado real; en cambio, ¿qué significado se supone que tienen 5280 ft?
La longitud de la cadena es un subproducto de las leyes británicas de impuesto a la tierra, que gravaban según acres.
La milla romana era de 1000 pasos, es decir, 5000 ft, así que esa tenía algo más de sentido.
https://en.wikipedia.org/wiki/Gunter%27s_chain
Originalmente, la milla romana eran 5000 pies romanos.
De hecho, 1 nmi ≡ 1.852 km está definido exactamente así.
Con la definición original del metro, también sale 1/60 × 1/90 × 10^7 = 1851.85185185... m.
Una característica central del SI y de sus predecesores, MKS y CGS, fue desde el principio la posibilidad de convertir entre unidades; por eso existen relaciones como 1 m ≡ 1 s ≡ 1 kg ≡ 1 N ≡ 1 Pa ≡ 1 J ≡ 1 A ≡ 1 C ≡ 1 V ≡ 1 Ω ≡ 1 F ≡ 1 W ≡ 1 Wb ≡ 1 T ≡ 1 H ≡ 1 Hz.
Aquí uso ≡ no como una equivalencia estricta, sino para indicar de forma laxa el factor de conversión.
En el SI, lo más cercano a excepciones son el kelvin, el mol, la candela y sus unidades derivadas, aunque los dos primeros se pueden tratar limpiamente con la constante de Boltzmann y la constante de Avogadro.
Personalmente me molesta que la candela esté en el SI.
Pero en el siglo XVI Inglaterra cambió la milla a 8 furlongs para facilitar mucho los cálculos de mediciones agrícolas de la época.
https://en.m.wikipedia.org/wiki/Furlong
Suena como un argumento del tipo “las unidades tradicionales son mejores porque no se puede dividir 10 entre 3 usando solo enteros”.
Parece que, si se divide un círculo en 360 arcos, se considera que uno de esos arcos tiene algún significado a cierta distancia del foco.
Pero si tenemos en cuenta que hace unos 2000 años los griegos adoptaron el uso babilónico de 360, y que los babilonios llegaron a ese número refinando mediciones aproximadas de la cantidad de días en un año que habían usado en astronomía durante los 2000 años anteriores, el significado de la milla náutica parece más derivado y accidental que “real”.
Además, si se considera que la Tierra es un esferoide oblato, la longitud de una milla náutica varía según la ubicación.
Viví más de 10 años en Estados Unidos, pero todavía no me acostumbro al sistema imperial, y creo que seguirá siendo así
No tiene ningún sentido
El sistema métrico es como oro puro: 1cm = 10mm, 1m = 100cm, 1km = 1000m, 1kg = 1000g, 1ton = 1000kg
El sistema imperial es como si dijera “un momento” y saliera con 1in = ???, 1ft = 12in, 1yd = 3ft, 1mile = 5280ft, 1lb = 16oz
No sé quién habrá creado semejante locura
Por eso el problema aparece menos seguido de lo que uno pensaría
Incluso cuando algo está expresado por casualidad en el sistema métrico, se nota que no convierten las unidades
Por ejemplo, escriben 1000mL en vez de 1L, o 3500g en vez de 3.5kg
Un europeo podría decir “por aquí son 600m, por allá 1.2km”, pero un estadounidense casi nunca diría “por aquí son 800 yardas, por allá 1 milla”
Un europeo podría decir “tengo que llevar 4L de agua, así que la mochila pesa 4kg más”
Un estadounidense podría decir “mi botella es de 24 onzas líquidas, así que serán más o menos 24 onzas de peso”, pero si se trata de un galón, probablemente simplemente diría que pesa como un galón
En definitiva, el problema de convertir unidades resultó ser menor de lo que imaginaba, porque los estadounidenses no andan convirtiendo unidades en cada oración
Me sorprendería que más del 50% de la población sepa cuántas onzas hay en una taza de agua, o cuántos pies hay en una milla
Aun así, por suerte en Estados Unidos también la comunidad científica usa el sistema métrico como estándar
La cadena, que viene de herramientas de agrimensura, mide 22 yardas
Una cadena también equivale a 4 rods, así que un rod mide 5½ yardas, lo cual es bastante curioso
10 cadenas son un furlong, y 8 furlongs son 1 milla
Como dato, un acre es 1 furlong × 1 cadena
Aunque parezca una locura, tiene cierta lógica interna
¿Por qué habría que convertir pulgadas a millas?
En la vida no hay necesidad de convertir pulgadas, o pies y pulgadas, a millas
En carpintería o manualidades puede tener sentido por su origen, pero ¿para otros usos?
Basta con intentar leer 2 3/16" en una regla imperial tan rápido como 5.6cm
Los tamaños de tornillos también se ven afectados por esto
La distancia que recorre la luz durante 1 nanosegundo también es aproximadamente 1 pie
Impresionante :)
El resultado de
$ units c ft/nses* 0.983571061 kilochrono son 55 minutos, y en situaciones como los viajes espaciales, donde no se puede depender de unidades ligadas al día solar, podría ser bastante útil
Si la Tierra es un esferoide oblato, ¿no cambia la longitud real del arco de 1 grado de latitud?
Me pregunto si “confiable” simplemente significa “lo suficientemente cercano como para ser útil”
Llevo demasiado tiempo trabajando en cosas no relacionadas con geografía y parece que olvidé lo que antes sabía
Dejé escrito aquí, en cierta medida, el caso de uso por el que me enteré de esto: https://twitter.com/mholt6/status/1695685022710477043
Incluso si en mi caso hubiera un error de varios km, probablemente no sería cerca de las regiones polares; y si fuera en una región polar, bastaría con decir “sí, entendido, estás en el polo” y seguir adelante
La órbita terrestre es parecida
En la escuela se aprende que es una elipse, pero casi no se obtiene una sensación real de su forma, y la mayoría de las ilustraciones dan una impresión completamente equivocada
Aun así, para muchos fines prácticos es lo suficientemente cercana
Este artículo también incluye una buena regla práctica: 111,111 * cos(latitude) m es 1 grado de longitud
Me gusta la corrección
En la práctica también se pueden usar constantes simples: a 25° son unos 100,000m, a 44° unos 80,000m y a 57° unos 60,000m