Cálculo de coordenadas médias de latitude e longitude

19

Como posso calcular a média entre vários pontos de latitude e longitude?

Devo apenas calcular a média aritmética para lat e lng?

aneuryzm
fonte
3
Eu acho que a adequação da média depende do seu caso de uso. Se você estiver apenas agrupando locais de restaurantes da cidade para obter um mapa da web, a média certa funcionará na maioria das vezes. No entanto, você encontrará bugs em alguns lugares. Para um protótipo ou aplicativo de baixo orçamento, talvez esteja tudo bem. No entanto, se você estiver fazendo algo mais sério ou cobrindo uma área ampla, provavelmente precisará levar em consideração as nuances da projeção.
Glenn
1
Como esses pontos foram coletados? Em vez de perguntar como calcular a média das coordenadas, talvez pergunte se a média é uma maneira apropriada de compensar os erros de medição. Este e-livro possui muitas definições de erro.
Kirk Kuykendall
Apenas uma observação de que existem alguns casos extremos em que um "ponto médio" não está bem definido: por exemplo, em qualquer lugar do equador pode ser concebivelmente a "média" dos pólos N. e S.
Dan S.

Respostas:

15

Para uma média simples, você não deseja calcular a média das coordenadas de longitude e latitude. Isso pode funcionar muito bem em latitudes mais baixas, mas em latitudes mais altas começará a dar maus resultados e quebrará completamente perto dos pólos.

O método que eu usei para esse tipo de coisa é converter as coordenadas de longitude / latitude em coordenadas cartesianas 3d (x, y, z). Faça a média dessas (para dar um vetor cartesiano) e depois converta novamente. Observe que você provavelmente não precisa normalizar o vetor; portanto, o processo médio real pode ser uma soma simples.


Editar, aqui está o meu código :

A seguir, converte coordenadas cartesianas em latitude / longitude (em graus): Remova as RAD2DEGconstantes para radianos.

Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);

E aqui calculamos coordenadas cartesianas a partir da latitude / longitude (especificadas em radianos):

private void CalcCartesianCoord()
{
    _x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
    _y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
    _z = Math.Cos(LatitudeRadians); 
}

Ambos são cortados e colados a partir do código real, daí a mistura de graus e radianos. Existem propriedades aqui que realizam algumas das conversões (por exemplo, LatitudeRadiansé uma propriedade que retorna um valor radiano).

Observe que a otimização é possível: os cálculos duplicados do seno, por exemplo. Além disso, os cálculos de trigonometria podem ser armazenados em cache se você os chamar muito.

