Maison >base de données >tutoriel mysql >Comment puis-je utiliser MySQL pour rechercher des points dans un rayon de latitude et de longitude donné ?

Comment puis-je utiliser MySQL pour rechercher des points dans un rayon de latitude et de longitude donné ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-06 12:44:41440parcourir

How Can I Use MySQL to Find Points Within a Given Radius of Latitude and Longitude?

Utilisation des extensions spatiales MySQL pour récupérer des points dans un cercle

Pour effectuer des requêtes spatiales basées sur la latitude et la longitude, il est nécessaire d'étendre MySQL avec des fonctions géospatiales. Cependant, il est crucial de noter que MySQL ne dispose pas de fonctions spatiales intégrées spécifiquement conçues pour les calculs de distance impliquant ces coordonnées.

Au lieu de cela, les cercles de proximité à la surface de la Terre nécessitent l'utilisation de la Distance du grand cercle formule, qui peut être implémentée à l’aide du haversine ou d’autres algorithmes appropriés. MySQL 5.6 fournit une fonction st_distance(p1, p2) non documentée qui calcule les distances cartésiennes dans des formes planaires, mais elle ne convient pas aux calculs basés sur la latitude et la longitude en raison des distorsions introduites par les distances cartésiennes.

Pour une application pratique, envisagez une requête pour trouver tous les drapeaux dans un rayon de dix milles terrestres d'une latitude/longitude donnée. point :

SELECT id, coordinates, name, r,
        units * DEGREES(ACOS(LEAST(1.0, COS(RADIANS(latpoint))
                  * COS(RADIANS(latitude))
                  * COS(RADIANS(longpoint) - RADIANS(longitude))
                  + SIN(RADIANS(latpoint))
                  * SIN(RADIANS(latitude))))) AS distance
   FROM flags
   JOIN (
        SELECT 42.81  AS latpoint,  -70.81 AS longpoint, 
               10.0 AS r, 69.0 AS units
        ) AS p ON (1=1)
  WHERE MbrContains(GeomFromText (
        CONCAT('LINESTRING(',
              latpoint-(r/units),' ',
              longpoint-(r /(units* COS(RADIANS(latpoint)))),
              ',', 
              latpoint+(r/units) ,' ',
              longpoint+(r /(units * COS(RADIANS(latpoint)))),
              ')')),  coordinates)

Dans cette requête :

  • latpoint et longpoint représentent la latitude et la longitude de l'emplacement de l'utilisateur.
  • r est le rayon de recherche en miles .
  • les unités représentent les unités de distance par degré de latitude sur la surface de la Terre (par exemple, 69 miles pour les miles ou 111,045 km pour les kilomètres).
  • MbrContains exclut les points qui se trouvent définitivement en dehors de la zone de recherche en fonction d'un rectangle englobant.
  • La formule de distance orthodromique calcule la distance entre les points.

Pour limiter les résultats aux points du cercle et les trier par proximité, entourez la requête dans une autre requête :

SELECT id, coordinates, name
   FROM (
         /* the above query, pasted in here */
        ) AS d
  WHERE d.distance <= d.r
  ORDER BY d.distance ASC

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