Skip to content

Latest commit

 

History

History
903 lines (689 loc) · 29.4 KB

File metadata and controls

903 lines (689 loc) · 29.4 KB

🔝 Retour au Sommaire

18.2. PostGIS : La Référence Spatiale Mondiale

Introduction

Imaginez que vous vouliez construire une application qui :

  • Trouve les restaurants les plus proches de votre position GPS
  • Affiche les zones de livraison sur une carte
  • Calcule l'itinéraire le plus court entre deux points
  • Analyse les parcelles cadastrales qui intersectent une zone d'urbanisme
  • Trace des zones de couverture réseau 4G

Toutes ces fonctionnalités nécessitent de manipuler des données géographiques : positions, lignes, zones, distances, intersections. C'est exactement ce que PostGIS vous permet de faire, directement dans votre base de données PostgreSQL.

PostGIS transforme PostgreSQL en un puissant Système d'Information Géographique (SIG) capable de stocker, interroger et analyser des données spatiales avec une efficacité et une précision remarquables.


1. Qu'est-ce que PostGIS ?

Définition

PostGIS est une extension open-source de PostgreSQL qui ajoute le support des données géographiques et géométriques. Elle permet de :

  • Stocker des objets géographiques (points, lignes, polygones)
  • Interroger ces objets avec SQL (recherches spatiales)
  • Analyser les relations spatiales (distance, intersection, contenance)
  • Transformer et manipuler les géométries
  • Indexer efficacement les données spatiales pour des performances optimales