winwaed
fonte
1
ótimo ponto. Não acredito que esqueci de mencionar que ... a média perto dos pólos e da data já me havia mordido antes.
Glenn
3
(+1) O problema não se limita aos pólos e ao meridiano de + -180 graus: quando as latitudes dos pontos a serem calculados variam consideravelmente, uma média linear das coordenadas lat / lon equivale a usar uma projeção Plate Carree, que introduz uma distorção métrica variável aumentando com a latitude. Não há problemas numéricos, mas a média está simplesmente no local errado. Por esse motivo, os cálculos de lat / lon sugeridos na resposta de @ Glenn raramente são aceitáveis, exceto em regiões não polares relativamente pequenas.
whuber
@winwaed obrigado, você pode sugerir algum trecho de código (Java) ou um bom tutorial para fazer isso?
22611 aneuryzm
1
A matemática está em en.wikipedia.org/wiki/Spherical_coordinates em 'Coordenadas cartesianas'. (minha implementação é C # e parcialmente otimizada - mais eu estou escrevendo isso para os dentistas !!)
Winwaed
1
Eu acho que para casos de uso de engenharia precisos, você está muito correto. No entanto, a menos que seja necessária extrema precisão, a média das coordenadas WGS84 lat e lng na cidade e até nas áreas regionais funciona muito bem e fornece resultados aceitáveis ​​para a maioria dos usos em que a média seria usada.
21411 Glenn
3

Opções de cluster : Eu acho que a palavra da moda que cobre esse tipo de operação é "cluster". A média é de longe a mais simples de implementar e funciona bem para a maioria dos propósitos. A única vez em que eu usaria outra coisa é se você estiver preocupado com discrepâncias [Edit] -> ou os polos ou a linha de dados internacional. [Editar] -> também a média, embora lhe dê algo que pareça próximo ao centro do cluster, ficará um pouco fora por causa das imprecisões da projeção causadas pelo fato de que os graus de latência nem sempre estão na mesma distância separados em km / milhas. Quanto maior a área média, mais distorção.

Aqui está uma comparação de algumas opções de cluster

Média (fácil, mais rápida, imprecisa): apenas some os valores de lat e divida pela contagem e faça o mesmo para os valores de GNL. Certifique-se de procurar excesso se você estiver usando um Int32, alguns sistemas (especialmente o c #) transbordarão silenciosamente de volta aos números baixos. Você pode evitar esses erros usando a precisão do ponto flutuante no seu acumulador de soma. Um problema com esse método é que os discrepantes podem distorcer sua localização. [Editar] -> Outra é que a matemática perto dos pólos e da linha de data internacional não tem boa média e distorce os locais.

Vizinho mais próximo (um pouco mais difícil, mais lento, sem distorção externa) Em vez de calcular a média, você pode ir com o local de latência real com a menor distância média para todos os seus vizinhos. É como tomar uma "mediana". O lado negativo é que isso é computacionalmente caro, porque você compara todos os pontos com outros pontos e calcula a distância entre eles. Por exemplo, agrupar 10.000 pontos exigiria 100 milhões de cálculos de distância. Não é tão lento, mas definitivamente não escala bem.

Célula de grade (precisa de uma configuração extra, muito mais rápida, sem distorção externa) Isso é semelhante ao vizinho mais próximo, mas muito mais rápido. Você pode escolher um nível arbitrário de precisão, por exemplo, 0,01 graus lat lat (aproximadamente 1 km aproximadamente em latitudes populadas) e agrupar seus pontos em intervalos de 0,01 x 0,01 graus. Você pode então escolher o balde com mais pontos e obter a média desses pontos ou executar uma análise de vizinho mais próximo apenas nesses pontos. Eu uso muito esse método com conjuntos de dados realmente grandes (centenas de bilhões de registros) e considero um bom equilíbrio entre precisão e velocidade.

Centróide convexo do casco (resultados rígidos, lentos e organizados): você também pode desenhar uma faixa em torno de seus pontos para definir uma forma que cubra todos eles ( consulte a Wikipedia ) e depois calcular o ponto central dessa forma. As funções típicas do centróide não são ponderadas no centro; portanto, você precisa fazer algum tipo de análise inversa do vizinho mais próximo usando pontos de amostra dentro de sua forma até encontrar o mais distante das bordas. Esse método é realmente mais interessante devido ao próprio casco convexo, em vez do algoritmo de localização central, que não é rápido nem particularmente preciso. Mas a forma do casco pode ter outras aplicações úteis com seus dados.

Glenn
fonte
O @winwaed faz um ótimo comentário sobre a média de coordenadas próximas aos pólos e também adicionaria a linha de data internacional. Por exemplo, se você tem um ponto de um lado e outro do outro, obtém médias ruins (e também caixas delimitadoras). Isso raramente aparece, mas quando ele faz isso é uma verdadeira dor de depurar
Glenn
O @whuber faz uma boa observação sobre a deriva central quando você faz a média. Embora a média dê a você algo que parece próximo ao centro do cluster, ficará um pouco fora por causa das imprecisões da projeção causadas pelo fato de que os graus de latência nem sempre são a mesma distância em km / milhas. Quanto maior a área média, mais distorção.
Glenn
0

Não tenho certeza do que você está tentando alcançar, mas o ponto cuja latitude é a média de latitudes do conjunto de pontos original e longitude é a média de longitudes do conjunto de pontos original, será o ponto médio do conjunto de pontos original. [ATUALIZAÇÃO]: acima, avg é a média aritmética.

GuillaumeC
fonte
Em sua resposta, avg = média aritmética?
Aneuryzm 22/03
1
Sim, correto. Foi isso que eu quis dizer com pena pela falta de clareza. Eu atualizei a resposta. Mas eu não estou certo que eu estou trazendo algo terrivelmente útil para a mesa aqui ...
GuillaumeC