Rechercher efficacement des bâtiments dans un rayon donné à l'aide de PostGIS
Ce guide montre comment récupérer tous les bâtiments dans un rayon spécifié à l'aide de PostGIS, en supposant que votre table de base de données "Building" contient les colonnes "name", "lat" et "lng". Disons que vous devez trouver tous les bâtiments dans un rayon de 5 miles de coordonnées (-84.38653999999998, 33.72024).
Optimisation du stockage des données spatiales
Il est crucial de comprendre que stocker la latitude et la longitude dans des colonnes séparées est inefficace. Pour des performances PostGIS optimales, stockez vos coordonnées sous forme de type de données géométriques ou géographiques. Cela évite les conversions inutiles lors des requêtes.
Exploiter ST_DWithin et ST_Distance pour les calculs de distance
PostGIS propose deux fonctions principales pour les calculs de distance : ST_DWithin
et ST_Distance
.
1. Utilisation de ST_DWithin pour des recherches de rayon efficaces :
ST_DWithin
vérifie efficacement si les géométries se trouvent à une distance spécifiée. La requête suivante utilise ST_DWithin
pour rechercher des bâtiments dans un rayon de 5 miles (environ 8 046,72 mètres) :
<code class="language-sql">SELECT name, long, lat FROM building WHERE ST_DWithin( ST_GeographyFromText('SRID=4326;POINT(-84.38653999999998 33.72024)'), ST_MakePoint(long, lat)::geography, 8046.72 -- Distance in meters );</code>
Notez l'utilisation de ST_GeographyFromText
et la conversion de ST_MakePoint
en géographie pour des calculs de distance précis sur une surface sphérique. L'utilisation de geography
est généralement préférable à geometry
pour les coordonnées géographiques.
2. Utilisation de ST_Distance pour des informations détaillées sur la distance :
ST_Distance
calcule la distance entre deux géométries. Contrairement à ST_DWithin
, il ne bénéficie pas d'index spatiaux et doit être utilisé dans la clause SELECT plutôt que dans la clause WHERE pour de meilleures performances. Cette approche est utile lorsque vous avez besoin de la distance précise par rapport à chaque bâtiment :
<code class="language-sql">SELECT name, long, lat, ST_Distance( ST_GeographyFromText('SRID=4326;POINT(-84.38653999999998 33.72024)'), ST_MakePoint(long, lat)::geography ) AS distance_meters FROM building ORDER BY distance_meters;</code>
Cette requête renvoie la distance en mètres. Vous pouvez le convertir en miles en multipliant par 0,000621371.
Remarque importante sur ST_MakePoint :
N'oubliez pas que ST_MakePoint
prend d'abord la longitude, puis la latitude. Un ordre incorrect entraînera des résultats inexacts. Vérifiez toujours votre commande de coordonnées. L'utilisation du type de données géographiques est cruciale pour des calculs précis de distance à la surface de la Terre.
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!