Calcular un promedio de coordenadas de latitud y longitud

19

¿Cómo puedo calcular el promedio entre varios puntos de latitud y longitud?

¿Debo calcular la media aritmética para lat y lng?

aneuryzm
fuente
3
Creo que lo apropiado del promedio depende de su caso de uso. Si solo está agrupando ubicaciones de restaurantes de la ciudad para un mapa web, el promedio seguro funcionará la mayor parte del tiempo. Sin embargo, obtendrá errores en algunos lugares ... para un prototipo o una aplicación de bajo presupuesto, tal vez esté bien. Sin embargo, si está haciendo algo más serio o está cubriendo un área amplia, entonces probablemente deba tener en cuenta los matices de proyección.
Glenn
1
¿Cómo se recogieron estos puntos? En lugar de preguntar cómo promediar las coordenadas, quizás pregunte si promediar es una forma apropiada de compensar los errores de medición. Este libro electrónico tiene muchas definiciones de error.
Kirk Kuykendall el
Solo una nota de que hay algunos casos extremos donde un "punto promedio" no está bien definido: por ejemplo, en cualquier parte del ecuador podría ser el "promedio" de los polos N. y S.
Dan S.

Respuestas:

15

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 :

Lo siguiente convierte las coordenadas cartesianas en latitud / longitud (en grados): Elimina las RAD2DEGconstantes 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, LatitudeRadianses 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.

winwaed
fuente
1
gran punto No puedo creer que olvidé mencionar que ... promediar cerca de los polos y la línea de fecha me ha mordido antes.
Glenn
3
(+1) El problema no se limita a los polos y al meridiano de + -180 grados: cuando las latitudes de los puntos a promediar varían considerablemente, un promedio recto de las coordenadas lat / lon equivale a usar una proyección Plate Carree, que introduce una distorsión métrica variable que aumenta con la latitud. No hay problemas numéricos, pero el promedio simplemente está en la ubicación incorrecta. Por esta razón, los cálculos de lat / lon sugeridos en la respuesta de @ Glenn rara vez son aceptables, excepto para regiones no polares relativamente pequeñas.
whuber
@winwaed gracias, ¿puedes sugerir algún fragmento de código (Java) o un buen tutorial para hacer esto?
aneuryzm 23/03/11
1
La matemática está en en.wikipedia.org/wiki/Spherical_coordinates bajo 'Coordenadas cartesianas'. (mi implementación es C # y está parcialmente optimizada, ¡además estoy escribiendo esto en los dentistas!)
winwaed
1
Creo que para casos de uso de ingeniería precisos es muy correcto. Sin embargo, a menos que se requiera una precisión extrema, promediar las coordenadas WGS84 lat, lng en la ciudad e incluso en áreas regionales funciona bastante bien y da resultados que son aceptablemente precisos para la mayoría de los usos donde se usaría el promedio.
Glenn
3

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.

Glenn
fuente
@winwaed hace un gran punto sobre el promedio de coordenadas cerca de los polos y también agregaría la línea de fecha internacional. Por ejemplo, si tiene un punto en un lado y otro en el otro, obtiene algunos promedios malos (y también cuadros delimitadores). Esto rara vez aparece, pero cuando lo hace, es un verdadero dolor de depuración
Glenn
@whuber hace un buen punto sobre la deriva del centro cuando promedia. Si bien el promedio 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 lng no siempre están a la misma distancia en km / millas. Cuanto mayor sea el área que promedia, mayor será la distorsión.
Glenn
0

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.

GuillaumeC
fuente
En su respuesta, avg = media aritmética?
aneuryzm
1
Sí correcto. A eso me refería perdón por la falta de claridad. Actualicé la respuesta. Pero no estoy seguro de que voy a llevar algo muy útil a la mesa aquí ...
GuillaumeC