sql >> Base de Datos >  >> RDS >> Mysql

Comparación de coordenadas en la base de datos

La mejor manera de manejar las búsquedas de proximidad es comenzar con algún tipo de aproximación de rectángulo delimitador y luego ir desde allí a una distancia real de gran círculo entre las personas.

Siempre que sus latitudes no estén demasiado cerca de los polos, una aproximación descuidada pero viable para la distancia entre dos puntos es esta (en SQLish):

GREATEST(ABS(lat1-lat2),ABS(long1-long2))

Si desea ser más preciso y sabe que solo le interesan las personas que se encuentran dentro, digamos, a 10 km entre sí, puede utilizar una búsqueda de rectángulo delimitador como esta.

WHERE latitude_from_table
    BETWEEN latpoint  - (10.0 / 111.045)
        AND latpoint  + (10.0 / 111.045)
  AND longitude_from_table
    BETWEEN longpoint - (10.0 / (111.045 * COS(RADIANS(latpoint))))
        AND longpoint + (10.0 / (111.045 * COS(RADIANS(latpoint))))

Esto funciona porque hay 111,045 km en un grado de latitud. Los términos del coseno en los límites de longitud explican el hecho de que las líneas de latitud están más juntas a medida que te acercas a los polos. Esto le permite explotar los índices de MySQL en sus columnas latitude_from_table y longitude_from_table.

Una vez que tenga la proximidad del cuadro delimitador, puede aplicar una fórmula de distancia de gran círculo. Aquí hay antecedentes sobre eso. http://www.plumislandmedia.net/mysql/haversine-mysql- ubicación-más-cercana/

Para el tipo de aplicación que está considerando, el punto flotante IEEE-488 de 32 bits es bastante preciso para sus coordenadas. Si los puntos que está viendo están muy juntos (menos de un kilómetro más o menos), desea utilizar la fórmula de Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) en lugar de la llamada fórmula haversine más común (http://www.plumislandmedia.net/mysql/función-almacenada-haversine-distance-computation/ ).

Si su número de personas supera con creces los 300 000, es posible que desee considerar el uso del esquema de indexación geoespacial de MySQL. Solo funciona con tablas MyISAM, pero es muy rápido en hacer búsquedas de rectángulo delimitador. Mira aquí. http://www.plumislandmedia.net/mysql/haversine-mysql- ubicación-más-cercana/