Dado um conjunto de pontos de latitude e longitude, como posso calcular a latitude e a longitude do ponto central desse conjunto (também conhecido como um ponto que centralizaria uma vista em todos os pontos)?
EDIT: solução Python que eu usei:
Convert lat/lon (must be in radians) to Cartesian coordinates for each location.
X = cos(lat) * cos(lon)
Y = cos(lat) * sin(lon)
Z = sin(lat)
Compute average x, y and z coordinates.
x = (x1 + x2 + ... + xn) / n
y = (y1 + y2 + ... + yn) / n
z = (z1 + z2 + ... + zn) / n
Convert average x, y, z coordinate to latitude and longitude.
Lon = atan2(y, x)
Hyp = sqrt(x * x + y * y)
Lat = atan2(z, hyp)
math
latitude-longitude
geo
Zeke
fonte
fonte
z
, pls?Respostas:
A abordagem simples de apenas calculá-los em média tem casos extremos estranhos com ângulos quando eles envolvem de 359 'de volta a 0'.
Uma pergunta muito anterior sobre o SO perguntou sobre como encontrar a média de um conjunto de ângulos da bússola.
Uma expansão da abordagem recomendada para coordenadas esféricas seria:
fonte
Obrigado! Aqui está uma versão C # das soluções da OP usando graus. Ele utiliza a classe System.Device.Location.GeoCoordinate
fonte
Achei este post muito útil, então aqui está a solução em PHP. Eu tenho usado isso com sucesso e só queria salvar outro desenvolvedor há algum tempo.
fonte
Post muito útil! Eu implementei isso em JavaScript, por meio deste código. Eu usei isso com sucesso.
fonte
Versão Javascript da função original
fonte
No interesse de possivelmente salvar alguém em um minuto ou dois, eis a solução que foi usada no Objective-C em vez de python. Esta versão utiliza um NSArray de NSValues que contém MKMapCoordinates, o que foi solicitado em minha implementação:
fonte
<GLKit/GLKMath.h>
e utilizaçãoGLKMathDegreesToRadians
eGLKMathRadiansToDegrees
soluções muito boas, exatamente o que eu precisava para o meu projeto rápido, então aqui está uma porta rápida. obrigado e aqui também está um projeto de playground: https://github.com/ppoh71/playgounds/tree/master/centerLocationPoint.playground
fonte
Se você estiver interessado em obter um "centro" muito simplificado dos pontos (por exemplo, para simplesmente centralizar um mapa no centro do polígono do seu gmaps), então aqui está uma abordagem básica que funcionou para mim.
Isso retorna a coordenada lat / lng do meio para o centro de um polígono.
fonte
No Django, isso é trivial (e realmente funciona, eu tive problemas com várias soluções que não retornavam corretamente negativos para latitude).
Por exemplo, digamos que você esteja usando django-geopostcodes (do qual sou o autor).
point
é umaPoint
instância do Django que pode ser usada para fazer coisas como recuperar todos os objetos que estão a 10 km desse ponto central;Mudar isso para Python bruto é trivial;
Sob o capô, o Django está usando o GEOS - mais detalhes em https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/
fonte
Versão Java, se alguém precisar. Constantes definidas como estáticas para não calculá-las duas vezes.
fonte
Aqui está a versão do Android baseada na resposta C # do Yodacheese usando a API do Google Maps:
no aplicativo build.gradle, adicione:
fonte
É o mesmo que um problema médio ponderado, onde todos os pesos são iguais e existem duas dimensões.
Encontre a média de todas as latitudes para a latitude central e a média de todas as longitudes para a longitude central.
Advertência do Emptor: Esta é uma aproximação a curta distância e o erro se tornará indisciplinado quando os desvios da média forem superiores a alguns quilômetros devido à curvatura da Terra. Lembre-se de que latitudes e longitudes são graus (não é realmente uma grade).
fonte
Se você deseja levar em consideração o elipsóide em uso, pode encontrar as fórmulas aqui http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf
ver anexo B
O documento contém muitas outras coisas úteis
B
fonte
Fora do objeto em PHP. Dada matriz de pares de coordenadas, retorna ao centro.
Ideia tirada do nº 4
fonte
Aqui está a versão python para encontrar o ponto central. Lat1 e lon1 são listas de latitude e longitude. retuen a latitude e longitude do ponto central.
fonte
Implementação de dardo no Flutter para encontrar o ponto central da latitude múltipla, longitude.
importar pacote matemático
Lista de latitude e longitude
fonte
Se você quiser que todos os pontos fiquem visíveis na imagem, deseje os extremos em latitude e longitude e verifique se sua visualização inclui esses valores com a borda desejada.
(A partir da resposta de Alnitak, como você calcula os extremos pode ser um pouco problemático, mas se eles estiverem alguns graus em ambos os lados da longitude que rodeia, então você dará o tiro e tomará o alcance certo.)
Se você não deseja distorcer o mapa em que esses pontos estão, ajuste a proporção da caixa delimitadora para que se ajuste aos pixels que você alocou na visualização, mas ainda inclua os extremos.
Para manter os pontos centralizados em algum nível de zoom arbitrário, calcule o centro da caixa delimitadora que "apenas se encaixa" nos pontos como acima e mantenha esse ponto como o ponto central.
fonte
Eu fiz essa tarefa em javascript como abaixo
fonte
Como uma apreciação para este segmento, aqui está minha pequena contribuição com a implementação em Ruby, na esperança de salvar alguém a alguns minutos do seu precioso tempo:
fonte
Usei uma fórmula que recebi de www.geomidpoint.com e escrevi a seguinte implementação em C ++. As classes
array
egeocoords
são minhas, cuja funcionalidade deve ser auto-explicativa.fonte
Dardo / vibração Calcule o ponto central de vários pares de coordenadas de latitude / longitude
fonte