Laurent Jégou 01/12/2011 M2 Sigma M2 Sigma U50_B33 WebMapping Séance 2 Les systèmes de bases de données spatiales PostGIS Webographie spécifique : Tutoriel FOSS4G 2011 (en français) : http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/index.html Guide utilisateur de D. Techer (en français, mais pour la version 1.3 de 2007) : http://www.davidgis.fr/documentation/win32/html/index.html 1- Le principe du stockage d objets spatiaux et des fonctions d interrogation et de traitement et de génération d objets. a- La norme Simple Features for SQL (Norme OpenGIS de l OGC). Une norme très utilisée qui définit le format numérique de stockage pour des objets géographiques, munis ou non d attributs non spatiaux. Il s agit de géométries 2D simples, avec interpolation linéaire entre vertex. (Schéma tiré de la norme OpenGeo / OGC SF-SQL, 05-134) La norme définit en outre des fonctions de conversion de formats et opérations spatiales sur ces géométries (calculs de distances / surfaces, relations spatiales, arithmétique entre géométries, etc.). Document sous licence CC-BY-SA 1
b- Les principales implémentations - PostGIS (extension intégrée de PostGreSQL) - SpatiaLite (extension de SQLite) - MyGIS (extension intégrée de MySQL) - Oracle Spatial - Microsoft SQL Server 2008 Aujourd'hui certains de ces logiciels progressent vers des possibilités SIG plus avancées comme le support de types de données géographiques gérant possédant une topologie complète, de rasters. 2- PostGIS, principes et utilisation a- Présentation Un moteur de BD orienté entreprise et réseau (sécurité, optimisation, réactivité) PostgreSQL est un SGBDR basé sur le logiciel POSTGRES développé à l'université de Californie au département des sciences informatiques de Berkeley à partir de 1986. POSTGRES était un logiciel expérimental dans le domaine des BDD, et il a servi de plateforme de test pour de nombreuses technologies modernes : requêtes complexes ; clés étrangères ; déclencheurs (triggers) ; vues ; intégrité des transactions ; contrôle des accès concurrents (multi-utilisateur en temps réel, MVCC ou multiversion concurrency control). Aujourd hui PostgreSQL qui est son héritier open source se vante d être le SGBDR le plus avancé au monde, car il possède des fonctionnalités très puissantes et le moyen de les étendre facilement par la programmation (langages de macro). PostGIS est pour une bonne partie codé dans un de ces langages de macro, plpgsql. Organisation d une BDD PostGIS (particularités de PostgreSQL et tables PostGIS) Une installation de PostgreSQL (un cluster) contient une ou plusieurs bases de données, totalement indépendantes. Chaque base de données peut ensuite contenir un ou plusieurs schémas, ou subdivisions logiques, ces derniers contenant les objets courants de base de données (tables, vues, fonctions, requêtes, etc.). Document sous licence CC-BY-SA 2
Cluster o Base de données Schéma Tables Fonctions Requêtes Vues Les utilisateurs peuvent avoir des droits différents (rôles), sur chaque base de données et chaque table. PostGIS ajoute à ce système ses types de données et ses (très nombreuses) fonctions, Cf. : http://postgis.refractions.net/documentation/manual-1.3/ch06.html Il ajoute aussi deux tables utilitaires : geometry_colums et spatial_ref_sys. La première sert à indiquer au logiciel quels sont les champs contenant des types géographiques dans chacune des tables. La seconde contient les paramètres des systèmes de projection supportés et sert en interne au logiciel : ce sont en fait les paramètres utilisés par la bibliothèque de fonctions PROJ.4 qui gère le système de projection. On peut y retrouver les principales projections utilisées sous leurs identifiants EPSG (L93 = 2154). La prochaine version de PostGIS, attendue courant 2012, apportera des innovations importantes, comme la gestion des données rasters et la prise en compte plus poussée des relations topologiques. Cependant, vous pouvez déjà tester la gestion des données rasters avec la version beta de PostGIS 2.0 ou du plugin WKTRaster (sur la page des projets expérimentaux du site de PostGIS). b- Principe d utilisation de PostGIS Le principe est donc de pouvoir : - stocker des informations géographiques en tenant compte de ces caractéristiques particulières (projection, dimensions, etc.), - réaliser des opérations de type SIG comme des mesures de distance, d intersection, - créer de nouvelles géométries en les décrivant dans un format reconnu, ou comme résultat d opérations sur des géométries existantes (arithmétiques), - retourner des informations géographiques (géométries et/ou attributaires) selon un format précis, sur le réseau. Document sous licence CC-BY-SA 3
c- Installation de PostgreSQL / PostGIS sous Windows XP Cf. Procédure détaillée en annexe, avec copies d écrans. Télécharger le paquet d installation sur http://www.enterprisedb.com/products/pgdownload.do Laisser les chemins d installation par défaut (programme et data) Choisir un mot de passe pour le superuser du cluster : postgres (nous faisons une installation locale de test, naturellement en production il faudra choisir un mot de passe plus sur). Laisser le port par défaut (5432) Choisir le «locale» French/french Laisser l installeur lancer le «stack builder» à la fin de l installation Dans StackBuilder, choisir le cluster PG local Dans le groupe «spatial extensions», choisir PostGIS Choisir un serveur FTP où télécharger l extension Dans l installation de PostGIS, laisser les choix par défaut (postgis et «create spatial database») Fournir l identifiant et le mot de passe du superuser postgres Une base de données spatiale sera créée et nommée «postgis» par défaut Le serveur PostGreSQL est installé, il s'agit d'un service windows à démarrage automatique (lancé à chaque fois que windows démarre, à modifier en démarrage à la demande sur une machine qui n'est pas dédiée serveur). Lancer ensuite PGAdminIII dans le même menu démarrer pour vérifier la connexion. Préparation de la base : Créer un nouveau rôle d utilisation (un nouvel utilisateur), ayant les droits sur la base «PostGIS» du cluster, par exemple «sigma» et mot de passe «sigma». Tester la connexion au serveur avec ce rôle. Configuration de PostGIS sur le serveur - ouvrir si besoin les connexions au réseau local dans le fichier pg_hba.conf : host all all 0.0.0.0/0 trust - modifier la définition de la page de codes du client dans le fichier postgresql.conf client_encoding = latin1 (Sinon les caractères avec accents ne seront pas reconnus et bloqueront l'insertion de nouvelles données dans la base, qui est en codage UTF8 par défaut). recharger la configuration (dans le menu démarrer de Windows, PostgreSQL). Document sous licence CC-BY-SA 4
d- Alimentation de la base de données Les jeux de données gratuites et libres d utilisation sont à récupérer dans une archive compressée : Leur provenance originale est : - Données GéoFla Départments IGN au format shape (Lambert93) o http://professionnels.ign.fr/display/000/528/175/5281750/geoflade pt_fr_corse_av_l93.zip - Données BD Carthage : Cours d eau du bassin Adour-Garonne (Lambert93) o http://services.sandre.eaufrance.fr/data/zonage/hydrographie2011/arcgis/ Bassins/AG/ - Données DREAL Midi-Pyrénées des stations de mesures hydrologiques (Lambert93) o http://carmen.developpementdurable.gouv.fr/index.php?map=global.map&service_idx=23w Conversion en commandes SQL et intégration des données : Dans PGAdminIII, choisir dans le menu «Plugin» : «Shape File to PostGIS Importer» Modifiez les paramètres proposés en écriant le nom de la table en minuscules et en changeant le code système de projection par défaut (-1 pour «inconnu») par celui des couches à importer : 2154 (code EPSG pour le Lambert RGF 93). cette opération est à répéter à chaque importation de données, sinon elles ne seront pas correctement reconnues dans leur projection. Attention à placer les fichier shape à importer dans un répertoire dont le chemin ne présente pas un nom trop complexe : 8 lettres max. et pas d'espace. Exemple pour le GéoFla Départements (IGN) : Document sous licence CC-BY-SA 5
Attention : pour les données BD Carthage, qui comporte des toponymes en minuscules avec accents, prenez bien soin de préciser (bouton «Options») que l encodage des caractères est de type «LATIN1» dans le.dbf de la source (les fichiers DBF ne contiennent pas d'information sur leur encodage de texte). L importation par ce plugin va convertir les shapefiles en tables postgis, et créer les informations utiles dans la table geometry_columns ainsi qu un index sur la colonne contenant les géométries. Un champ "gid" sera de même rajouté (sauf option contraire) aux tables, contenant des valeurs numériques uniques permettant de créer une clé primaire. Les géométries des objets spatiaux sont stockées dans un champ de type "geometry", qui a été ajouté au serveur par l'installation de PostGIS. Ces champs contiennent en fait une description de la géométrie dans un format binaire compressé, que l'on peut lire en utilisant la fonction ST_AsText(the_geom). PostGIS possède dans le même ordre d'idées des convertisseurs de format permettant de générer du KML ou du GeoJSON. Document sous licence CC-BY-SA 6
e- Exercices pratiques de découverte progressive des fonctions L'utilisation des fonctions de PostGIS s'effectue au travers de requêtes SQL, comme on utiliserait les fonctions habituelles de PostGreSQL. Sélection attributaire simple Les départements de la région Midi-Pyrénées (code 73) : SELECT * FROM departement WHERE code_reg = '73' Les noms des cours d eau principaux du bassin Adour-Garonne : SELECT toponyme FROM courseau WHERE classe = '1' Lister les noms des cours d eau comportant le nom «Garonne» : SELECT toponyme FROM courseau WHERE toponyme like '%Garonne' Compter le nombre de tronçons de la Garonne : SELECT count(gid) FROM courseau WHERE toponyme = 'La Garonne' Calculs spatiaux simples Mesurer la Garonne (dans le jeu de données partiel téléchargé) : SELECT sum(length(the_geom)) FROM courseau WHERE toponyme = 'La Garonne' La superficie du département du Tarn (code 81) : SELECT area(the_geom) FROM departement WHERE code_dept = '81' Résultat : 5 781 488 782.5 m2 (donc 5 781 km2). Le périmètre du polygone du Tarn : SELECT perimeter(the_geom) FROM departement WHERE code_dept = '81' Résultat : 459 569.4 m (la couche est en projection Lambert 93, donc les données sont dans l'unité du mètre, ce qui correspond à 460 km). Sélections spatiales simples (sans relation entre plusieurs tables) Les départements limitrophes du Tarn Document sous licence CC-BY-SA 7
SELECT d.nom_dept FROM departement as d, (SELECT the_geom FROM departement WHERE departement.code_dept = '81') as tarn WHERE ST_Touches(d.the_geom, tarn.the_geom) Les départements à moins de 200km de la frontière du Tarn : SELECT DISTINCT d.code_dept, d.nom_dept FROM departement as d, Les cours d'eau du Tarn : (SELECT the_geom FROM departement WHERE departement.code_dept = '81') as tarn, ST_buffer(tarn.the_geom, 200000) as le_buffer WHERE ST_contains(le_buffer, d.the_geom) SELECT DISTINCT ce.toponyme FROM courseau as ce, (SELECT the_geom FROM departement WHERE code_dept = '81') as tarn WHERE ST_intersects(tarn.the_geom, ce.the_geom) Les points de mesure hydrologiques du Tarn : SELECT DISTINCT mes.nom_usuel FROM st_eausup_ag as mes, (SELECT the_geom FROM departement WHERE code_dept = '81') as tarn WHERE ST_Contains(tarn.the_geom, mes.the_geom) Le nom des points de mesure à proximité de la Garonne : - Création d une table temporaire pour stocker un buffer de 100m autour de la Garonne : create table bgaronne as select st_buffer(the_geom, 100) as the_geom from courseau where toponyme = 'La Garonne' - Recherche des points de mesure dans ce polygone : select st_eausup_ag.nom_usuel from st_eausup_ag, bgaronne where st_contains(bgaronne.the_geom, t_eausup_ag.the_geom) Document sous licence CC-BY-SA 8
f- Test du logiciel QuantumGIS comme client PostGIS Créer une connexion au serveur PG Charger les couches disponibles Vérifier les projections Tester la visualisation et la symbolisation Tester la modification de couches, observer la répercussion sur le serveur Tester la création de couches issues de requêtes de sélection. g- Exercices - Télécharger les données "Admin-0 Countries" version 1:110M du site : http://www.naturalearthdata.com/downloads/ - Télécharger les données "Populated Places" version 1/110M - Les intégrer au serveur PostGIS, dans leur projection Répondre aux questions suivantes : - Quels sont les pays frontaliers du Bhoutan? - Quelle est la distance, en kms, entre Paris et Londres? Document sous licence CC-BY-SA 9
ANNEXE : Installation de PostGreSQL + PostGIS sous Win32. Télécharger le paquet d installation sur http://www.enterprisedb.com/products/pgdownload.do Laisser les chemins d installation par défaut (programme et data) Document sous licence CC-BY-SA 10
Choisir un mot de passe pour le superuser postgres du cluster : postgres (installation locale de test, naturellement en production il faudra choisir un mot de passe plus sur). Laisser le port par défaut (5432) Document sous licence CC-BY-SA 11
Choisir le «locale» French/french Laisser l installeur lancer le «stack builder» à la fin de l installation Document sous licence CC-BY-SA 12
Dans StackBuilder, choisir le cluster PG local Dans la catégorie «Spatial Extensions», choisir PostGIS Document sous licence CC-BY-SA 13
Choisir un serveur FTP où télécharger l extension Dans l installation de PostGIS, laisser les choix par défaut (postgis et «create spatial database») Laisser le chemin d installation par défaut (le chemin de PG). Document sous licence CC-BY-SA 14
Fournir l identifiant et le mot de passe du superuser : postgres Une base de données spatiale sera créée et nommée «postgis» par défaut Document sous licence CC-BY-SA 15
Laisser l installateur insérer la commande shp2pgsql dans PGAdminIII Lancer ensuite PGAdminIII dans le même menu démarrer pour vérifier la connexion. Document sous licence CC-BY-SA 16