3 pontos por GN⁺ 2023-08-28 | 1 comentários | Compartilhar no WhatsApp
  • Ao somar deslocamentos x,y em metros a coordenadas de latitude/longitude, se a distância for de alguns km ou menos e não estiver perto dos polos, é possível calcular rapidamente apenas com uma fórmula de aproximação simples
  • O cálculo básico considera 111.111m no eixo y como 1 grau de latitude e 111.111 * cos(latitude)m no eixo x como 1 grau de longitude; assim, para mover 100m para o norte, basta somar 100 / 111111 graus
  • A mesma ideia também pode ser calculada assumindo a Terra como uma esfera de raio R=6378137, com dLat=dn/R e dLon=de/(R*cos(lat)); em latitude 51, com dn=100 e de=100, obtém-se latO=51.00089832 e lonO=0.001427437
  • Se a exigência de precisão for de até 10m e o offset for de até 1km, pode-se usar fórmulas mais complexas como as do Aviation Formulary, mas mesmo a aproximação plana simples deve ficar com erro inferior a 50m em offsets de 1km
  • Se for necessário lidar também com o efeito de a extensão de 1 grau variar conforme a latitude, é mais seguro usar a fórmula de meters per degree ou converter para um sistema de coordenadas projetadas local, somar o deslocamento e depois voltar para latitude/longitude

Para deslocamentos pequenos, a aproximação de 111.111m/grau é suficiente

  • Para deslocamentos pequenos, a variação em latitude/longitude pode ser calculada com a seguinte aproximação
    • no eixo y, 111.111m ≈ 1 grau de latitude
    • no eixo x, 111.111 * cos(latitude)m ≈ 1 grau de longitude
  • As novas coordenadas podem ser obtidas aproximadamente assim
    • lat_new = lat + dy / 111111
    • lon_new = lon + dx / (111111 * cos(latitude))
  • Em cos(latitude), deve-se usar a unidade adequada ao ambiente de execução
    • em ambientes que exigem radianos, é necessário converter com latitude * pi / 180
  • Essa aproximação é adequada quando o deslocamento não é muito grande, não está muito próximo dos polos e a precisão exigida não é extremamente alta

De onde vem o número 111.111m e qual é a faixa de erro

  • O valor 111.111 está ligado à definição histórica do metro
    • a França originalmente definiu o metro como 10^7 avos da distância do equador ao polo norte ao longo do meridiano de Paris
    • por isso, 10^7 / 90 = 111.111,1m corresponde a 1 grau de latitude
  • Em uma verificação nos comentários, ao comparar um deslocamento de 1.400m em x e 1.400m em y, com deslocamento total de 2km, com cálculos em UTM, o resultado bateu com erro de até 8,6m
    • nessa condição, a pior latitude foi 81 graus
    • o erro permaneceu abaixo de 10m até mais de 89,6 graus
  • A fórmula simples reflete o efeito de a longitude se estreitar em direção às regiões polares com cos(latitude)
    • como a distância real de 1 grau de longitude diminui, o mesmo deslocamento em metros no eixo x se converte em uma variação maior de longitude em latitudes elevadas

O mesmo cálculo usando o raio da Terra

  • O mesmo cálculo também pode ser expresso com uma fórmula baseada no raio da Terra
//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 exemplo retorna o seguinte resultado
latO = 51,00089832
lonO = 0,001427437
  • Esse método é praticamente a mesma solução da aproximação de 111.111m/grau, com a diferença de usar um valor baseado no raio mais próximo de 111.319,5m
  • O deslocamento em x deve estar próximo da direção leste-oeste real, e o deslocamento em y da direção norte-sul
    • se o easting/northing de um sistema de projeção local estiver rotacionado, primeiro é preciso convertê-lo para componentes leste-oeste e norte-sul

