Es importante entender el código correctamente antes de utilizarlo a tu proyecto y si tquieres aportar algo puedes decirlo en los comentarios.
Solución:
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 convertirlos. Tenga en cuenta que probablemente no necesite normalizar el vector, por lo que el proceso promedio real podría ser una simple suma.
Editar, aquí está mi código C#:
Lo siguiente convierte coordenadas cartesianas a latitud/longitud (en grados): Retire el 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 a partir de código real, de ahí la mezcla de grados y radianes. Aquí hay propiedades que hacen algunas de las conversiones (p. LatitudeRadians
es una propiedad que devuelve un valor en radianes).
Tenga en cuenta que la optimización es posible: los cálculos de seno duplicado, por ejemplo. Además, los cálculos trigonométricos pueden almacenarse en caché si los llama mucho.
Opciones de agrupación: Creo que la palabra de moda conceptual que cubre este tipo de operación es “agrupación”. 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 te preocupan los valores atípicos [Edit]-> o los polos o la fecha internacional. [Edit]–> también promediar, aunque le dará algo que se ve cerca del centro del grupo, estará un poco fuera de lugar debido a las imprecisiones de proyección causadas por el hecho de que los grados de latitud y longitud no siempre están separados por la misma distancia en km /millas. Cuanto mayor sea el área que promedie, mayor será la distorsión.
Aquí hay una comparación de algunas opciones de agrupamiento
Promedio (fácil, rápido, impreciso): simplemente sume los valores de lat y divida por el conteo 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á silenciosamente a los números bajos. Puede evitar estos errores utilizando la precisión de punto flotante para su acumulador de sumas. Un problema con este método es que los valores atípicos podrían sesgar su ubicación. [Edit]-> Otra es que las matemáticas cerca de los polos y la línea de fecha internacional no promedian bien y sesgarán las ubicaciones de manera grave.
Vecino más cercano (un poco más difícil, más lento, no sesgado por valores atípicos) En lugar de promediar, podría ir con la ubicación real de latitud y longitud 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.
Grid Cell (necesita un poco de configuración adicional, mucho más rápido, no sesgado por valores atípicos) Esto es similar al vecino más cercano pero mucho más rápido. Puede elegir un nivel arbitrario de precisión, digamos 0,01 grados de latitud larga (que es aproximadamente 1 km aproximadamente en latitudes pobladas) y agrupar sus puntos en cubos de 0,01 x 0,01 grados. Luego, puede elegir el depósito 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. Uso 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 de casco convexo (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 (ver wikipedia) y luego calcular el punto central de esta forma. Las funciones de centroide típicas no tienen ponderación central, por lo que necesitará algún tipo de análisis inverso del vecino más cercano utilizando puntos de muestra dentro de su forma hasta que encuentre el que está más alejado de los bordes. Este método es realmente más interesante debido al propio casco convexo que al algoritmo real de búsqueda del centro, que no es ni rápido ni particularmente preciso… pero la forma del casco puede tener otras aplicaciones útiles con sus datos.
Te mostramos las comentarios y valoraciones de los lectores
Recuerda dar difusión a este enunciado si si solucionó tu problema.