3 puntos por GN⁺ 2023-08-28 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2023-08-28
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.

    • El segundo es una unidad más antigua que la redefinición del metro y viene de dividir el día de una forma “bonita”, así que todavía parece quedar algo de casualidad.
      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
    • Con un solo entero de 32 bits se puede representar latitud o longitud con una precisión aproximada de 1 cm :D
    • El metro en realidad también se parece a 3 pies de París, unos 0.97 m.
      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á”.
    • Me gustaría que el sistema de coordenadas GPS simplemente usara kilómetros.
      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.
    • Francia también aplicó la decimalización a los ángulos, así que en realidad 1 gon = 100 km y 1 km no es más que 1 centigon.
  • 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 razón por la que una milla son 5280 ft es que equivale a 80 cadenas.
      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
    • La mayoría de las otras “millas” derivan de la milla romana, y evolucionaron con cierta independencia de unidades inglesas como el pie, la yarda, la pulgada y el barleycorn, por eso los factores de conversión terminan siendo raros.
      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.
    • Curiosamente, la milla originalmente era una menos rara de 5000 ft.
      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
    • Hubiera sido bueno que la gente medieval hubiera definido la milla como 5040 ft; entonces se podría dividir entre 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 28, 30, 35, 36, 40, 42, 45, 48, 56, 60, 63, 70, 72, 80, 84, 90, 105, 112, 120, 126, 140, 144, 168, 180, 210, 240, 252, 280, 315, 336, 360, 420, 504, 560, 630, 720, 840, 1008, 1260, 1680, 2520.
    • Me pregunto qué significa real en “la milla náutica tiene un significado real”.
      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

    • Algo que entendí viviendo en Estados Unidos es que la mayoría de los estadounidenses no convierten entre unidades salvo que realmente lo necesiten
      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
    • Creo que incluso entre quienes crecieron en Estados Unidos hay bastante gente que no entiende del todo este sistema
      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
    • Se omitieron algunas unidades intermedias, y conocerlas ayuda a explicarlo un poco
      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
    • ¿A qué se supone que habría que convertir las pulgadas?
      ¿Por qué habría que convertir pulgadas a millas?
      En la vida no hay necesidad de convertir pulgadas, o pies y pulgadas, a millas
    • Convertir unidades también es incómodo, pero creo que lo peor de verdad es la notación de longitudes con fracciones
      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

    • Es sorprendentemente cercana a la real
      Impresionante :)
      El resultado de $ units c ft/ns es * 0.98357106
    • La distancia que recorre el sonido durante 1 milisegundo también es aproximadamente 1 pie
    • Sería interesante cambiar el tiempo y definir 1 chrono como el tiempo que tarda la luz en recorrer 1e9 m
      1 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
    • La cantidad de segundos en un año también está lo suficientemente cerca de π*10^7
    • 1 googol femtobarns también es aproximadamente 1 square teraparsecs
  • 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

    • Confiable significa lo suficientemente cercano como para ser útil, y en zonas con mucha población la estimación también es bastante precisa
      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
    • El diámetro ecuatorial de la Tierra es 43 km mayor que el diámetro polar
      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
    • Solo por el título del artículo uno podría pensar que la variación en la longitud de 1 grado de latitud es de menos de 1 decímetro, pero por supuesto no es así
      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