Opções quando é necessária mais precisão

  • A fórmula “lat/long given radial and distance” do Aviation Formulary pode ser usada para calcular nova latitude/longitude a partir de distância e azimute
    • em ambientes embarcados onde se deseja reduzir o uso de trigonometria, ela pode ser um pouco complexa
    • o parâmetro de distância é tratado como um valor em radianos na forma distance / earth radius
  • Também é possível projetar para um sistema plano adequado à região e então somar o offset
flat_coordinate = latlon_to_utm(original_coordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)
  • Esse método não exige especificamente UTM; qualquer sistema plano adequado à região pode ser usado
  • Porém, se após o deslocamento houver cruzamento do limite entre zonas UTM, a aplicação direta fica mais difícil

Exemplos de implementação por linguagem e fórmulas precisas por latitude

  • O exemplo em Python transforma diretamente a aproximação de 111.111m/grau em função
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
  • O exemplo em R faz o mesmo 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))
}
  • Fórmulas mais precisas de meters per degree por latitude podem ser usadas assim
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))
  • Essas fórmulas precisas refletem o fato de que a extensão de 1 grau de latitude e de longitude continua variando conforme a latitude
  • O exemplo em Swift usa uma forma de calcular o raio da Terra conforme a latitude e obter um novo CLLocationCoordinate2D a partir de distância e azimute

