Dado un conjunto de puntos de latitud y longitud, ¿cómo puedo calcular la latitud y longitud del punto central de ese conjunto (también conocido como un punto que centraría una vista en todos los puntos)?
EDITAR: solución de Python que he usado:
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
fuente
fuente
z
, por favor?Respuestas:
El enfoque simple de simplemente promediarlos tiene casos de borde extraños con ángulos cuando se ajustan desde 359 'de nuevo a 0'.
Una pregunta mucho anterior sobre SO preguntó acerca de encontrar el promedio de un conjunto de ángulos de brújula.
Una expansión del enfoque recomendado allí para las coordenadas esféricas sería:
fuente
¡Gracias! Aquí hay una versión C # de las soluciones de OP usando grados. Utiliza la clase System.Device.Location.GeoCoordinate
fuente
Esta publicación me pareció muy útil, así que aquí está la solución en PHP. He estado usando esto con éxito y solo quería guardar otro desarrollador en algún momento.
fuente
Publicación muy útil! He implementado esto en JavaScript, por la presente mi código. He usado esto con éxito.
fuente
Versión Javascript de la función original.
fuente
En aras de posiblemente salvar a alguien un minuto o dos, aquí está la solución que se utilizó en Objective-C en lugar de Python. Esta versión toma un NSArray de NSValues que contienen MKMapCoordinates, que fue requerido en mi implementación:
fuente
<GLKit/GLKMath.h>
y el usoGLKMathDegreesToRadians
yGLKMathRadiansToDegrees
Muy buenas soluciones, justo lo que necesitaba para mi proyecto rápido, así que aquí hay un puerto rápido. gracias y aquí también hay un proyecto de patio de juegos: https://github.com/ppoh71/playgounds/tree/master/centerLocationPoint.playground
fuente
Si está interesado en obtener un 'centro' muy simplificado de los puntos (por ejemplo, simplemente centrar un mapa en el centro de su polígono gmaps), aquí hay un enfoque básico que funcionó para mí.
Esto devuelve la coordenada media lat / lng para el centro de un polígono.
fuente
En Django esto es trivial (y en realidad funciona, tuve problemas con una serie de soluciones que no devolvían correctamente los negativos para la latitud).
Por ejemplo, supongamos que está utilizando django-geopostcodes (de los cuales yo soy el autor).
point
es unaPoint
instancia de Django que luego se puede usar para hacer cosas como recuperar todos los objetos que están dentro de los 10 km de ese punto central;Cambiar esto a Python sin formato es trivial;
Bajo el capó Django está utilizando GEOS - más detalles en https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/
fuente
Versión de Java si alguien lo necesita. Las constantes definieron estática para no calcularlas dos veces.
fuente
Aquí está la versión de Android basada en la respuesta C # de @Yodacheese usando la API de Google Maps:
en la aplicación build.gradle agregar:
fuente
Esto es lo mismo que un problema promedio ponderado donde todos los pesos son iguales y hay dos dimensiones.
Encuentre el promedio de todas las latitudes para su latitud central y el promedio de todas las longitudes para la longitud central.
Advertencia Emptor: Esta es una aproximación a corta distancia y el error se volverá rebelde cuando las desviaciones de la media sean más de unas pocas millas debido a la curvatura de la Tierra. Recuerde que las latitudes y longitudes son grados (no realmente una cuadrícula).
fuente
Si desea tener en cuenta el elipsoide que está utilizando, puede encontrar las fórmulas aquí. http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf
ver anexo B
El documento contiene muchas otras cosas útiles.
si
fuente
Fuera de objeto en PHP. Dado conjunto de pares de coordenadas, devuelve el centro.
Idea tomada del # 4
fuente
Aquí está la versión de Python para encontrar el punto central. Lat1 y lon1 son listas de latitud y longitud. retuen la latitud y longitud del punto central.
fuente
Implementación de Dart para Flutter para encontrar el punto central para Latitud múltiple, Longitud.
paquete de importación de matemáticas
Lista de latitud y longitud
fuente
Si desea que todos los puntos sean visibles en la imagen, querrá los extremos en latitud y longitud y asegúrese de que su vista incluya esos valores con cualquier borde que desee.
(Según la respuesta de Alnitak, cómo calcular los extremos puede ser un poco problemático, pero si están a unos pocos grados a cada lado de la longitud que se envuelve, entonces llamarás el tiro y tomarás el rango correcto).
Si no desea distorsionar el mapa en el que se encuentran estos puntos, ajuste la relación de aspecto del cuadro delimitador para que se ajuste a los píxeles que haya asignado a la vista pero que aún incluya los extremos.
Para mantener los puntos centrados en algún nivel de zoom arbitrario, calcule el centro del cuadro delimitador que "simplemente se ajusta" a los puntos como se indicó anteriormente, y mantenga ese punto como el punto central.
fuente
Hice esta tarea en javascript como a continuación
fuente
Como agradecimiento por este hilo, aquí está mi pequeña contribución con la implementación en Ruby, con la esperanza de salvar a alguien unos minutos de su valioso tiempo:
fuente
Utilicé una fórmula que obtuve de www.geomidpoint.com y escribí la siguiente implementación de C ++. Las
array
ygeocoords
son mis propias clases cuya funcionalidad debería explicarse por sí misma.fuente
Dart / Flutter Calcular el punto central de múltiples pares de coordenadas de latitud / longitud
fuente