Localisation des bâtiments dans un rayon de 5 milles : une solution géospatiale
Cet article aborde le défi commun consistant à identifier tous les bâtiments dans un rayon de 5 miles de coordonnées données. Nous présenterons une solution performante pour cette requête spatiale.
Scénario :
Imaginez une table de base de données « Building » avec des colonnes : « nom », « latitude » (« lat ») et « longitude » (« lng »). L'emplacement de chaque bâtiment est défini par sa latitude et sa longitude.
Le problème :
L'objectif est de récupérer tous les bâtiments dans un rayon de 5 miles d'une paire de coordonnées spécifique, par exemple : -84.38653999999998, 33.72024.
Approches inefficaces :
Utiliser des fonctions telles que ST_CONTAINS
avec des valeurs de latitude et de longitude stockées séparément est inefficace. Cette approche ajoute une surcharge importante au traitement des requêtes.
Solution optimale : exploiter les types de données spatiales
Pour des performances optimales, stockez les coordonnées sous forme de types de données géométriques ou géographiques. Cela rationalise considérablement les calculs de distance. Nous allons démontrer l'utilisation des fonctions PostGIS.
Méthodes efficaces : ST_DWithin
et ST_Distance
PostGIS offre de puissantes fonctions spatiales pour des calculs de distance efficaces. Voici comment utiliser ST_DWithin
et ST_Distance
:
Utilisation de ST_DWithin
(résultat booléen) :
ST_DWithin
renvoie un booléen indiquant si les géométries se trouvent à une distance spécifiée.
<code class="language-sql">SELECT name, lng, lat, ST_Distance('POINT(-4.6314 54.0887)'::geography, ST_MakePoint(lng,lat)::geography) * 0.000621371 AS distance FROM building WHERE ST_DWithin('POINT(-4.6314 54.0887)'::geography, ST_MakePoint(lng,lat)::geography, 8046.72); -- 8046.72 meters = 5 miles</code>
Utilisation de ST_Distance
(Distance en miles) :
ST_Distance
renvoie la distance en mètres. Nous convertissons en miles en utilisant le facteur de conversion.
<code class="language-sql">SELECT name, lng, lat, ST_Distance('POINT(-4.6314 54.0887)'::geography, ST_MakePoint(lng,lat)::geography) * 0.000621371 AS distance FROM building WHERE ST_Distance('POINT(-4.6314 54.0887)'::geography, ST_MakePoint(lng,lat)::geography) * 0.000621371 <= 5;</code>
En utilisant ces fonctions spatiales et en stockant les coordonnées de manière appropriée, vous obtenez une récupération précise et efficace des bâtiments dans un rayon de 5 miles, cruciale pour des applications géospatiales efficaces. N'oubliez pas de remplacer (-4.6314, 54.0887)
par vos coordonnées réelles.
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!