Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comparaison des coordonnées dans la base de données

La meilleure façon de gérer les recherches de proximité est de commencer par une sorte d'approximation du rectangle englobant, puis de passer à une distance orthodromique réelle entre les personnes.

Tant que vos latitudes ne sont pas trop proches des pôles, une approximation bâclée mais réalisable de la distance entre deux points est la suivante (en SQLish) :

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

Si vous voulez être plus précis et que vous savez que vous ne vous souciez que des personnes qui se trouvent à moins de 10 km l'une de l'autre, vous pouvez utiliser une recherche par rectangle englobant comme celle-ci.

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

Cela fonctionne car il y a 111,045 km dans un degré de latitude. Les termes cosinus dans les limites de longitude expliquent le fait que les lignes de latitude se rapprochent à mesure que vous vous rapprochez des pôles. Cela vous permet d'exploiter les index MySQL sur vos colonnes latitude_from_table et longitude_from_table.

Une fois que vous avez la proximité de la boîte englobante, vous pouvez appliquer une formule de distance orthodromique. Voici le contexte à ce sujet. http://www.plumislandmedia.net/mysql/haversine-mysql- emplacement-le-plus-proche/

Pour le type d'application que vous envisagez, la virgule flottante IEEE-488 32 bits est très précise pour vos coordonnées. Si les points que vous regardez sont vraiment proches les uns des autres (moins d'un kilomètre environ), vous souhaitez utiliser la formule de Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) plutôt que la formule dite haversine plus courante (http ://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Si votre nombre de personnes dépasse largement les 300 000, vous pouvez envisager d'utiliser le schéma d'indexation géospatiale MySQL. Cela ne fonctionne qu'avec les tables MyISAM, mais c'est très rapide pour effectuer des recherches de rectangle englobant. Vois ici. http://www.plumislandmedia.net/mysql/haversine-mysql- emplacement-le-plus-proche/