He dado una ubicación definida por latitud y longitud. Ahora quiero calcular un cuadro delimitador, por ejemplo, a 10 kilómetros de ese punto.
El cuadro delimitador debe definirse como latmin, lngmin y latmax, lngmax.
Necesito estas cosas para usar la API de panoramio .
¿Alguien conoce la fórmula de cómo obtener esos puntos?
Editar: Chicos, estoy buscando una fórmula / función que tome lat & lng como entrada y devuelva un cuadro delimitador como latmin & lngmin y latmax & latmin. Mysql, php, c #, javascript está bien, pero también el pseudocódigo debería estar bien.
Editar: no estoy buscando una solución que me muestre la distancia de 2 puntos
Respuestas:
Sugiero aproximar localmente la superficie de la Tierra como una esfera con radio dado por el elipsoide WGS84 en la latitud dada. Sospecho que el cálculo exacto de latMin y latMax requeriría funciones elípticas y no produciría un aumento apreciable en la precisión (WGS84 es en sí mismo una aproximación).
A continuación, mi implementación (está escrita en Python; no la he probado):
EDITAR: El siguiente código convierte (grados, números primos, segundos) a grados + fracciones de grado, y viceversa (no probado):
fuente
Escribí un artículo sobre cómo encontrar las coordenadas delimitadas:
http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates
El artículo explica las fórmulas y también proporciona una implementación de Java. (También muestra por qué la fórmula de Federico para la longitud mínima / máxima es inexacta).
fuente
public override string ToString()
es muy malo anular un método global de este tipo solo para un propósito, es mejor simplemente agregar otro método, luego anular el método estándar, que se puede usar en otras partes de la aplicación, no para el gis exacto ...Aquí he convertido la respuesta de Federico A. Ramponi a C # para cualquiera que esté interesado:
fuente
Escribí una función de JavaScript que devuelve las cuatro coordenadas de un cuadro delimitador cuadrado, dada una distancia y un par de coordenadas:
fuente
minLon = void 0;
ymaxLon = MAX_LON;
que todavía no funciona.centerPoint
argumento es una matriz que consta de dos coordenadas. Por ejemplo,getBoundingBox([42.2, 34.5], 50)
-void 0
es la salida de CoffeeScript para "indefinido" y no afectará la capacidad de ejecución de los códigos.degLat.degToRad
no es una funcióndegToRad
errores de "no es una función". Nunca supe por qué, peroNumber.prototype.
no es una buena idea para una función de utilidad como esta, así que las convertí en funciones locales normales. También es importante tener en cuenta que la caja devuelta es [LNG, LAT, LNG, LAT] en lugar de [LAT, LNG, LAT, LNG]. Modifiqué la función de retorno cuando usé esto para evitar confusiones.Como necesitaba una estimación muy aproximada, para filtrar algunos documentos innecesarios en una consulta de búsqueda elástica, empleé la siguiente fórmula:
N = kms requeridos desde la ubicación dada. Para su caso N = 10
No es exacto pero práctico.
fuente
Estás buscando una fórmula elipsoide.
El mejor lugar que he encontrado para comenzar a codificar se basa en la biblioteca Geo :: Ellipsoid de CPAN. Le brinda una línea de base para crear sus pruebas y comparar sus resultados con sus resultados. Lo usé como base para una biblioteca similar para PHP en mi empleador anterior.
Geo :: Elipsoide
Eche un vistazo al
location
método. Llámalo dos veces y tendrás tu bbox.No publicaste el idioma que estabas usando. Es posible que ya exista una biblioteca de codificación geográfica disponible para usted.
Ah, y si aún no lo ha descubierto, los mapas de Google usan el elipsoide WGS84.
fuente
Ilustración de @Jan Philip Matuschek excelente explicación (por favor, vote a favor su respuesta, no esta; estoy agregando esto porque me tomé un poco de tiempo para comprender la respuesta original)
La técnica del cuadro delimitador para optimizar la búsqueda de vecinos más cercanos necesitaría derivar los pares de longitud y latitud mínima y máxima para un punto P a la distancia d. Todos los puntos que quedan fuera de estos definitivamente están a una distancia mayor que d del punto. Una cosa a tener en cuenta aquí es el cálculo de la latitud de intersección, como se destaca en la explicación de Jan Philip Matuschek. La latitud de la intersección no se encuentra en la latitud del punto P, sino que está ligeramente desviada. Esta es una parte que a menudo se pasa por alto, pero es importante para determinar la longitud límite mínima y máxima correcta para el punto P para la distancia d. Esto también es útil en la verificación.
La distancia haversine entre (latitud de intersección, longitud alta) y (latitud, longitud) de P es igual a la distancia d.
Python gist aquí https://gist.github.com/alexcpn/f95ae83a7ee0293a5225
fuente
Aquí hay una implementación simple usando javascript que se basa en la conversión del grado de latitud a kms donde
1 degree latitude ~ 111.2 km
.Estoy calculando los límites del mapa a partir de una latitud y longitud determinadas con un ancho de 10 km.
fuente
Adapté un script PHP que encontré para hacer precisamente esto. Puede usarlo para encontrar las esquinas de un cuadro alrededor de un punto (digamos, a 20 km). Mi ejemplo específico es para la API de Google Maps:
http://www.richardpeacock.com/blog/2011/11/draw-box-around-coordinate-google-maps-based-miles-or-kilometers
fuente
Estaba trabajando en el problema del cuadro delimitador como un problema secundario para encontrar todos los puntos dentro del radio SrcRad de un punto LAT, LONG estático. Ha habido bastantes cálculos que utilizan
para calcular los límites de longitud, pero encontré que esto no da todas las respuestas que se necesitaban. Porque lo que realmente quieres hacer es
Lo sé, sé que la respuesta debería ser la misma, pero descubrí que no lo era. Parecía que al no asegurarme de que estaba haciendo (SRCrad / RadEarth) Primero y luego dividiendo por la parte de Cos, estaba omitiendo algunos puntos de ubicación.
Después de obtener todos los puntos del cuadro delimitador, si tiene una función que calcula la distancia de punto a punto dada la latitud, es fácil obtener solo aquellos puntos que están a un cierto radio de distancia del punto fijo. Aquí esta lo que hice. Sé que tomó algunos pasos adicionales pero me ayudó
fuente
Es muy simple, simplemente vaya al sitio web de panoramio y luego abra el mapa mundial desde el sitio web de panoramio. Luego, vaya a la ubicación especificada, cuya latitud y longitud se requieren.
Luego, encontró latitud y longitud en la barra de direcciones, por ejemplo, en esta dirección.
http://www.panoramio.com/map#lt=32.739485&ln=70.491211&z=9&k=1&a=1&tab=1&pl=all
lt = 32.739485 => latitud ln = 70.491211 => longitud
este widget de la API de JavaScript de Panoramio crea un cuadro delimitador alrededor de un par lat / long y luego devuelve todas las fotos dentro de esos límites.
Otro tipo de widget de la API de JavaScript de Panoramio en el que también puede cambiar el color de fondo con el ejemplo y el código está aquí .
No se muestra en el estado de ánimo de composición. Se muestra después de la publicación.
fuente
Aquí he convertido la respuesta de Federico A. Ramponi a PHP si alguien está interesado:
fuente
Gracias @Fedrico A. por la implementación de Phyton, lo he portado a una clase de categoría Objective C. Aquí está:
Lo he probado y parece que funciona bien. Struct BoundsLocation debe reemplazarse por una clase, la he usado solo para compartirla aquí.
fuente
Todas las respuestas anteriores son solo parcialmente correctas . Especialmente en regiones como Australia, siempre incluyen un poste y calculan un rectángulo muy grande incluso para 10 km.
Especialmente el algoritmo de Jan Philip Matuschek en http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex incluyó un rectángulo muy grande de (-37, -90, -180, 180) para casi todos los puntos de Australia. Esto afecta a un gran número de usuarios en la base de datos y la distancia debe calcularse para todos los usuarios en casi la mitad del país.
Descubrí que el algoritmo de tierra API de Drupal del Instituto de Tecnología de Rochester funciona mejor tanto en el polo como en otros lugares y es mucho más fácil de implementar.
https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
Utilice
earth_latitude_range
yearth_longitude_range
del algoritmo anterior para calcular el rectángulo delimitadorY use la fórmula de cálculo de distancia documentada por Google Maps para calcular la distancia
https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php
Para buscar por kilómetros en lugar de millas, reemplace 3959 con 6371. Para (Lat, Lng) = (37, -122) y una tabla de Marcadores con columnas lat y lng , la fórmula es:
Lea mi respuesta detallada en https://stackoverflow.com/a/45950426/5076414
fuente
Aquí está la respuesta de Federico Ramponi en Go. Nota: sin verificación de errores :(
fuente