PostGIS en Quelques Chiffres

  • 🌍 Leader mondial des bases de données spatiales open-source
  • 📅 Première version : 2001 (plus de 20 ans d'existence)
  • 🔧 400+ fonctions spatiales
  • 🏆 Standards OGC : Implémente les standards de l'Open Geospatial Consortium
  • 🚀 Utilisé par : Uber, Airbnb, CartoDB, OpenStreetMap, organisations gouvernementales
  • 💰 Économies : Alternative gratuite à Oracle Spatial (~$50,000/processeur) et SQL Server Spatial

Une Extension, Pas un Logiciel Séparé

PostGIS n'est pas une base de données autonome. C'est une extension qui s'intègre dans PostgreSQL :

PostgreSQL (base de données)
    │
    └─── PostGIS (extension spatiale)
            ├─── Types de données géométriques
            ├─── Fonctions spatiales
            ├─── Opérateurs spatiaux
            └─── Index spatiaux

Avantages de cette architecture :

  • ✅ Toute la puissance de PostgreSQL (transactions, MVCC, réplication)
  • ✅ Langage SQL familier (pas de nouveau langage à apprendre)
  • ✅ Intégration native avec vos données métier
  • ✅ Écosystème PostgreSQL (outils, drivers, extensions)

2. Pourquoi PostGIS est la Référence Mondiale ?

Comparaison avec les Alternatives

Critère PostGIS Oracle Spatial SQL Server Spatial MongoDB MySQL
Licence Open-source (GPL) Propriétaire ($$$$) Propriétaire ($$$) Open-source Open-source
Coût Gratuit ~$50k/CPU Inclus Enterprise Gratuit Gratuit
Standards OGC ✅ Complet ✅ Complet ⚠️ Partiel ❌ Non ⚠️ Basique
Fonctions spatiales 400+ 300+ 100+ ~20 ~40
Performance ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐
Index 3D
Géographie (sphérique) ⚠️ Limité
Communauté ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐
Documentation Excellente Excellente Bonne Bonne Moyenne

Verdict : PostGIS offre le meilleur rapport qualité/prix et la conformité la plus complète aux standards.

Forces de PostGIS

1. Conformité aux Standards

PostGIS implémente intégralement les standards de l'OGC (Open Geospatial Consortium) :

  • Simple Features for SQL : Types et opérations de base
  • SQL/MM : Extensions géométriques avancées
  • WKT/WKB : Formats d'échange standardisés
  • GeoJSON, KML, GML : Formats web et cartographiques

Bénéfice : Interopérabilité totale avec les outils SIG (QGIS, ArcGIS, MapInfo, etc.).

2. Richesse Fonctionnelle

PostGIS couvre tous les besoins d'analyse spatiale :

  • Géométrie 2D et 3D (jusqu'à 4D avec mesure)
  • Géographie sphérique (calculs précis sur la Terre)
  • Raster (images géoréférencées)
  • Topologie (réseaux, graphes)
  • Routing (calcul d'itinéraires avec pgRouting)
  • 3D (modèles de bâtiments, LIDAR)

3. Performance Exceptionnelle

  • Index spatiaux : GiST, SP-GiST, BRIN pour des requêtes ultra-rapides
  • Optimisation du planificateur : PostgreSQL optimise automatiquement les requêtes spatiales
  • Parallélisation : Support natif du parallélisme PostgreSQL
  • Géométries TOAST : Compression automatique des grandes géométries

Exemple : Recherche de proximité sur 10 millions de points → < 10ms avec index spatial.

4. Écosystème et Communauté

  • Extensions complémentaires :

    • pgRouting : Calcul d'itinéraires (Dijkstra, A*, TSP)
    • pgrouting : Analyse de réseaux
    • PostGIS Raster : Traitement d'images géospatiales
    • PostGIS Topology : Gestion topologique
  • Outils d'intégration :

    • QGIS : Logiciel SIG desktop qui s'interface parfaitement avec PostGIS
    • GeoServer : Serveur cartographique web (WMS, WFS)
    • MapServer : Publication de cartes web
    • Leaflet/Mapbox : Bibliothèques JavaScript pour cartes interactives

5. Évolution Continue

PostGIS suit les évolutions de PostgreSQL et ajoute régulièrement de nouvelles fonctionnalités :

  • PostGIS 1.0 (2005) : Fondations
  • PostGIS 2.0 (2012) : Type geography, 3D, raster
  • PostGIS 3.0 (2019) : Performance, JSON, clustering
  • PostGIS 3.4 (2023) : Support des courbes, améliorations 3D
  • PostGIS 3.5 (2024+) : Optimisations, nouvelles projections

3. Concepts Fondamentaux des SIG

Avant de plonger dans PostGIS, il est important de comprendre quelques concepts clés des Systèmes d'Information Géographique.

Qu'est-ce qu'une Donnée Spatiale ?

Une donnée spatiale (ou géographique) est une donnée qui possède une composante de localisation dans l'espace.

Exemples :

  • La position GPS de votre smartphone : (latitude: 48.8566, longitude: 2.3522)
  • Une route : séquence de points connectés
  • Une parcelle cadastrale : polygone délimitant une propriété
  • Une rivière : ligne sinueuse
  • Une zone de couverture 4G : cercle ou polygone

Les Deux Types de Données Spatiales

1. Données Vectorielles

Représentation par des formes géométriques :

  • Point : Position précise (restaurant, capteur, adresse)
  • Ligne : Chemin ou frontière (route, rivière, câble)
  • Polygone : Surface délimitée (parcelle, lac, zone administrative)

Avantages :

  • Précision exacte
  • Peu d'espace de stockage
  • Facile à modifier
  • C'est le domaine principal de PostGIS

2. Données Raster

Représentation par une grille de pixels :

  • Images satellites
  • Modèles numériques de terrain (MNT)
  • Cartes de température, précipitations
  • Photos aériennes

Avantages :

  • Bon pour les données continues (température, altitude)
  • Facile à afficher
  • Supporté par PostGIS Raster (extension)

Systèmes de Coordonnées (SRID)

Un point sur Terre peut être décrit de différentes manières selon le système de référence utilisé.

Qu'est-ce qu'un SRID ?

Le SRID (Spatial Reference System Identifier) est un code numérique qui identifie un système de coordonnées.

SRID les plus courants :

SRID Nom Description Usage
4326 WGS84 Latitude/Longitude mondiale GPS, web, universel
3857 Web Mercator Projection Mercator Google Maps, OSM
2154 Lambert 93 Projection conique France Cadastre français
32631 UTM Zone 31N Universal Transverse Mercator Europe de l'Ouest
4269 NAD83 North American Datum USA, Canada

Exemple : La Tour Eiffel

-- En WGS84 (SRID 4326) : latitude/longitude
Point(2.2945, 48.8584)

-- En Lambert 93 (SRID 2154) : projection plane (mètres)
Point(648235, 6862267)

-- Même point, deux représentations différentes !

Pourquoi C'est Important ?

  1. Calculs de distance :

    • Degrés lat/lon ≠ mètres
    • Les systèmes projetés permettent des mesures en mètres
  2. Interopérabilité :

    • Toutes les données doivent être dans le même SRID pour les comparer
    • PostGIS peut transformer entre SRID
  3. Précision :

    • Chaque SRID est optimisé pour une région du monde
    • Utiliser le bon SRID = meilleure précision

Géométrie vs Géographie

PostGIS propose deux types de données spatiales :

Type geometry

  • Calculs sur un plan cartésien 2D (monde "plat")
  • Coordonnées en unités du SRID (degrés pour WGS84, mètres pour Lambert 93)
  • Rapide mais moins précis sur de grandes distances
  • Idéal pour : données projetées, calculs locaux
-- geometry : calcul sur plan 2D
SELECT ST_Distance(
    ST_MakePoint(0, 0),
    ST_MakePoint(1, 1)
);
-- Résultat : ~1.41 (unités du SRID, ici degrés)

Type geography

  • Calculs sur une sphère (modèle de la Terre)
  • Coordonnées toujours en latitude/longitude (WGS84)
  • Distances et surfaces toujours en mètres
  • Précis pour les grandes distances
  • Idéal pour : applications mondiales, GPS, navigation
-- geography : calcul sphérique précis
SELECT ST_Distance(
    ST_MakePoint(0, 0)::geography,
    ST_MakePoint(1, 1)::geography
);
-- Résultat : ~157078 (mètres, distance réelle sur Terre)

Règle générale :

  • Utilisez geography pour des calculs de distance et surface précis
  • Utilisez geometry pour des opérations complexes (intersections, unions) ou si la performance est critique

4. Installation et Activation de PostGIS

Vérifier si PostGIS est Disponible

-- Lister les extensions disponibles
SELECT name, default_version, comment  
FROM pg_available_extensions  
WHERE name LIKE 'postgis%';  

Résultat attendu :

     name      | default_version |                comment
---------------+-----------------+---------------------------------------
 postgis       | 3.4.0          | PostGIS geometry and geography types
 postgis_raster| 3.4.0          | PostGIS raster types and functions
 postgis_topology| 3.4.0        | PostGIS topology spatial types

Activer PostGIS dans une Base de Données

-- Se connecter à la base de données cible
\c ma_base_de_donnees

-- Activer PostGIS
CREATE EXTENSION postgis;

-- Optionnel : Activer les extensions complémentaires
CREATE EXTENSION postgis_topology;  -- Topologie  
CREATE EXTENSION postgis_raster;    -- Raster  

Vérifier l'Installation

-- Version de PostGIS
SELECT PostGIS_Version();

-- Exemple de résultat :
-- "3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1"

-- Version complète avec détails
SELECT PostGIS_Full_Version();

Que se Passe-t-il à l'Activation ?

Lorsque vous exécutez CREATE EXTENSION postgis, PostgreSQL :

  1. Crée le schéma public s'il n'existe pas
  2. Ajoute les types de données : geometry, geography, box2d, box3d
  3. Installe 400+ fonctions : ST_Distance, ST_Intersects, etc.
  4. Crée les opérateurs : &&, <->, etc.
  5. Configure les index : Support GiST, SP-GiST pour les données spatiales
  6. Ajoute les tables système : spatial_ref_sys (catalogue des SRID)
-- Vérifier les types géométriques disponibles
\dT geometry
\dT geography

-- Lister quelques fonctions PostGIS
\df ST_*

-- Voir les SRID disponibles
SELECT srid, auth_name, auth_srid, srtext  
FROM spatial_ref_sys  
WHERE srid IN (4326, 3857, 2154);  

5. Cas d'Usage de PostGIS

PostGIS est utilisé dans de nombreux domaines. Voici quelques exemples concrets :

1. Applications de Mobilité et Livraison

Uber, Lyft, DoorDash, Deliveroo

Fonctionnalités :

  • Trouver les chauffeurs/livreurs les plus proches d'un client
  • Calculer les temps de trajet estimés
  • Définir les zones de service et tarification
  • Optimiser les itinéraires de livraison
-- Trouver les 5 chauffeurs les plus proches
SELECT driver_id, nom,
       ST_Distance(position::geography, client_position::geography) AS distance_m
FROM drivers  
WHERE disponible = true  
  AND ST_DWithin(position::geography, client_position::geography, 5000)
ORDER BY position <-> client_position  
LIMIT 5;  

2. Immobilier et Location

Airbnb, Booking.com, SeLoger

Fonctionnalités :

  • Recherche de logements dans un rayon
  • Affichage sur carte interactive
  • Calcul de distance aux points d'intérêt (métro, commerces)
  • Analyse de quartiers
-- Logements à moins de 500m du métro
SELECT l.titre, l.prix, ST_Distance(l.position::geography, m.position::geography) AS distance_metro  
FROM logements l  
CROSS JOIN LATERAL (  
    SELECT position FROM stations_metro
    ORDER BY position <-> l.position
    LIMIT 1
) m
WHERE ST_DWithin(l.position::geography, m.position::geography, 500);

3. Urbanisme et Aménagement

Collectivités, Cadastre, Géomètres

Fonctionnalités :

  • Gestion des parcelles cadastrales
  • Calcul de surface et périmètre
  • Analyse d'intersection avec zones d'urbanisme
  • Plans locaux d'urbanisme (PLU)
-- Parcelles affectées par un nouveau projet d'urbanisme
SELECT p.reference, p.proprietaire,
       ST_Area(ST_Intersection(p.geometrie, projet.zone)) AS surface_impactee_m2
FROM parcelles p  
JOIN projets_urbains projet ON ST_Intersects(p.geometrie, projet.zone)  
WHERE projet.nom = 'Nouveau quartier Éco-Nord';  

4. Logistique et Transport

DHL, FedEx, Transitaires

Fonctionnalités :

  • Optimisation de tournées de livraison
  • Géofencing (alertes zone géographique)
  • Suivi de flottes en temps réel
  • Analyse de couverture géographique
-- Colis dans la zone de livraison du camion
SELECT c.numero_colis, c.adresse  
FROM colis c  
JOIN camions t ON ST_Contains(  
    ST_Buffer(t.position::geography, t.rayon_livraison_m),
    c.adresse_position::geography
)
WHERE t.id = 'TRUCK-123'
  AND c.statut = 'en_attente';

5. Environnement et Écologie

Agences environnementales, ONGs, Recherche

Fonctionnalités :

  • Suivi de la déforestation
  • Analyse de zones protégées
  • Étude de corridors écologiques
  • Cartographie de pollution
-- Zones forestières dégradées dans un parc national
SELECT
    annee,
    ST_Area(ST_Difference(
        foret_precedente,
        foret_actuelle
    )::geography) / 10000 AS perte_hectares
FROM evolution_foret  
WHERE parc_id = 'PARC-AMAZONIE-01'  
ORDER BY annee;  

6. Télécommunications

Opérateurs télécom, FAI

Fonctionnalités :

  • Planification de couverture réseau (4G, 5G, fibre)
  • Analyse des zones blanches
  • Optimisation de l'emplacement des antennes
  • Calcul d'interférences
-- Zones sans couverture 4G
WITH zones_couvertes AS (
    SELECT ST_Union(ST_Buffer(position::geography, portee_m)) AS couverture
    FROM antennes_4g
    WHERE actif = true
)
SELECT
    commune.nom,
    ST_Area(ST_Difference(commune.geometrie, zc.couverture)::geography) / 1000000 AS zone_blanche_km2
FROM communes commune, zones_couvertes zc  
WHERE ST_Area(ST_Difference(commune.geometrie, zc.couverture)) > 0;  

7. Analyse de Données et Business Intelligence

Entreprises, Retail, Marketing

Fonctionnalités :

  • Analyse de zones de chalandise
  • Heatmaps de clients
  • Cannibalisation entre magasins
  • Géomarketing
-- Analyse de la zone de chalandise d'un magasin
SELECT
    CASE
        WHEN distance_m < 1000 THEN '0-1km'
        WHEN distance_m < 3000 THEN '1-3km'
        WHEN distance_m < 5000 THEN '3-5km'
        ELSE '5km+'
    END AS zone,
    COUNT(*) AS nombre_clients,
    SUM(chiffre_affaires) AS ca_total
FROM (
    SELECT
        c.id,
        c.chiffre_affaires,
        ST_Distance(c.adresse::geography, m.position::geography) AS distance_m
    FROM clients c
    CROSS JOIN (SELECT position FROM magasins WHERE id = 'MAG-001') m
) t
GROUP BY zone  
ORDER BY zone;  

6. Architecture de PostGIS dans PostgreSQL

Couches de l'Architecture

┌─────────────────────────────────────────────┐
│         Application (Python, Java, JS)      │
│         Drivers (psycopg2, node-pg, JDBC)   │
└─────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────┐
│              PostgreSQL Core                │
│  - SQL Parser                               │
│  - Query Planner/Optimizer                  │
│  - Executor                                 │
│  - Transaction Manager (MVCC)               │
└─────────────────────────────────────────────┘
                      │
                      ▼
┌────────────────────────────────────────────┐
│              PostGIS Extension             │
│  ┌─────────────────────────────────────┐   │
│  │   Types: geometry, geography        │   │
│  ├─────────────────────────────────────┤   │
│  │   400+ Functions (ST_*)             │   │
│  ├─────────────────────────────────────┤   │
│  │   Spatial Operators (&&, <->)       │   │
│  ├─────────────────────────────────────┤   │
│  │   Spatial Indexes (GiST, SP-GiST)   │   │
│  └─────────────────────────────────────┘   │
└────────────────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────┐
│         Bibliothèques Externes              │
│  - GEOS (opérations géométriques)           │
│  - PROJ (projections cartographiques)       │
│  - GDAL (lecture raster/vecteur)            │
│  - JSON-C (traitement GeoJSON)              │
│  - LibXML2 (traitement KML/GML)             │
└─────────────────────────────────────────────┘

Les Bibliothèques Sous-Jacentes

PostGIS s'appuie sur plusieurs bibliothèques open-source de référence :

GEOS (Geometry Engine, Open Source)

  • Rôle : Opérations géométriques (intersection, union, buffer, etc.)
  • Origine : Portage C++ de JTS (Java Topology Suite)
  • Version recommandée : 3.11+
  • Fonctions : ST_Intersection, ST_Union, ST_Buffer, ST_Contains, etc.

PROJ

  • Rôle : Transformations de coordonnées et projections cartographiques
  • Version recommandée : 9.0+
  • Fonctions : ST_Transform, ST_SetSRID
  • Base de données : 6000+ systèmes de coordonnées

GDAL (Geospatial Data Abstraction Library)

  • Rôle : Lecture/écriture de formats raster et vectoriels
  • Formats supportés : 200+ (GeoTIFF, Shapefile, GeoJSON, KML, etc.)
  • Utilisé par : PostGIS Raster, import/export

JSON-C

  • Rôle : Parsing et génération JSON/GeoJSON
  • Fonctions : ST_AsGeoJSON, ST_GeomFromGeoJSON

Tables Système PostGIS

Après installation, PostGIS crée plusieurs tables système :

-- Table des systèmes de référence spatiale
SELECT * FROM spatial_ref_sys LIMIT 5;

-- Colonnes :
-- srid      : Identifiant (4326, 3857, etc.)
-- auth_name : Autorité (EPSG, IAU2000, etc.)
-- auth_srid : ID dans l'autorité
-- srtext    : Définition Well-Known Text
-- proj4text : Définition PROJ

-- Table des colonnes géométriques (géographie)
SELECT * FROM geography_columns;

-- Table des colonnes géométriques (géométrie)
SELECT * FROM geometry_columns;

7. Philosophie et Bonnes Pratiques

Pourquoi Intégrer le Spatial dans la Base de Données ?

✅ Avantages

1. Cohérence des données

  • Transactions ACID : les données spatiales et attributaires sont mises à jour ensemble
  • Contraintes d'intégrité référentielle
  • Pas de désynchronisation entre la base et des fichiers SIG externes

2. Performance

  • Index spatiaux natifs (GiST, SP-GiST)
  • Requêtes optimisées par le planificateur PostgreSQL
  • Pas de transfert de données vers un outil externe

3. Simplicité

  • Tout en SQL : pas de nouveau langage
  • Un seul outil pour les données métier et spatiales
  • Pas de synchronisation entre systèmes

4. Scalabilité

  • Réplication PostgreSQL fonctionne pour les données spatiales
  • Partitionnement de tables spatiales
  • Connection pooling standard

❌ Quand NE PAS Utiliser PostGIS ?

  • Données purement raster volumineuses : Mieux vaut un serveur de tuiles dédié
  • Calculs 3D complexes : Des outils spécialisés peuvent être plus adaptés
  • Rendu cartographique temps réel : Serveur cartographique (GeoServer) en complément
  • Big Data spatial extrême : Envisager des solutions distribuées (GeoMesa, Apache Sedona)

Bonnes Pratiques Générales

1. Toujours Définir le SRID

-- ❌ MAUVAIS : SRID non défini
CREATE TABLE restaurants (
    id SERIAL PRIMARY KEY,
    position GEOMETRY
);

-- ✅ BON : SRID explicite
CREATE TABLE restaurants (
    id SERIAL PRIMARY KEY,
    position GEOMETRY(Point, 4326)  -- Type et SRID
);

2. Créer des Index Spatiaux

-- Index spatial obligatoire pour la performance
CREATE INDEX idx_restaurants_position  
ON restaurants  
USING GIST(position);  

3. Utiliser geography pour les Mesures Précises

-- Pour des distances en mètres, toujours utiliser geography
SELECT ST_Distance(
    position::geography,
    autre_position::geography
) AS distance_metres
FROM ...;

4. Valider les Géométries

-- Vérifier la validité avant insertion
SELECT ST_IsValid(geometrie), ST_IsValidReason(geometrie)  
FROM ma_table;  

-- Réparer si nécessaire
UPDATE ma_table  
SET geometrie = ST_MakeValid(geometrie)  
WHERE NOT ST_IsValid(geometrie);  

5. Nommer Clairement les Colonnes

-- Convention recommandée :
-- - "position" pour les points
-- - "trace" ou "ligne" pour les LineString
-- - "zone" ou "geometrie" pour les polygones

CREATE TABLE entites (
    point_position GEOMETRY(Point, 4326),
    trace_route GEOMETRY(LineString, 4326),
    zone_livraison GEOMETRY(Polygon, 4326)
);

8. Premiers Pas avec PostGIS

Créer Votre Première Table Spatiale

-- Activer PostGIS si ce n'est pas déjà fait
CREATE EXTENSION IF NOT EXISTS postgis;

-- Créer une table de restaurants
CREATE TABLE restaurants (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(100) NOT NULL,
    adresse TEXT,
    type_cuisine VARCHAR(50),
    note_moyenne NUMERIC(2, 1),
    position GEOMETRY(Point, 4326),  -- Position GPS (WGS84)
    actif BOOLEAN DEFAULT true,
    created_at TIMESTAMP DEFAULT NOW()
);

-- Créer l'index spatial
CREATE INDEX idx_restaurants_position  
ON restaurants  
USING GIST(position);  

-- Ajouter une contrainte de validation
ALTER TABLE restaurants  
ADD CONSTRAINT position_valide CHECK (ST_IsValid(position));  

Insérer des Données Spatiales

-- Méthode 1 : ST_MakePoint
INSERT INTO restaurants (nom, adresse, type_cuisine, note_moyenne, position)  
VALUES (  
    'Le Bon Café',
    '12 rue de Rivoli, Paris',
    'Français',
    4.5,
    ST_SetSRID(ST_MakePoint(2.3522, 48.8566), 4326)
);

-- Méthode 2 : ST_GeomFromText (format WKT)
INSERT INTO restaurants (nom, adresse, type_cuisine, note_moyenne, position)  
VALUES (  
    'Pizza Express',
    '45 avenue des Champs-Élysées, Paris',
    'Italien',
    4.2,
    ST_GeomFromText('POINT(2.3069 48.8698)', 4326)
);

Votre Première Requête Spatiale

-- Trouver les restaurants à moins de 1 km d'une position
WITH ma_position AS (
    SELECT ST_SetSRID(ST_MakePoint(2.3522, 48.8566), 4326)::geography AS pos
)
SELECT
    r.nom,
    r.type_cuisine,
    r.note_moyenne,
    ROUND(ST_Distance(r.position::geography, mp.pos)::numeric, 0) AS distance_metres
FROM restaurants r, ma_position mp  
WHERE ST_DWithin(r.position::geography, mp.pos, 1000)  
  AND r.actif = true
ORDER BY distance_metres  
LIMIT 10;  

Résultat attendu :

      nom        | type_cuisine | note_moyenne | distance_metres
-----------------+--------------+--------------+-----------------
 Le Bon Café     | Français     |          4.5 |              15
 Pizza Express   | Italien      |          4.2 |             327
 Sushi Bar Tokyo | Japonais     |          4.8 |             542
 ...

Visualiser Vos Données

Bien que PostGIS stocke les données, vous aurez besoin d'outils pour les visualiser :

Options recommandées :

  1. QGIS (Desktop) : Logiciel SIG open-source qui se connecte à PostgreSQL/PostGIS
  2. PgAdmin (Web/Desktop) : Affichage basique des géométries
  3. DBeaver (Desktop) : Client SQL avec support spatial
  4. Leaflet/Mapbox (Web) : Bibliothèques JavaScript pour applications web
  5. Kepler.gl (Web) : Outil de visualisation géospatiale puissant

9. Ressources et Apprentissage

Documentation Officielle

Livres Recommandés

  • "PostGIS in Action" (3rd Edition) - Regina Obe, Leo Hsu
  • "PostGIS Cookbook" - Paolo Corti, Stephen Vincent Mather
  • "Learning PostgreSQL with PostGIS" - Julieta Lopez

Communautés

Tutoriels en Ligne

  • Boundless PostGIS Workshop : Tutoriel complet gratuit
  • Carto Academy : Cours et tutoriels
  • Paul Ramsey's Blog : Contributeur principal PostGIS

10. Prochaines Étapes

Maintenant que vous comprenez ce qu'est PostGIS et pourquoi c'est la référence mondiale pour les bases de données spatiales, vous êtes prêt à explorer en détail :

18.2.1. Types Géométriques

Vous apprendrez à :

  • Créer et manipuler des Points (positions)
  • Travailler avec des LineStrings (lignes, routes)
  • Gérer des Polygons (zones, surfaces)
  • Comprendre les formats d'échange (WKT, WKB, GeoJSON)

18.2.2. Index Spatiaux

Vous découvrirez :

  • Les index GiST (Generalized Search Tree)
  • Les index SP-GiST (Space-Partitioned GiST)
  • Quand et comment les utiliser pour des performances optimales

18.2.3. Fonctions Spatiales

Vous maîtriserez :

  • ST_Distance : Calculer des distances
  • ST_Intersects : Détecter des intersections
  • Et des dizaines d'autres fonctions essentielles

Conclusion

PostGIS est bien plus qu'une simple extension : c'est un écosystème complet qui transforme PostgreSQL en un SIG professionnel. Avec plus de 20 ans d'existence, une communauté active, une conformité totale aux standards, et une adoption mondiale, PostGIS est aujourd'hui la référence incontestée des bases de données spatiales open-source.

Points clés à retenir :

  1. PostGIS = PostgreSQL + Capacités Spatiales

    • Extension native, pas un logiciel séparé
    • Tout en SQL, pas de nouveau langage
  2. Leader mondial open-source

    • Alternative gratuite à Oracle Spatial et SQL Server Spatial
    • Plus riche fonctionnellement que MySQL et MongoDB
    • Conformité complète aux standards OGC
  3. Deux types principaux

    • geometry : Plan 2D, rapide
    • geography : Sphérique, précis en mètres
  4. Importance du SRID

    • Définit le système de coordonnées
    • 4326 (WGS84) pour GPS et applications mondiales
    • Systèmes projetés pour précision locale
  5. Cas d'usage universels

    • Mobilité, immobilier, urbanisme, logistique
    • Environnement, télécoms, business intelligence

PostGIS place la puissance de l'analyse géospatiale directement au cœur de votre base de données, là où sont vos données métier. C'est une compétence essentielle pour tout développeur ou data engineer travaillant avec des données de localisation.

Bienvenue dans le monde de la géomatique avec PostGIS ! 🌍


Prochaine section : 18.2.1. Types géométriques (Point, LineString, Polygon)

Ressources :

⏭️ Types géométriques (Point, LineString, Polygon)