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?
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?
Respostas:
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 c # :
A seguir, converte coordenadas cartesianas em latitude / longitude (em graus): Remova as RAD2DEG
constantes 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.
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.
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.