- 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
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
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
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”
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
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?
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 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
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
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
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
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
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
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
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é
Impressionante :)
O resultado de
$ units c ft/nsé* 0.983571061 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
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
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”
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
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