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)

¿Fue útil?

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:

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):

  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. Calcule su cuadro delimitador: (X-deltaX, Y-deltaY), (X + deltaX, Y + deltaY)
  4. 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
  5. 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`
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top