Retour à la liste des articles Articles
12 minutes de lecture

Guide de PostGIS : Exemples de requêtes de données géospatiales de base

Les données géospatiales deviennent de plus en plus importantes dans de nombreux domaines, de l'urbanisme aux sciences de l'environnement. Dans cet article, nous allons démontrer les requêtes PostgreSQL PostGIS de base pour travailler avec ce type de données.

Les données géospatiales, qui contiennent des informations sur les emplacements sur la Terre, nécessitent des outils spécialisés pour une utilisation efficace. PostGIS est une puissante extension PostgreSQL qui transforme une base de données Postgres en un système d'information géographique (SIG) complet. Avec PostGIS, vous pouvez stocker des objets géographiques, exécuter des requêtes spatiales et effectuer des analyses avancées directement en SQL. Il s'agit donc d'un outil essentiel pour toute personne travaillant avec des données géoréférencées.

L'installation de PostGIS vous permet d'effectuer des opérations spatiales qui nécessitent habituellement un logiciel SIG spécialisé. Que vous ayez besoin de calculer des distances, de mesurer des surfaces ou d'analyser des relations spatiales, PostGIS vous fournit les outils nécessaires pour traiter efficacement des données spatiales complexes.

Si vous souhaitez approfondir votre connaissance de PostGIS, vous pouvez vous inscrire à notre cours PostGIS. Il vous emmènera des bases du SIG aux techniques avancées de PostGIS. À l'issue de ce cours, vous saurez comment exploiter la puissance de PostGIS dans vos projets.

Dans ce guide, nous allons vous présenter les bases de PostGIS. Nous commencerons par des requêtes spatiales simples, puis nous passerons à des techniques avancées telles que l'analyse de proximité et l'analyse de réseau. Si vous souhaitez en savoir plus sur les données géospatiales, consultez notre article Introduction aux bases de données spatiales et aux données géospatiales.

Notre échantillon de données géospatiales

Dans cet article, nous allons travailler avec un ensemble de données spatiales provenant de San Francisco, en Californie. Nous utiliserons plusieurs tables :

  • sf_tram_stops: Cette table contient les emplacements des arrêts de tramway dans la ville ; elle stocke également les coordonnées de l'emplacement et indique si les transferts entre les lignes sont possibles à cet arrêt. Elle comporte les colonnes suivantes :
    • id - Un identifiant unique pour chaque arrêt.
    • coordinates - Les coordonnées de l'arrêt.
    • transfer_possible - Si un passager peut changer de tramway à cet arrêt.
  • sf_planning_districts: Ce tableau définit les limites des districts de planification de San Francisco ; cette information est essentielle pour les analyses urbaines. Il comporte les colonnes suivantes :
    • id - Un identifiant unique pour chaque district d'aménagement.
    • name - Le nom du district.
    • boundaries - Les limites du district (sous forme de coordonnées).
  • sf_bicycle_routes: Ce tableau contient des informations sur les itinéraires cyclables de la ville ; vous en aurez besoin pour analyser l'infrastructure cyclable de SanFran. Elle comporte les colonnes suivantes :
    • id - Un identifiant unique pour chaque itinéraire cyclable.
    • course - Le parcours de l'itinéraire.
    • condition_rating - L'évaluation de l'itinéraire (basée sur ses conditions).
  • sf_restaurants: Ce tableau contient des informations sur les restaurants de San Francisco, notamment leur nom, leur emplacement, leur classement et le type de cuisine qu'ils proposent. Il comporte les colonnes suivantes :
    • id - Un identifiant unique pour chaque restaurant.
    • name - Le nom du restaurant.
    • food_type - Le type de cuisine servi dans ce restaurant.
    • rating - La note du restaurant.
    • coordinates - Les coordonnées de l'emplacement du restaurant.
  • sf_sights: Ce tableau contient des informations sur les points de repère et les points d'intérêt (POI) de la ville. Elle comporte les colonnes suivantes :
    • id - Un identifiant unique pour chaque point d'intérêt.
    • name - Le nom du POI.
    • coordinates - L'emplacement du POI.
  • sf_atms: Ce tableau contient des informations sur les distributeurs automatiques de billets de SanFran, y compris l'emplacement de chaque distributeur et la société qui l'exploite. Il comporte les colonnes suivantes :
    • id - Un identifiant unique pour chaque DAB.
    • company - La société qui exploite ce DAB.
    • coordinates - L'emplacement du DAB.

Ces données servent de base aux requêtes spatiales que nous allons explorer. Nous utiliserons ces requêtes pour analyser la proximité entre les points de repère et les équipements, calculer les zones au sein des districts de planification, et bien plus encore. Chaque requête démontrera comment PostGIS vous aide à extraire des informations significatives à partir de données spatiales.