1 comentários

 
GN⁺ 2023-08-28
Opiniões no Hacker News
  • O metro foi redefinido em 1791 como a décima milionésima parte do meridiano quadrante que passa por Paris, ou seja, do comprimento de um arco de 90 graus
    Portanto, 1° ≡ 1/90 × 10^7 m = 111.111,111... m, e a circunferência da Terra também fica em torno de 40 milhões de m, ou 40.000 km
    A definição inicial do metro era o pêndulo de segundos, isto é, o comprimento de um pêndulo com período de 2 segundos; em T ≈ 2π√(L/g), colocando T = 2 e L = 1, temos 1 = π√(1/g), 1 = π²/g
    Então o fato de g ser próximo de π² também não é mera coincidência, e 1 cm³ de água ser 1 g também vem do fato de isso ter sido, por muito tempo, a definição do grama

    • O segundo é uma unidade mais antiga que a redefinição do metro e veio de dividir o dia de uma forma “bonita”, então ainda parece haver um pouco de acaso
      Quando o metro era definido pelo pêndulo de segundos, ele ficava totalmente vinculado à definição do segundo e ao valor de g; em fórmula, 1 m = 1 s² × g / π²
      g ≈ π² surge naturalmente, mas o fato de a circunferência da Terra ser suficientemente próxima de 40.000 km para que redefinir o metro como uma potência de 10 não causasse grande mudança parece coincidência
      https://en.wikipedia.org/wiki/Second#Fraction_of_solar_day
    • É possível representar latitude ou longitude com precisão de cerca de 1 cm usando um único inteiro de 32 bits :D
    • O metro, na prática, também é parecido com 3 pés de Paris, dando cerca de 0,97 m
      3 pés ingleses são apenas cerca de 0,91 m
      As pessoas da época não estavam derivando, no vácuo, a unidade de comprimento mais principiada ou cosmicamente bela; era mais como tentar definir uma unidade já usada de um jeito que não fosse “o comprimento daquela barra ali”
    • Fico pensando que seria bom se o sistema de coordenadas GPS fosse simplesmente em quilômetros
      Usar 40.000 km em vez de 360 graus, e nos cálculos reais usar a distância real, mas a aproximação já é próxima o suficiente
      Assim, pelo menos para usuários do sistema métrico, não seria necessária uma conversão para transformar em distância
      O problema dos graus é que é difícil convertê-los em distâncias úteis; esse truque ajuda, mas é melhor não precisar de conversão desde o início
    • A França também aplicou decimalização aos ângulos, então, na prática, 1 gon = 100 km e 1 km é apenas 1 centigon
  • Uma milha náutica, cerca de 6076 ft, corresponde exatamente a 1 minuto de arco no equador da Terra
    Do ponto de vista de quem navega, seria bom se todas as milhas fossem milhas náuticas
    A milha náutica tem significado real; já 5280 ft, afinal, que significado tem?

    • A razão de a milha ter 5280 ft é que ela tem o comprimento de 80 correntes
      O comprimento da corrente é um subproduto da legislação britânica de imposto territorial, que tributava com base no acre
      A milha romana era de 1000 passos, ou 5000 ft, então fazia um pouco mais de sentido
      https://en.wikipedia.org/wiki/Gunter%27s_chain
    • A maioria das outras “milhas” derivou da milha romana e se desenvolveu de forma relativamente independente de unidades inglesas como pé, jarda, polegada e grão de cevada, deixando os fatores de conversão estranhos
      A milha romana original tinha 5000 pés romanos
      Na verdade, 1 nmi ≡ 1,852 km é definido exatamente
      Pela definição original do metro, também se obtém 1/60 × 1/90 × 10^7 = 1851,85185185... m
      Uma característica central do SI e de seus predecessores, MKS e CGS, era desde o início a conversibilidade entre unidades, e por isso há relações 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
      Aqui, ≡ não é usado como equivalência rigorosa, mas no sentido de indicar de forma solta um fator de conversão
      No SI, o que chega perto de ser exceção são kelvin, mol, candela e suas unidades derivadas; os dois primeiros podem ser tratados de forma elegante pelas constantes de Boltzmann e de Avogadro
      Pessoalmente, fico insatisfeito com a candela estar no SI
    • Curiosamente, a milha originalmente era um 5000 ft menos estranho
      Mas, nos anos 1500, a Inglaterra mudou a milha para 8 furlongs para facilitar muito os cálculos de medições agrícolas da época
      https://en.m.wikipedia.org/wiki/Furlong
    • Teria sido bom se as pessoas medievais tivessem definido a milha como 5040 ft; assim ela seria divisível por 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
    • Fico curioso sobre o que real quer dizer em “a milha náutica tem significado real”
      Parece um argumento do tipo “unidades tradicionais são melhores porque não dá para dividir 10 por 3 usando apenas inteiros”
      Ao dividir um círculo em 360 arcos, parece-se assumir que um desses arcos tem algum significado a uma certa distância do foco
      Mas, considerando que a Grécia adotou o uso babilônico do 360 cerca de 2000 anos atrás, e que os babilônios chegaram a esse número refinando medições aproximadas do número de dias de um ano usadas na astronomia durante os 2000 anos anteriores, o significado da milha náutica parece mais derivado e acidental do que “real”
      Além disso, levando em conta que a Terra é um esferoide oblato, o comprimento de uma milha náutica varia conforme a localização
  • Moro nos EUA há mais de 10 anos, mas ainda não me acostumei com o sistema imperial, e acho que nunca vou me acostumar
    Ele simplesmente não faz sentido nenhum
    O sistema métrico é como ouro puro: 1 cm = 10 mm, 1 m = 100 cm, 1 km = 1000 m, 1 kg = 1000 g, 1 ton = 1000 kg
    O sistema imperial parece dizer “só um instante” e vem com coisas como 1 in = ???, 1 ft = 12 in, 1 yd = 3 ft, 1 mile = 5280 ft, 1 lb = 16 oz
    Não faço ideia de quem criou essa insanidade

    • Uma coisa que percebi morando nos EUA é que a maioria dos americanos não converte unidades entre si a menos que realmente precise
      Por isso, o problema aparece com menos frequência do que eu imaginava
      Mesmo quando algo por acaso aparece em unidades métricas, chama atenção que eles não convertem as unidades
      Por exemplo, escrevem 1000 mL em vez de 1 L, ou 3500 g em vez de 3,5 kg
      Um europeu pode dizer “daqui são 600 m, dali são 1,2 km”, mas um americano quase nunca diria “daqui são 800 jardas, dali é 1 milha”
      Um europeu pode dizer “preciso levar 4 L de água, então a mochila ficou 4 kg mais pesada”
      Um americano talvez diga “minha garrafa tem 24 onças fluidas, então deve dar mais ou menos 24 onças de peso”, mas, se for um galão, é mais provável que simplesmente diga que pesa algo como um galão
      No fim, o problema de conversão de unidades foi menor do que eu imaginava, porque os americanos não ficam convertendo unidades a cada frase
    • Acho que há bastante gente que cresceu nos EUA e também não entende completamente esse sistema
      Eu ficaria surpreso se mais de 50% da população soubesse quantas onças cabem em um copo de água ou quantos pés há em uma milha
      Ainda bem que, mesmo nos EUA, a comunidade científica usa o sistema métrico como padrão
    • Algumas unidades intermediárias foram puladas, e conhecê-las explica um pouco a coisa
      A chain, vinda de instrumentos de agrimensura, tem 22 jardas
      Uma chain também tem 4 rods, então um rod tem 5½ jardas, o que é bem estranho
      10 chains formam um furlong, e 8 furlongs formam 1 milha
      Como referência, um acre é 1 furlong × 1 chain
      Mesmo parecendo loucura, há certa lógica interna nisso
    • Converter polegadas para o quê, exatamente?
      Por que alguém precisaria converter polegadas para milhas?
      Na vida, não há ocasião para transformar polegadas, ou pés e polegadas, em milhas
    • Conversão de unidades já é inconveniente, mas acho que o pior mesmo é a notação de comprimentos em frações
      Em marcenaria ou artesanato, talvez faça sentido por origem histórica, mas e em outros usos?
      Tente ler 2 3/16" em uma régua imperial tão rapidamente quanto 5,6 cm
      Tamanhos de parafusos também sofrem esse efeito
  • A distância percorrida pela luz durante 1 nanossegundo também é aproximadamente 1 pé

    • É surpreendentemente próxima do valor real
      Impressionante :)
      O resultado de $ units c ft/ns é * 0.98357106
    • A distância percorrida pelo som durante 1 milissegundo também é aproximadamente 1 pé
    • Seria legal mudar a unidade de tempo e definir 1 chrono como o tempo que a luz leva para percorrer 1e9 m
      1 kilochrono dá 55 minutos, e em situações como viagens espaciais, em que não dá para depender de unidades baseadas no dia solar, isso seria bastante útil
    • O número de segundos em um ano também é suficientemente próximo de π*10^7
    • 1 googol femtobarns também é aproximadamente 1 square teraparsecs
  • Se a Terra é um esferoide oblato, o comprimento real do arco de 1 grau de latitude não varia?
    Fico pensando se “confiável” quer dizer apenas “perto o bastante para ser útil”
    Acho que faz tempo demais que não trabalho com coisas ligadas a geografia e acabei esquecendo o que sabia antes

    • Confiável significa perto o bastante para ser útil, e em regiões com muita população a estimativa também é bem precisa
      Anotei até certo ponto aqui o caso de uso em que descobri isso: https://twitter.com/mholt6/status/1695685022710477043
      Mesmo que, no meu caso, haja erro de alguns km, provavelmente não é perto das regiões polares; e, se for no polo, dá para simplesmente relevar com um “certo, entendi, você está no polo”
    • O diâmetro equatorial da Terra é 43 km maior que o diâmetro polar
      A órbita da Terra é parecida
      Na escola aprendemos que é uma elipse, mas quase não recebemos uma noção real do formato, e a maioria das ilustrações passa uma impressão totalmente errada
    • Só pelo título do texto, alguém poderia pensar que a variação no comprimento de 1 grau de latitude é menor que 1 decímetro, mas é claro que não é
      Ainda assim, para muitos fins práticos, é próximo o bastante
  • Este texto também traz uma boa regra prática: 111.111 * cos(latitude) m é 1 grau de longitude
    Gosto dessa correção
    Na prática, também dá para usar constantes simples: 25° é cerca de 100.000 m, 44° é cerca de 80.000 m, e 57° é cerca de 60.000 m