Necesito poder calcular un cuadro o círculo delimitador para una latitud WGS84 dada y longitud y distancia WGS84, ¡pero no tengo idea de por dónde empezar!
La distancia desde el inicio Lat / Lon sería de 10 km o menos.
¿Sería posible que alguien me diera algunos consejos / Ejemplo sobre cómo hacer esto?
Respuestas:
WGS-qué? WGS-84? Dependiendo de la precisión que necesite, es posible que necesite saber mucha más información; supongo que es por eso que ha sido rechazado, aunque nadie se molestó en dejar un comentario diciendo por qué.
Aquí hay dos formas:
Inexacta, pero probablemente 'suficientemente buena'
Un grado de latitud es de aproximadamente 10001.965729 / 90 kilómetros (distancia del ecuador al polo, dividido entre noventa grados) o 111.113 kilómetros, utilizando el dato WGS-84. Esta es una aproximación debido a la forma de la tierra, y porque las distancias cambian a medida que te acercas a los polos (una razón para usar la latitud, no la longitud, ¡finalmente la distancia de un grado de longitud es cero!) La tierra tampoco es perfecta esfera. Ambas son razones para usar un enfoque más complejo basado en proyecciones y datos, en mi segunda respuesta.
Esto está usando grados decimales, no grados / minutos / segundos.
Entonces, su cuadro delimitador será su punto, más y menos 0.08999 grados. Alternativamente, podría usar este número como un radio, dándole un círculo delimitador .
Cualquier persona SIG que lea esto se estremecerá. Sin embargo, será principalmente preciso, dependiendo de dónde se encuentre en el mundo. Para un radio de 10 km, debería estar bien.
Mucho más preciso, pero más código
Use una biblioteca de proyección y especifique su dato, etc. Recomiendo Proj4; es ampliamente utilizado, por lo que Google devuelve montones de resultados para preguntas al respecto, y hay envoltorios de Delphi . Si tiene problemas para usarlo, publique otra pregunta aquí en SO, está fuera del alcance de esta. El sitio web de Proj4 tiene ejemplos que usan las API básicas, y aunque están en C, debería ser bastante fácil de traducir. Su referencia de API es el mejor lugar para comenzar, seguido de las preguntas frecuentes .
Usaría WGS-84 como un dato básico (representación de la tierra) a menos que conozca uno específico que quiera usar, o que se usó para crear sus coordenadas. Es de uso común y bastante preciso.
Si su posición proviene de Google Maps (por ejemplo), especifique una proyección de Mercator. Es posible que desee usar otra proyección, o usar, por ejemplo, coordenadas UTMen lugar de latitud y longitud, dependiendo de la fuente de sus datos y si desea alta precisión para un área local pequeña. (UTM tiene múltiples zonas, todas las cuales cambian la distorsión para que dentro de esa zona, sea altamente precisa; si usa una zona para coordenadas fuera de ella, la distorsión aumentará enormemente a medida que se aleja. Si ve la Tierra entera proyectada desde una zona, puede ser irreconocible. Pero dentro de una zona, las traducciones UTM serán tan buenas como sea posible. Las coordenadas generalmente se especifican en metros, no en grados, por lo que puede ser más útil para usted, dado que necesita 10 km radio. 10 km es fácilmente dentro de una sola zona, solo tiene que elegir la zona adecuada en función de su coordenada central. El único bit complicado es cuando se acerca a un borde: es una situación común, y está bien, solo estécoherente en la forma en que elige cuál usar . Proj4 también le permitirá traducir proyecciones, para que pueda pasar de su Mercator WGS-84 lat / long a una zona UTM n , por ejemplo, o desde y hacia dos zonas UTM).
fuente
Suponiendo que desea realizar una consulta en una base de datos, es probable que desee realizar una búsqueda rápida (inexacta) y luego calcular exactamente la distancia para los lugares resultantes. ¿Es ese tu escenario?
La siguiente función (en PHP, lo siento) calculará aproximadamente las diferencias en latitud y longitud. Estas diferencias dependen de la latitud de su punto de búsqueda. Úselos (con una pequeña tolerancia) para realizar una búsqueda rápida en la base de datos. El cuadro se puede calcular simplemente con latitud + -deltaLatitude y longitud + -deltaLongitude.
Con la fórmula de Haversine , puede calcular distancias en la esfera. Úselo para cada uno de los lugares encontrados, para obtener la distancia "exacta". De esta manera, puede probar si los dos lugares están dentro de un radio determinado (un círculo en lugar del cuadro).
fuente
Para probar si un lat / lon está dentro o fuera de un círculo delimitador, debe calcular la distancia desde su lat / lon de referencia al punto lat / lon que desea probar. Como su distancia es de 10 km o menos, intentaría usar la aproximación equirrectangular para obtener la distancia en lugar de Haversine debido a la simplicidad. Para obtener la distancia en km:
Nota importante: lat / lon en estas fórmulas están en radianes, no en grados. El valor típico de EarthRadius es 6371 km, que devolverá la distancia en unidades de km. Ahora es una prueba simple si su distancia está dentro o fuera del círculo. Si funciona un círculo delimitador, iría con eso.
Para un rectángulo delimitador, supongo que desea que el rectángulo se defina siendo paralelo al ecuador. Luego calcularía las esquinas del cuadro delimitador utilizando cálculos de rango / demora (las demoras son 45 grados, 135 grados, 225 grados y 315 grados). A partir de ahí, asumiría que no estás alrededor de los polos y usaré un punto en la prueba de polígono.
fuente
A continuación se muestra el código T-SQL que uso para construir el cuadro delimitador en SQL-Server 2012. En mi caso, obtengo valores decimales para Lat, Long. Lo uso para limitar rápidamente el número de filas antes de usar la
STDistance
función SQL para verificar que los resultados estén realmente a una distancia particular. Las funciones de geografía son muy costosas en SQL Server, por lo tanto, al construir un cuadro delimitador, puedo reducir en gran medida la cantidad de veces que debe ejecutarse.fuente