Requêtes spatiales de base avec PostGIS

Une fois que vos données géospatiales sont stockées dans PostgreSQL avec PostGIS, vous pouvez commencer à les interroger ! Les requêtes spatiales vous permettent de sélectionner, de filtrer et de manipuler les données en fonction de leur emplacement, de leur forme et des relations spatiales. Commençons donc à travailler avec des données géospatiales.

Visualisation des données géospatiales

Tout d'abord, voyons à quoi ressemblent les données géospatiales. Nous sélectionnons ici les identifiants des arrêts de tramway et les coordonnées des arrêts où les usagers peuvent se rendre :

SELECT
  id, 
  coordinates
FROM sf_tram_stops
WHERE transfer_possible = true;

Voici le résultat :

idcoordinates
10101000020E610000030D80DDB16995EC0742497FF90CE4240…
40101000020E61000000DAB7823F3985EC010AFEB17ECCE4240…
50101000020E6100000FDD98F1491995EC07AC7293A92CF4240…

Comme vous pouvez le constater, les données géospatiales de la colonne des coordonnées ne sont pas vraiment lisibles. Pour qu'elles soient vraiment utilisables, il vous faudrait un logiciel spécialisé pour les tracer sur la carte. Heureusement, notre cours PostGIS est fourni avec une carte intégrée ; vous pouvez maintenant voir l'emplacement de ces arrêts de tramway :

Guide de PostGIS

Conversion de données géospatiales en texte

Vous souhaitez peut-être connaître les coordonnées de l'emplacement des arrêts de tramway susmentionnés sans avoir recours à une carte. Vous pouvez utiliser la requête suivante pour convertir les données en coordonnées lisibles par l'homme :

SELECT
  id, 
  ST_AsText(coordinates),
  ST_Y(coordinates),
  ST_X(coordinates)
FROM sf_tram_stops
WHERE transfer_possible = true;

Cette requête utilise la fonction PostGIS ST_AsText pour obtenir les coordonnées dans un format lisible. Elle utilise ST_Y et ST_X pour extraire les valeurs de latitude et de longitude. Voici un résultat partiel :

idst_astextst_yst_x
1POINT(-122.39202 37.6138)37.6138-122.39202
2POINT(-122.38984 37.61658)37.61658-122.38984
3POINT(-122.39948 37.62165)37.62165-122.39948

Relations spatiales

PostGIS propose plusieurs fonctions permettant d'explorer les relations spatiales des objets géospatiaux. Passons-les rapidement en revue.

ST_Intersection

Cette fonction renvoie la partie partagée (c'est-à-dire l'intersection) de deux géométries. La requête suivante montre toutes les pistes cyclables (ou leurs parties) à l'intérieur des limites du district Downtown :

SELECT
  sfbr.id,
  ST_Intersection(sfpd.boundaries, sfbr.course)
FROM sf_bicycle_routes sfbr
JOIN sf_planning_districts sfpd
  ON ST_Intersects(sfpd.boundaries, sfbr.course)
WHERE sfpd.name = 'Downtown';

La fonction ST_Intersection trouve la zone où deux formes se chevauchent - dans ce cas, où les pistes cyclables traversent les limites du quartier "Downtown". La fonction ST_Intersects vérifie si les pistes cyclables et les limites du quartier se touchent ou se croisent, en s'assurant que seules celles qui le font sont incluses.

Voici un résultat partiel sous forme de texte :

idst_intersection
4090102000020E61000000C000000438F3471DF9A5EC058F13A2…
4410102000020E6100000100000007451E9429B995EC0EF7A00F..
4120102000020E610000009000000ED6FEAA8999A5EC06469EB2..

et sous forme de carte :

Guide de PostGIS

ST_Contains

La fonction ST_Contains vérifie si une géométrie en contient une autre. Pour dresser la liste des districts de planification qui contiennent des distributeurs automatiques de billets de la société Crown Financial, vous pouvez exécuter cette requête :

SELECT DISTINCT sfn.name
FROM sf_planning_districts sfn
JOIN sf_atms sfa
  ON ST_Contains(sfn.boundaries, sfa.coordinates)
WHERE sfa.company = 'Crown Financial Inc.';

Voici le résultat :

name
Downtown
Northeast

ST_Within

La fonction ST_Within vérifie également si une géométrie est entièrement comprise dans une autre. Cette requête permet de localiser les restaurants ayant une note supérieure à 4,0 dans le district du Nord-Est :

SELECT 
  sep.name,
  sep.coordinates
FROM sf_planning_districts spd
JOIN sf_restaurants sep
  ON ST_Within(sep.coordinates, spd.boundaries)
