Maison > base de données > tutoriel mysql > Comment récupérer efficacement des bâtiments dans un rayon spécifié à l'aide de PostGIS ?

Comment récupérer efficacement des bâtiments dans un rayon spécifié à l'aide de PostGIS ?

DDD
Libérer: 2025-01-09 11:41:43
original
895 Les gens l'ont consulté

How to Efficiently Retrieve Buildings within a Specified Radius Using PostGIS?

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

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal