¿Cómo puedo calcular el promedio entre varios puntos de latitud y longitud?
¿Debo calcular la media aritmética para lat y lng?
¿Cómo puedo calcular el promedio entre varios puntos de latitud y longitud?
¿Debo calcular la media aritmética para lat y lng?
Respuestas:
Para una media simple, no desea promediar las coordenadas de longitud y latitud. Esto podría funcionar bastante bien en latitudes más bajas, pero en latitudes más altas comenzará a dar malos resultados y se descompondrá por completo cerca de los polos.
El método que he usado para este tipo de cosas es convertir las coordenadas de longitud / latitud en coordenadas cartesianas 3d (x, y, z). Promedie estos (para dar un vector cartesiano) y luego vuelva a convertir. Tenga en cuenta que probablemente no necesite normalizar el vector, por lo que el proceso promedio real podría ser una suma simple.
Editar, aquí está mi código C # :
Lo siguiente convierte las coordenadas cartesianas en latitud / longitud (en grados): Elimina las RAD2DEG
constantes para radianes.
Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);
Y aquí calculamos las coordenadas cartesianas a partir de la latitud / longitud (especificadas en radianes):
private void CalcCartesianCoord()
{
_x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
_y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
_z = Math.Cos(LatitudeRadians);
}
Ambos se cortan y pegan del código real, de ahí la combinación de grados y radianes. Aquí hay propiedades que realizan algunas de las conversiones (por ejemplo, LatitudeRadians
es una propiedad que devuelve un valor en radianes).
Tenga en cuenta que la optimización es posible: los cálculos senoidales duplicados, por ejemplo. Además, los cálculos trigonométricos pueden almacenarse en caché si los llama mucho.
Opciones de agrupamiento : Creo que la palabra de moda conceptual que cubre este tipo de operación es "agrupamiento". El promedio es, con mucho, el más simple de implementar y funciona bien para la mayoría de los propósitos. La única vez que usaría algo más es si le preocupan los valores atípicos [Editar] -> o los polos o la fecha internacional. [Editar] -> también promediando, aunque le dará algo que se ve cerca del centro del grupo, estará un poco apagado debido a las imprecisiones de proyección causadas por el hecho de que los grados de lat no son siempre la misma distancia aparte en km / millas. Cuanto mayor sea el área que promedia, mayor será la distorsión.
Aquí hay una comparación de algunas opciones de agrupamiento
Promedio (fácil, más rápido, impreciso): simplemente sume los valores de lat y divídalos por el recuento y haga lo mismo para los valores de lng. Asegúrese de estar atento al desbordamiento si está utilizando un Int32, algunos sistemas (especialmente c #) se desbordarán silenciosamente a los números bajos. Puede evitar estos errores usando la precisión de punto flotante para su acumulador de suma. Un problema con este método es que los valores atípicos podrían sesgar su ubicación. [Editar] -> Otro es que las matemáticas cerca de los polos y la línea de fecha internacional no promedian bien y sesgarán mal las ubicaciones.
Vecino más cercano (un poco más duro, más lento, no sesgado) En lugar de promediar, podría ir con la ubicación real de lat con la distancia promedio más pequeña a todos sus vecinos. Esto es como tomar una "mediana". La desventaja es que esto es computacionalmente costoso porque compara cada punto con cualquier otro punto y calcula la distancia entre ellos. Por ejemplo, agrupar 10,000 puntos requeriría 100 millones de cálculos de distancia ... no es tan lento pero definitivamente no escala bien.
Celda de cuadrícula (necesita un poco de configuración adicional, mucho más rápido, no sesgada) Esto es similar al vecino más cercano pero mucho más rápido. Puede elegir un nivel arbitrario de precisión, digamos .01 deg lat lng (que es aproximadamente 1 km aproximadamente en las latitudes pobladas) y agrupe sus puntos en cubos de .01 x .01 grados. Luego, puede elegir el cubo con la mayor cantidad de puntos y tomar el promedio de esos puntos o ejecutar un análisis de vecino más cercano solo en esos puntos. Utilizo mucho este método con conjuntos de datos realmente grandes (cientos de miles de millones de registros) y encuentro un buen equilibrio entre precisión y velocidad.
Centroide convexo del casco (resultados duros, más lentos y limpios): también puede dibujar una banda alrededor de sus puntos para definir una forma que los cubra a todos ( consulte wikipedia ) y luego calcular el punto central de esta forma. Las funciones centroides típicas no están ponderadas en el centro, por lo que necesitaría algún tipo de análisis inverso del vecino más cercano usando puntos de muestra dentro de su forma hasta que encuentre el más alejado de los bordes. Este método es realmente más interesante debido al casco convexo en sí mismo que al algoritmo de búsqueda central real, que no es ni rápido ni particularmente preciso ... pero la forma del casco puede tener otras aplicaciones útiles con sus datos.
No estoy seguro de lo que está tratando de lograr, pero el punto cuya latitud es el promedio de las latitudes del conjunto de puntos original y la longitud es el promedio de las longitudes del conjunto de puntos original, será el punto promedio del conjunto de puntos original. [ACTUALIZACIÓN]: En lo anterior, avg es la media aritmética.