PostGIS

Présentation

PostGIS est l’extension spatiale de PostgreSQL (comme Oracle spatial est celle d’Oracle). Elle permet de manipuler des objets géographiques grâce à des géométries (points, lignes, polygones…), la géométrie étant alors un type à part entière et non une simple succession de coordonnées. Ce type est alors manipulable au même titre que les autres, avec un grand nombre d’opératios possibles.

L’accès aux données peut se faire à l’aide d’un client SQL (PGAdmin, DBeaver…), à travers un logiciel tiers (QGis…), en ligne de commande (en utilisant les utilitaires de la bibliothèque GDAL), ou à l’aide d’un serveur cartographique (geoserver…).

Quelques exemples d’opération courantes

  • connaître le système de projection de chaque enregistrement de la colonne geom (le nom par défaut de la colonne contenant la géométrie)

    SELECT ST_SRID(geom) from [tablename];

  • connaître le type d’une géométrie

    SELECT GeometryType(geom) FROM [tablename] WHERE … ;

  • créer une enveloppe autour d’une géométrie (un rectangle au plus près de la géométrie)

    SELECT ST_ENVELOPPE(geom) FROM [tablename] WHERE … ;

  • créer un polygone (ici en coordonnées GPS) à partir de coordonnées

    SELECT ST_Polygon(“LINESTRING(x1 y1, x2 y2, x3 y3, x1 y1)”::geometry, 4326);

  • afficher le contenu d’une géométrie au format texte

    SELECT ST_AsText(geom) FROM [tablename] WHERE … ;

  • afficher les données de la table dont les géométries ne sont pas valides avec la raison pour laquelle elles ne le sont pas

    SELECT *, ST_IsValidReason(geom) FROM [tablename] WHERE not ST_IsValid(geom);

  • convertir le système de projection (ici en Lambert93)

    SELECT ST_TRANSFORM(geom, 2154) FROM [tablename] WHERE … ;

  • connaître la superficie d’une géométrie (polygone par exemple)

    SELECT ST_Area(geom) FROM [tablename] WHERE … ;

    Attention, la superficie sera retournée dans la même unité que même système de projection que la géométrie. Evitez donc le 4326.

  • connaître le périmètre d’une géométrie;

    SELECT ST_Perimeter(geom) FROM [tablename] WHERE … ;

  • savoir si 2 géométries ont une intersection

    SELECT ST_Intersects(a.geom,b.geom) FROM [tablename1] a, [tablename2] b WHERE … ;

  • savoir si 2 géométries se touchent

    SELECT ST_Touches(a.geom,b.geom) FROM [tablename1] a, [tablename2] b WHERE … ;

  • indexer la colonne géométrique (rend les requêtes topologiques incroyablement rapides)

    CREATE INDEX [indexname] ON [tablename] USING GIST (geom);

Le site de référence

http://postgis.net avec la documentation de la dernière version http://postgis.net/docs/manual-dev/postgis-fr.html