¿Un reverso de la fórmula de Haversine para MySQL?
-
20-08-2019 - |
Pregunta
En mi DB almaceno un punto central, junto con un radio (en metros).
Estoy buscando pasar un lat / lng, y luego tener los valores mysql que he almacenado crean un círculo para decirme si mi punto que pasé está dentro de ese círculo. ¿Hay algo que me permita hacer esto, similar a la Haversine forumla (que supondría que mi punto ya estaba en la base de datos)?
Fórmula Haversine:
(3959 * acos (cos (radianes (40)) * cos (radianes (lat)) * cos (radianes (long
) - radianes (-110)) + sin (radianes (40)) * sin (radianes (< =>)))
db:
circleLatCenter, circleLngCenter, Radius
pasando > seleccionar id de foo donde lat, lng in (hacer función de círculo: circleLat, circleLng, radio)
Solución
MySQL tiene una gran cantidad de funciones de datos espaciales:
Extensiones espaciales a MySQL
Creo que lo que buscas es la sección sobre la medición de las relaciones entre geometrías:
Otros consejos
He realizado búsquedas geográficas similares calculando el cuadro delimitador a través de una gran distancia circular y consultando la base de datos para eso. Todavía necesita otro pase en su aplicación para & Quot; redondear las esquinas & Quot; del cuadro delimitador al círculo.
Entonces, dada una base de datos de puntos, un punto de búsqueda (X, Y) y una distancia D, encuentre todos los puntos dentro de D de (X, Y):
- Calcular deltaX, que es el punto si movió la distancia D a lo largo del eje Y.
- Calcular deltaY, que es el punto si movió la distancia D a lo largo del eje X.
- Calcule su cuadro delimitador: (X-deltaX, Y-deltaY), (X + deltaX, Y + deltaY)
- La base de datos de consulta de puntos utiliza el operador SQL ENTRE: SELECCIONE * DE LA TABLA DONDE X ENTRE X-deltaX Y X + deltaX Y Y ENTRE Y-deltaY Y Y + deltaY
- Postprocese la lista de puntos devueltos, calculando la distancia real del gran círculo, para eliminar los puntos en las esquinas del cuadrado que no están dentro de su círculo de distancia.
Como atajo, típicamente calculo grados por milla para lat y lon (en el ecuador, ya que los grados por milla son diferentes en los polos para lon), y obtengo deltaX y deltaY como ( D * grados-lat-por-milla) o grados-lon-por-milla. La diferencia en el ecuador frente al polo no importa mucho, ya que ya estoy calculando la distancia real después de la consulta SQL.
FYI - 0.167469 a 0.014564 grados-lon-por-milla, y 0.014483 grados-lat-por-milla
Sé que esta es una publicación largamente muerta, pero, en caso de que alguien se encuentre con esto, no es necesario crear una & "; fórmula de Haversina inversa &"; en absoluto. La fórmula de Haversine da la distancia entre el punto a y el punto b. Necesita la distancia entre el punto b y el punto a, para su cálculo. Estos son el mismo valor.
SELECT *,
( 3959 * acos( cos( radians(40) ) * cos( radians( `circleLatCenter` ) ) * cos( radians( `circleLngCenter` ) - radians(-110) ) + sin( radians(40) ) * sin( radians( `circleLngCenter` ) ) ) as `haversine`
FROM `table` WHERE 1=1
HAVING `haversine` < `Radius`