WHERE rating > 4.0
  AND spd.name = 'Northeast';

Cette requête renvoie les noms et les coordonnées des restaurants, ce qui permet de les visualiser facilement sur une carte.

namecoordinates
Fast Duck0101000020E6100000B9FC87F4DB995EC02E73BA2C26E64240
Red Curry0101000020E6100000569FABADD8995EC0E1455F419AE54240
The Saloon0101000020E6100000D52137C30D9A5EC0431CEBE236E64240
Guide de PostGIS

Calculs de distances et de surfaces

Le calcul des distances et des superficies est un autre aspect fondamental du travail avec des données géospatiales. Ces calculs permettent de répondre à des questions telles que "A quelle distance se trouve ce guichet automatique d'un point de vue particulier ?" ou "Quelle est la superficie de ce district d'aménagement ?".

Calculs de distance

La fonction ST_Distance renvoie la distance entre deux objets géospatiaux. Elle prend deux arguments géométriques : ST_Distance(geometryA, geometryB).

Pour visualiser tous les distributeurs automatiques de billets situés à moins de 300 mètres de Fisherman's Wharf, vous pouvez utiliser la requête suivante :

SELECT   
  sa.id,
  sa.coordinates,
  ST_Distance(
    ST_Transform(sa.coordinates, 26910), 
    ST_Transform(ss.coordinates, 26910)) AS distance
FROM sf_sights ss
JOIN sf_atms sa
  ON ST_Distance(
     ST_Transform(sa.coordinates, 26910), 
     ST_Transform(ss.coordinates, 26910)) < 300
WHERE ss.name = 'Fisherman''s Wharf';

Dans cette requête, la fonction ST_Transform convertit les coordonnées données en un système de coordonnées spécifique adapté aux calculs spatiaux. Le système de coordonnées garantit que toutes les opérations spatiales (comme les calculs de distance) sont à la fois précises et adaptées aux besoins spécifiques de la zone géographique et du projet.

Dans cette requête, nous utilisons le système de coordonnées défini par le SRID (Spatial Reference System Identifier) 26910, qui correspond au système NAD83 / UTM zone 10N. Ce système est couramment utilisé pour calculer avec précision les distances dans la région de San Francisco.

Comment trouver le bon SRID ? Essayez l'un des sites web suivants :

  • Spatial Reference Website: Utilisez l'onglet EPSG.
  • io: Tapez le nom du pays, le code ou le nom du système de coordonnées pour effectuer une recherche et obtenir tous les systèmes de référence de coordonnées possibles.

En transformant les coordonnées, la requête garantit que le calcul de la distance entre le distributeur automatique de billets et Fisherman's Wharf est précis. Voici le résultat :

idcoordinatesdistance
1320101000020E6100000FC00A436719A5EC009FEB7921DE74240189.1839552624224
1330101000020E61000000D897B2C7D9A5EC033A7CB6262E74240277.9680083048927
1350101000020E61000000E15E3FC4D9A5EC0650113B875E74240216.11656973079064
1360101000020E6100000910A630B419A5EC033FE7DC685E74240283.89507791796825
Guide de PostGIS

Calculs de superficie

Pour calculer la superficie d'un district d'aménagement, utilisez la fonction ST_Area. Cette fonction prend un argument géométrique (ST_Area(geometry)) et renvoie la surface de la forme résultante.

Voici la requête. Notez que nous utilisons à nouveau SRID = 26910 comme système de coordonnées :

SELECT
  ST_Area(ST_Transform(boundaries, 26910))
FROM sf_planning_districts
WHERE name = 'Buena Vista';

Voici le résultat :

st_area
2617829.8666631826

Avec SRID = 26910, l'unité par défaut est le mètre. Ainsi, le résultat du site ST_Area est présenté en mètres carrés.

Analyse spatiale avancée

Au fur et à mesure que vous vous familiarisez avec PostGIS, vous pouvez utiliser ses fonctionnalités avancées pour effectuer des analyses spatiales approfondies. Ces techniques vous permettent d'explorer les relations spatiales, d'effectuer des analyses de proximité et même de réaliser des analyses de réseau, ce qui rend vos données géospatiales beaucoup plus exploitables.

Mise en mémoire tampon et analyse de proximité

La mise en mémoire tampon permet de créer des zones autour des entités spatiales. Elle est particulièrement utile pour l'analyse de proximité, lorsque vous devez déterminer à quel point certaines entités sont proches les unes des autres. Par exemple, si vous souhaitez identifier tous les restaurants situés dans un rayon de 3 000 mètres autour du "Palais des Beaux-Arts", vous pouvez utiliser la fonction ST_DWithin:

