Maison  >  Article  >  base de données  >  Comment puis-je effectuer efficacement des recherches de rayon dans une base de données de données géospatiales ?

Comment puis-je effectuer efficacement des recherches de rayon dans une base de données de données géospatiales ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 01:13:28658parcourir

How can I efficiently perform radius searches in a database for geospatial data?

Requêtes de base de données pour les recherches de rayon géospatial

Dans ce contexte, nous visons à identifier les individus dont les emplacements se situent dans des zones de rayon défini représentées par des marqueurs sur une carte.

Calcul du rayon

Pour déterminer si un point (x, y) se trouve dans un cercle centré en (x1, y1) avec un rayon de r, nous employons la formule suivante :

(x - x1)^2 (y - y1)^2 <= r^2

Conversion des degrés en kilomètres

Pour garantir des unités cohérentes des deux côtés de l'équation, nous convertissons les degrés de latitude et de longitude en kilomètres en utilisant le facteur de conversion 111,12 km/degré.

Formule modifiée

Avec la conversion appliquée, la formule modifiée devient :

((x - x1) * 111.12)^2 ((y - y1) * 111.12)^2 <= 4

où 4 représente le rayon carré de 2 kilomètres.

Implémentation SQL

Pour implémenter cette formule dans MySQL, nous construisons une requête qui associe chaque marqueur (Utilisateur A ) avec le point central de l'utilisateur à localiser (Utilisateur B) :

<code class="sql">SELECT A.user_id, A.radius_id, A.latitude, A.longitude
FROM UserA AS A
JOIN (SELECT user_id, latitude, longitude FROM UserB WHERE user_id = 8) AS B
ON (POW((A.latitude - B.latitude) * 111.12, 2) + POW((A.longitude - B.longitude) * 111.12, 2)) <= 4</code>

Amélioration de la précision

Pour des résultats plus précis, la formule peut être modifiée pour prendre en compte les différences latitude-longitude par rapport à la latitude :

((x - x1) * 111.12 * cos(B.latitude))^2 ((y - y1) * 111.12)^2 < = 4

ou par rapport à la longitude :

((x - x1) * 111.12 * cos(A.latitude))^2 ((y - y1) * 111.12)^2 < ;= 4

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn