2009-06-25 25 views
7

En mi DB, almaceno un punto central, junto con un radio (en metros).¿Un reverso de la fórmula de Haversine para MySQL?

Estoy buscando pasar un lat/lng, y luego tener los valores de 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 el DB).

Fórmula Haversine: (3959 * acos (cos (radianes (40)) * cos (radianes (lat)) * cos (radianes (long) - radianes (-110)) + sin (radianes (40)) * sin (radianes (long)))

db:

circleLatCenter, circleLngCenter, Radio

pasando> seleccione ID de foo en latitud, la longitud de (hacer funcionar círculo: circleLat, circleLng, radio)

Respuesta

2

He hecho búsquedas geográficas similares al calcular el cuadro delimitador a través de una gran distancia circular y consultar la base de datos para eso. Todavía necesita otro pase en su aplicación para "redondear las esquinas" desde el cuadro delimitador al círculo.

Así, dada una base de datos de puntos, un punto de búsqueda (X, Y) y una distancia D, encontrar todos los puntos dentro de D (X, Y):

  1. Calcular deltaX, que es el punto si movió la distancia D a lo largo del eje Y.
  2. Calcular deltaY, que es el punto si movió la distancia D a lo largo del eje X.
  3. calcular su cuadro delimitador: (X-deltaX, Y-deltaY), (X + deltaX, Y + deltaY) de base de datos
  4. de consulta de puntos de utilizar SQL operador BETWEEN: SELECT * FROM tabla WHERE X entre X-deltaX Y X + deltaX Y Y ENTRE Y-deltaY Y Y + deltaY
  5. Realice un proceso posterior de la lista de puntos devueltos, calculando la distancia del gran círculo real, para eliminar los puntos en las esquinas del cuadrado que no están dentro de su círculo de distancia.

Como atajo, normalmente calculo grados-por-milla tanto para lat como para lon (en el ecuador, ya que los grados por milla son diferentes en los polos para lon), y derivo deltaX y deltaY como (D * degrees-lat-per-mile) o degrees-lon-per-mile. La diferencia en el ecuador vs polo no importa mucho, ya que 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

+0

Hago lo mismo, (primer pase con una esquina cuadrada y luego redondeada con longitud hipotenusa) ¿Pero encontró una forma mejor de hacerlo desde que escribió esta publicación? –

-1

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 haversine inversa". La fórmula de Haversine da la distancia entre el punto a y el punto b. Necesitas la distancia entre el punto by el punto a, para tu 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` 
+0

El uso de 'acos()' significa que no es un cálculo de haversine, es la "ley esférica de los cosenos". –

Cuestiones relacionadas