Como mapear uma latitude/longitude para um mapa distorcido?
-
08-06-2019 - |
Pergunta
Eu tenho vários pares de latitude/longitude que mapeiam coordenadas x/y conhecidas em um mapa (geograficamente distorcido).
Então eu tenho mais um par latitude/longitude.Quero plotá-lo no mapa da melhor maneira possível.Como faço para fazer isso?
No início, decidi criar um sistema de equações lineares para os três pontos lat/long mais próximos e calcular uma transformação a partir deles, mas isso não funciona nada bem.Como se trata de um sistema linear, também não posso usar mais pontos próximos.
Você não pode presumir que o Norte está em alta:tudo o que você tem são os mapeamentos lat/long->x/y existentes.
EDITAR:não é uma projeção de Mercator, nem nada parecido.É arbitrariamente distorcido para facilitar a leitura (pense no mapa do metrô).Quero usar apenas os 5 a 10 mapeamentos mais próximos, para que a distorção em outras partes do mapa não afete o mapeamento que estou tentando calcular.
Além disso, o mapa inteiro está em uma área geográfica muito pequena, então não há necessidade de se preocupar com o globo – as suposições da Terra plana são boas o suficiente.
Solução
Existem detalhes mais específicos sobre o tipo de distorção?Se, por exemplo, suas latitudes e longitudes estiverem "distorcidas" em seu mapa 2D usando uma projeção de Mercator, a matemática de conversão será prontamente disponível.
Se o mapa for distorcido de forma verdadeiramente arbitrária, há muitas coisas que você pode tentar, mas a mais simples provavelmente seria calcular um média ponderada de seus mapeamentos de pontos existentes.Seus pesos podem ser o inverso ao quadrado da distância x/y do seu novo ponto até cada um dos pontos existentes.
Algum pseudocódigo:
estimate-latitude-longitude (x, y)
numerator-latitude := 0
numerator-longitude := 0
denominator := 0
for each point,
deltaX := x - point.x
deltaY := y - point.y
distSq := deltaX * deltaX + deltaY * deltaY
weight := 1 / distSq
numerator-latitude += weight * point.latitude
numerator-longitude += weight * point.longitude
denominator += weight
return (numerator-latitude / denominator, numerator-longitude / denominator)
Este código fornecerá uma aproximação relativamente simples.Se você puder ser mais preciso sobre a forma como a projeção distorce as coordenadas geográficas, provavelmente conseguirá fazer muito melhor.
Outras dicas
Tudo bem.Do ponto de vista teórico, dado que a distorção é "arbitrária" e qualquer solução exige que você modele essa distorção arbitrária, obviamente não será possível obter uma "resposta".Contudo, qualquer solução envolverá a imposição (geralmente de forma implícita) de algum modelo de distorção que pode ou não refletir a realidade da situação.
Como você parece estar mais interessado em modelos que presumem algum tipo de continuidade local do mapeamento de distorção, a escolha mais óbvia é aquela que você já tentou:interpolação linear entre os pontos mais próximos.Ir além disso exigirá conhecimentos de análise matemática e numérica mais sofisticados.
Você está incorreto, entretanto, ao presumir que não pode expandir isso para mais pontos.Você pode usar uma abordagem de erro mínimo quadrático.Encontre a resposta linear que minimiza o erro dos outros pontos.Esta é provavelmente a extensão mais direta.Em outras palavras, pegue os 5 pontos mais próximos e tente chegar a uma aproximação linear que minimize o erro desses pontos.E use isso.Eu tentaria isso a seguir.
Se isso não funcionar, a suposição de linearidade na área de N pontos será quebrada.Nesse ponto, você precisará atualizar para um modelo quadrático ou cúbico.A matemática vai ficar agitada nesse ponto.
o problema é que a esfera pode ser distorcida de várias maneiras, e ter todos esses pontos conhecidos no equador, digamos, não ajudará a mapear pontos mais distantes.
Você precisa de pontos 'próximos' melhores, então pode assumir que esses três pontos estão em um plano com o quarto e fazer a interpolação - sabendo que a distância das longitudes é uma função, não uma constante.
Hum.Talvez esteja faltando alguma coisa sobre a questão aqui, mas se você tiver informações longas/laterais, também terá a direção do norte?
Parece que você precisa mapear coordenadas geodésicas para um sistema de coordenadas projetado.Por exemplo, osgb para wgs84.
A matemática envolvida não é trivial, mas o código tem apenas algumas linhas.Se eu tivesse mais tempo postaria mais, mas preciso de um banho, então vou ser chato e colocar o link para o Wikipédia entrada que é muito boa.
Observação:Pós-banho editado.