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 :
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!