SELECT   
  sep.name,
  sep.rating,
  sep.food_type,
  sep.coordinates,
  ST_Distance(
    ST_Transform(sep.coordinates, 26910), 
    ST_Transform(ss.coordinates, 26910)) AS distance
FROM sf_sights ss
JOIN sf_restaurants sep
  ON ST_DWithin(
     ST_Transform(sep.coordinates, 26910), 
     ST_Transform(ss.coordinates, 26910), 
     3000)
WHERE ss.name = 'Palace of Fine Arts';

Et voici les résultats sous forme de tableau et de carte :

nameratingfood_typecoordinatesdistance
Olive2.10Greek0101000020E6100000C9AB730CC89A5EC0527E52EDD3E542402764.17980825426
La fragranza4.86Italian0101000020E61000008811C2A38D9D5EC038F3AB3940E442402361.1920187470487
Guide de PostGIS

Opérations de superposition

En cartographie, les opérations de superposition nous permettent de voir comment différents ensembles d'informations géographiques correspondent ou interagissent. Imaginez que vous ayez deux cartes, l'une montrant tous les parcs d'une ville et l'autre les zones sujettes aux inondations. En plaçant une carte au-dessus de l'autre, vous pouvez découvrir quels parcs sont exposés à un risque d'inondation. Ce processus nous aide à comprendre et à visualiser les endroits où différentes caractéristiques géographiques coïncident ; il rend la planification, les analyses et la prise de décision plus efficaces.

La requête suivante utilise la fonction ST_Union pour fusionner les limites de tous les districts de planification "récréatifs" en une forme géométrique unifiée :

SELECT
  ST_Union(boundaries) 
FROM sf_planning_districts 
WHERE type = 'recreational';
Guide de PostGIS

De la même manière, vous pouvez utiliser ST_Intersection pour réaliser la même chose.

Analyse de réseau

L'analyse de réseau consiste à examiner les itinéraires, à identifier les chemins les plus courts et à améliorer l'efficacité des déplacements au sein d'un réseau. Elle est essentielle pour comprendre et optimiser les systèmes de transport et la connectivité. PostGIS - associé à pgRouting - offre des outils robustes pour ce type d'analyse.

L'extension pgRouting fournit des algorithmes avancés pour l'optimisation des itinéraires. L'un des plus connus est la fonction pgr_dijkstra; elle calcule le chemin le plus court ou le plus rapide entre deux points en tenant compte de facteurs tels que les types de routes, les conditions de circulation et d'autres variables. Cette capacité est inestimable pour les systèmes de navigation, la planification logistique, la gestion des transports, etc. En tirant parti de ces extensions, les utilisateurs peuvent améliorer la planification des itinéraires, réduire les temps de trajet et améliorer l'efficacité globale du réseau.

Poursuivre l'exploration des données spatiales avec PostGIS

PostGIS, grâce à son intégration transparente dans PostgreSQL, fournit une plateforme puissante pour la gestion et l'analyse des données géospatiales. Tout au long de cet article, nous avons abordé les bases des requêtes spatiales, nous nous sommes aventurés dans l'analyse spatiale avancée et nous avons démontré comment PostGIS peut vous aider à répondre à des questions géographiques complexes avec précision et efficacité.

L'apprentissage de PostGIS peut transformer votre approche des données spatiales. Il vous permettra d'extraire plus facilement des informations précieuses, d'optimiser les flux de travail et de prendre des décisions fondées sur des données. Que vous soyez impliqué dans la planification urbaine, l'analyse environnementale, les réseaux de transport ou tout autre domaine lié aux SIG, PostGIS vous fournit les outils nécessaires pour traiter efficacement les données géospatiales.

En explorant les possibilités de PostGIS, vous découvrirez qu'il améliore votre capacité à travailler avec des données géospatiales et qu'il ouvre de nouvelles voies à l'innovation et à la découverte. La combinaison des robustes capacités de base de données de PostgreSQL et des fonctions géospatiales de PostGIS vous permet de relever les défis spatiaux les plus complexes en toute confiance.

Avant de partir, je voudrais juste mentionner à nouveau notre cours complet sur PostGIS; c'est vraiment un excellent choix pour obtenir une pratique réelle avec des données spatiales. Il vous guidera à travers tous les aspects de PostGIS, des principes fondamentaux aux techniques avancées. Avant même de vous en rendre compte, vous serez en mesure de vous attaquer en toute confiance à des projets de données géospatiales.

PostGIS est plus qu'une simple extension de PostgreSQL. C'est une passerelle qui vous permettra d'exploiter tout le potentiel des données géospatiales au sein de vos systèmes de base de données. En maîtrisant les fonctionnalités de PostGIS, vous pouvez transformer les données spatiales en informations exploitables qui contribueront à la réussite de vos projets et de votre entreprise.