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
Libérer: 2025-01-06 12:44:41
original
436 Les gens l'ont consulté

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)
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal