Licence 3 MIASHS info – UE MIGE504V Bloc « Webmapping 1 : Bases de données spatiales serveur (PostgreSQL-PostGIS) Enseignants : Émilie Lerigoleur, Laurent Jégou 4 séances de 2h : 18/11 : 8h30 – 12H30 (E. Lerigoleur) 29/11 : 16h – 18h (E. Lerigoleur) 30/11 : 16h – 18h (L. Jégou) Emilie.Lerigoleur@univ-tlse2.fr
Compétences à acquérir Licence 3 MIASHS info – UE MIGE504V Compétences à acquérir Les BDD spatiales et leurs spécificités Savoir installer et configurer PostGIS dans PostgreSQL Concevoir une BDD PostGIS Importer des données spatiales, écrire et exécuter des requêtes spatiales simples Liaison avec un SIG (QGIS) Savoir visualiser et traiter les données spatiales contenues dans PostGIS dans QGIS Créer des cartes interactives basiques via QGIS Concevoir des requêtes complexes Appréhender les problèmes de performance des requêtes spatiales Extraire de l’information en direction de clients lourds et légers 18 et 29/11 30/11
Bases de données spatiales Licence 3 MIASHS info – UE MIGE504V Bases de données spatiales Séances 1 et 2 Introduction générale TP PostgreSQL-PostGIS Liaisons PostGIS-QGIS Emilie Lerigoleur Emilie.Lerigoleur@univ-tlse2.fr 2016/2017
Plan du cours Introduction sur les bases de données spatiales et le choix de PostgreSQL/PostGIS Installation et configuration de PostgreSQL. Création de BDD spatiales PostGIS – TP 1 Spécificités de PostGIS – TP 2 Liaison PostGIS-QGIS : les fonctions complémentaires de QGIS de gestion et de visualisation des tables et vues de PostGIS – TP 3 Import/export de données spatiales via PostgreSQL et QGIS – TP 4 Requêtes spatiales simples – TP 5 Découverte de la cartographie interactive avec QGIS à partir notamment de données PostGIS – TP 6
Introduction I. Introduction sur les BDD spatiales. Installation et exploration de PostGIS
Bases de données spatiales ? SGBD spatiaux ? Introduction Bases de données spatiales ? SGBD spatiaux ? Stockage attributaire et géométrique Requêtes SQL attributaires et spatiales (opérations SIG) et création de nouvelles géométries Renvoi aux clients des données attributaires/spatiales selon différents formats Données volumineuses et traitements longs/complexes pris en charge Respect des standards existants de l’Open Geospatial Consortium (OGC) : Simple Features for SQL et SQL Multimedia Applications Spatial specification 1 table = 1 couche SIG (layer) BDD pas obligatoirement relationnelle ! PostgreSQL/PostGIS, Oracle spatial, Microsoft SQL server, SpatiaLite, DB2, MySQL/MyGIS, Esri ArcGIS, et apparition plus récente chez les BDD NoSQL (MongoDB, CouchDB, Solr…) « A spatial database gives you a storage tool, an analysis tool, and an organizing tool all in one » (Obe & Hsu, PostGIS in action 2nd edition, 2015) Qu’est-ce qu’une base de données spatiales et quels sont les systèmes de gestion de BDD qui proposent ces extensions spatiales ? Tout comme les bases de données « classiques », la principale fonction est le stockage des objets qui sont décrits par des attributs. La spécificité des BDD spatiales est de gérer également les géométries de ces objets. Ainsi il sera possible d’exécuter des requêtes non seulement sur les attributs mais aussi sur les propriétés spatiales des objets, tout comme le ferait un logiciel SIG ! De plus on peut créer de nouvelles géométries souvent suite à la réalisation d’opérations sur des géométries existantes. Comme il s’agit de BDD client-serveur, le SGBD spatial permet de renvoyer aux clients des informations géographiques selon le format adapté (JSON, GeoJSON, KML,…). Ces systèmes sont capables de gérer des données volumineuses et d’exécuter des traitements longs et/ou complexes. Dans les précédents cours vous avez sans doute entendu parlé de l’OGC qui est un consortium international pour développer et promouvoir des standards ouverts (les spécifications OpenGIS) afin de garantir l’interopérabilité des contenus, des services et des échanges dans les domaines de la géomatique et de l’information géographique. Les SGBD spatiaux veillent à respecter ces normes, nous allons en reparler dans ce cours. Dans une base de données spatiales, 1 table (ou une vue) correspond à 1 couche SIG spatiale. Si les couches SIG ne sont pas liées entre elles, alors il n’y aura pas de relation entre les tables de la BDD. Les logiciels proposant ces fonctionnalités spatiales sont de plus en plus nombreux. Ici en sont listés les principaux. Il y a des solutions open source comme PostgreSQL/PostGIS, SpatiaLite, MySQL et les SGBD NoSQL comme MongoDB par exemple. Puis il y a des logiciels payants comme Oracle spatial, Microsoft SQL Server, DB2 chez IBM et ArcGis chez Esri. Pour finir sur ces aspects, cette phrase tirée de l’excellent livre « PostGIS in action » vous permet de récapituler les 3 principaux rôles d’une BDD spatiale, à savoir le stockage, l’analyse et l’organisation des données. Ce n’est donc pas seulement un simple outil de stockage.
Bases de données spatiales Serveur et flux de données Introduction Bases de données spatiales Serveur et flux de données Au niveau de l’architecture logicielle, les bases de données (spatiales ou non) se trouvent côté serveur. Ce schéma vous montre tout d’abord la diversité des données sources. En effet, elles peuvent être issues soit de capteurs ou d’instruments de mesures environnementales diverses et variées (par exemple des relevés de température de différentes stations météo), soit d’appareils de type GPS plus ou moins précis (souvent sous la forme de traces GPS-GPX), soit de cartes ou d’images satellitaires géoréférencées ou enfin d’observations directes. Maintenant, du côté des flux sortants, il est intéressant de voir qu’une BDD spatiale peut être connectée à différents logiciels ou applications tels que les logiciels SIG, des applications « front ends » de gestion/visualisation de données, des logiciels de statistiques ou d’analyses spatiales et des cartographies interactives (web SIG). Basille & Labbé, 2011
PostGIS Extension spatiale de PostgreSQL Introduction PostGIS Extension spatiale de PostgreSQL Free, open source, licence GNU GPL v2 Projet soutenu par la Fondation Géospatiale Open Source Respect des standards : ANSI SQL features, OGC et nouveaux standards SQL/MM Multimedia Spec spatial standards Écrit principalement en C Société éditrice Canadienne Refractions Research Communauté de développeurs très active Regardons à présent de plus près l’outil qui nous intéresse : PostGIS. Il faut savoir qu’il s’agit d’une extension spatiale du célèbre SGBDR PostgreSQL. En effet, PostgreSQL est un outil modulable à souhait, grâce à ses extensions qui s’installent selon le besoin. Par exemple, si on souhaite gérer la traçabilité de la saisie des données dans la BDD, on peut installer l’extension « spi » qui rajoute automatiquement 2 colonnes dans chaque table avec le nom de l’utilisateur qui saisit la donnée et la date de la saisie. De la même façon, si on souhaite gérer de l’information géographique, alors on installe l’extension PostGIS. PostgreSQL étant open source, PostGIS l’est donc également et sous une licence publique générale GPL v2. Le projet PostGIS est soutenu depuis le début par l’OSGeo qui est la Fondation géospatiale open source. Côté langage, PostGIS est écrit essentiellement en C. A l’origine de sa création il y a la société éditrice canadienne Refractions Research. Cette société a d’ailleurs également produit le SIG open source uDig, la bibliothèque de fonctions Java GeoTools et aussi le moteur cartographique Geoserver. PostgreSQL et son extension PostGIS, c’est actuellement l’une des références en matière de SGBD spatial. La communauté de développeurs est et reste très active.
Introduction Pourquoi PostGIS ? Compatible avec de nombreux logiciels et bibliothèques de fonctions Javascript (ici quelques exemples) Toujours dans cette partie introductive, voici quelques éléments justifiant le choix de l’outil PostGIS pour ces cours. Le premier argument, c’est le fait qu’il soit compatible avec de nombreux logiciels et bibliothèques de fonctions Javascript notamment. Ce schéma vous montre à gauche le côté « applications de bureau » avec les logiciels SIG uDig, QGIS, GRASS et ArcGIS qui représentent actuellement environ 90% des utilisateurs de ce type de logiciels. Cela justifie ainsi tout l’intérêt de travailler avec une BDD serveur qui se connecte aisément à nos applications locales de bureau. Au centre du schéma on retrouve les logiciels côté serveur tels que les moteurs cartographiques Mapserver ou Geoserver et même la solution payante ArcServer d’Esri. Enfin, à droite il y a les bibliothèques de fonctions qui permettent de développer des interfaces cartographiques interactives comme Openlayers ou Leaflets que vous verrez ultérieurement dans les cours de webmapping (semestre 2). Shuai, 2014 LAN : Local Area Network
Pourquoi PostGIS ? Un bon rapport qualité - prix Prix Fonctionnalités Introduction Pourquoi PostGIS ? Un bon rapport qualité - prix Prix Le deuxième argument en faveur de PostGIS, et non des moindres, est son rapport qualité - prix. Ce graphe vous illustre les principales solutions concurrentes avec d’un extrême à l’autre, MySQL qui est gratuit mais insatisfaisant au niveau des fonctionnalités qu’il propose et Oracle spatial qui d’autre part est très cher mais garantit de nombreuses fonctions de qualité. PostGIS est open source et soutenu par une grande communautés de développeurs, c’est ce qui fait sa force. Fonctionnalités D’après El Kharki & Mechbouh, 2015
Pourquoi PostGIS ? Un « couteau suisse » Introduction fonctions Raster (GDAL) et Vecteur (OGR) gestion d’opérateurs spatiaux gestion de nombreux systèmes de projections Enfin, PostGIS utilise des bibliothèques open source fiables et reconnues dans leur domaine, avec tout d’abord GDAL pour les fonctions Raster couplé à OGR pour tout ce qui est lié au vectoriel. Ensuite GEOS permet de réaliser de nombreuses opérations spatiales sur les données géométriques, notamment pour effectuer des interactions spatiales entre des objets géométriques comme par exemple les fonctions d’intersection, d’union, de zone tampon, et même d’encodage des géométries. Nous y reviendrons en détail dans la suite du cours. Proj4 est également un composant très important de PostGIS puisqu’il gère de très nombreux systèmes de projections spatiales et permet donc de projeter et reprojeter les données spatiales. Enfin LibXML2 est très riche en fonctionnalités complémentaires notamment le fait de permettre l’analyse syntaxique (= parser) d’un document XML. Vous verrez que c’est utile car PostGIS est compatible avec de nombreux formats de données dont les formats KML et GML qui sont basés sur du XML. « parsing » XML
Introduction Un exemple d’utilisation de PostGIS au sein d’un laboratoire de recherche Cas du CESBIO (Centre d'Etudes Spatiales de la BIOsphère) Cros 2014 (http://devlog.cnrs.fr/_media/ids2014_cros_architecture_sie.pdf?id=ids2014_j1&cache=cache)
Introduction Un exemple d’utilisation de PostGIS au sein d’un service informatique d’un ministère Service des Technologies et des Systèmes d'Information de la Sécurité Intérieure Pommereau 2016 (https://osgeo-fr.github.io/presentations_foss4gfr/2016/J2/2016_05_12_FOSS4G-FR_carto_securite_interieure.pdf )
Plan du cours Introduction sur les bases de données spatiales et le choix de PostgreSQL/PostGIS Installation et configuration de PostgreSQL. Création de BDD spatiales PostGIS – TP 1 Spécificités de PostGIS – TP 2 Liaison PostGIS-QGIS : les fonctions complémentaires de QGIS de gestion et de visualisation des tables et vues de PostGIS – TP 3 Import/export de données spatiales via PostgreSQL et QGIS – TP 4 Requêtes spatiales simples – TP 5 Découverte de la cartographie interactive avec QGIS à partir notamment de données PostGIS – TP 6
Bonnes pratiques II. Installation et Configuration de postgresQL. Création de BDD PostGIS Méthodologie et bonnes pratiques
Installation PostGis 2.2.2 et création d’une base de données spatiale Installation, configurations et création BDD Installation PostGis 2.2.2 et création d’une base de données spatiale 1/ Installer les fichiers binaires de PostgreSQL : cf. http://postgis.net/install/ Linux/Unix : utiliser yum ou apt-get pour installer les binaires Windows : privilégier EnterpriseDB StackBuilder Windows : Superutilisateur = postgres Mdp (défaut) = postgres L’installation de PostGIS se fait en 3 étapes : 1/ l’installation des binaires qui vous est indiqué ici à titre informatif puisque PostgreSQL est déjà installé. Sous Linux/Unix, il vaut mieux passer par yum ou apt-get pour le réaliser. Pour Windows il est recommandé de télécharger PostgreSQL via le site de EnterpriseDB. Tout est expliqué sur le site officiel de PostGIS : postgis.net
PostgreSQL et ses interfaces d’utilisation Installation, configurations et création BDD PostgreSQL et ses interfaces d’utilisation Interface graphique Interface en ligne de commande Plusieurs outils sont installés en même temps que PostgreSQL, notamment les deux interfaces d’utilisation que nous allons utiliser : L’interface graphique pgAdminIII ou pgAdmin4 (captures d’écran avec pgAdminIII dans ce cours) Le shell SQL en ligne de commande Ces deux outils permettent de créer, gérer et administrer PostgreSQL et ses bases de données spatiales ou non spatiales. Nous utiliserons par ailleurs en complément l’invite de commande du DOS pour exécuter des commandes d’import et d’export des données. + Invite de commande DOS
Installation PostGis 2.2.2 et création d’une base de données spatiale Installation, configurations et création BDD Installation PostGis 2.2.2 et création d’une base de données spatiale 1/ Installer les fichiers binaires : cf. http://postgis.net/install/ 2/ Créer une nouvelle base de données et activer l’extension postgis Utiliser soit la fenêtre SQL de pgAdmin soit la console PSQL qui peut s’ouvrir via pgAdmin CREATE DATABASE bdd_postgis ; CREATE EXTENSION postgis ; 2/ Deuxième étape du processus d’installation : l’activation de l’extension PostGIS. Afin d’activer l’extension il faut au préalable créer une base de données dans PostgreSQL via la commande « CREATE DATABASE », nous allons l’appeler bdd_postgis. Cela peut-être réaliser soit via la fenêtre SQL de pgAdmin, soit via Plugins/PSQL console (voir capture d’écran) qui donne accès à la bdd_postgis en ligne de commande. Ensuite, il suffit d’exécuter la requête « CREATE EXTENSION postgis; » pour activer PostGIS et transformer cette BDD en base spatiale.
Installation PostGis 2.2.2 et création d’une base de données spatiale Installation, configurations et création BDD Installation PostGis 2.2.2 et création d’une base de données spatiale 1/ Installer les fichiers binaires : cf. http://postgis.net/install/ 2/ Créer une nouvelle base de données et activer l’extension postgis CREATE DATABASE bdd_postgis ; CREATE EXTENSION postgis ; 3/ Vérifier les versions : SELECT postgis_full_version() ; POSTGIS="2.2.2 r14797" GEOS="3.5.0-CAPI-1.9.0 r4090" PROJ="Rel. 4.9.1, 04 March 2015" GDAL="GDAL 2.0.2, released 2016/01/26 LIBXML="2.7.8" LIBJSON="0.12" RASTER 3/ Dernière étape, vérifions à présent que tout est bien installé via la commande « SELECT postgis_full_version(); », toujours soit via la fenêtre SQL de pgAdmin, soit via la console psql. On retrouve effectivement les versions installées pour chaque composant de PostGIS.
Aperçu du cluster de BDD et de la bdd_postgis Installation, configurations et création BDD Aperçu du cluster de BDD et de la bdd_postgis Ajout notamment de fonctions, de la table spatial_ref_sys et de 4 vues pgAdmin permet de gérer le serveur PostgreSQL. Une installation de PostgreSQL dénommée cluster contient une à plusieurs bases de données indépendantes. Chaque base de données contient un à plusieurs schémas qui sont des subdivisions logiques regroupant les objets de la base de données (tables, vues, fonctions,…). Explorons à présent la bases de données bdd_postgis qui vient d’être créée. Tout d’abord, elle présente un schéma par défaut « public » qui contient 1109 fonctions, 1 table dénommée « spatial_ref_sys » et 4 vues systèmes « geography_columns », « geometry_columns », raster_columns » et « raster_overviews ». Nous reviendrons plus en détail sur tous ces éléments ajoutés par PostGIS lors de son activation. Par ailleurs, notez que par défaut l’encodage des caractères est en UTF-8, il faut penser à le transformer en LATIN1 ou autre encodage selon les données attributaires que l’on manipule. Remarquez également le propriétaire par défaut « postgres » et l’espace de travail (tablespace) par défaut « pg_default ».
Bonnes pratiques Installer correctement le serveur PostgreSQL Installation, configurations et création BDD Bonnes pratiques Installer correctement le serveur PostgreSQL Mettre en place de bonnes pratiques de sécurité Optimiser la base de données Optimiser les requêtes Sources : Cornet 2011. PostgreSQL/PostGIS: bonnes pratiques et astuces (http://www.portailsig.org) http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/tuning.html Il est important dès le départ de mettre en place des bonnes pratiques de configuration et d’optimisation du serveur PostgreSQL et de la BDD PostGIS.
Deux fichiers de configuration clé dans …9.5/data/ Installation, configurations et création BDD Deux fichiers de configuration clé dans …9.5/data/ Configuration de base adaptée à de petites installations Accessibles via pgAdmin dans onglet Fichier postgresql.conf Paramètres de connexion port = 5432 (n° de port sur lequel le serveur écoute) listen_addresses = * (adresse(s) IP sur laquelle le serveur écoute) Encodage des caractères client_encoding = latin1 (ou selon le besoin laisser utf-8 par défaut) Gestions des erreurs (logs) Mémoire Nettoyage (vacuum automatique) autovacuum = on (activé) track_counts = on (activé pour que le démon autovacuum fonctionne) En cas de modification il est nécessaire de redémarrer PostgreSQL pg_hba.conf Gestion de la sécurité des accès aux données des bases de données Peut interdire les connexions distantes, limiter les accès aux différentes bases selon les utilisateurs… Deux fichiers de configuration sont clés pour PostgreSQL : postgresql.conf et pg_hba.conf. En effet, il faut savoir qu’en installant PostgreSQL, une configuration dite de base est définie par défaut et correspond à de petites installations. Si un jour vous êtes amenés à administrer ce logiciel installé sur un serveur spécifique, il y aura très certainement des modifications de la configuration à mettre en œuvre pour optimiser le système. Il faut donc comprendre à quoi servent ces 2 fichiers de configuration. Les 2 fichiers sont accessibles via pgAdmin via le menu Fichier, sinon directement dans le sous-répertoire data/. postgresql.conf permet de régler les paramètres de connexion, les logs, les paramètres de mémoire, l’activation du nettoyage autovacuum (qui automatise les commandes VACUUM et ANALYZE)… tout cela est très documenté dans les forums sur internet. pg_hba.conf gère la sécurité des accès aux données. A partir du moment où PostgreSQL est installé sur un serveur spécifique, il sera nécessaire de régler les accès à ce niveau. C’est également très documenté sur internet.
Recommandations d’optimisation du serveur PostgreSQL-PostGIS Installation, configurations et création BDD Recommandations d’optimisation du serveur PostgreSQL-PostGIS Adapter la configuration de PostgreSQL aux capacités du serveur : modifier postgresql.conf Configuration de base = usage pour de "petites" BD personnelles Utiliser PGTune pour réécrire postgresql.conf en fonction des caractéristiques de la machine http://www.portailsig.org/content/optimiser-postgresql-avec-pgtune Mettre un autre port que 5432 Créer un tablespace sur une autre partition que la partition système Activer la fonction AUTOVACCUUM pour libérer l’espace disque Autres : http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/tuning.html Contrôler les accès à la BD pour assurer la protection et l’intégrité des données : modifier pg_hba.conf Vérifier les « ouvertures » vers l’extérieur Gérer les rôles (utilisateurs) et leur affecter des droits adaptés (privilèges) Faire des sauvegardes (dumps) réguliers Pour optimiser le serveur PostgreSQL il faut donc modifier les 2 fichiers de configuration, dont voici quelques recommandations. Source : Cornet 2011
Recommandations d’optimisation de la base de données PostGIS Installation, configurations et création BDD Recommandations d’optimisation de la base de données PostGIS Séparer les données « métier » des données système dans des schémas différents Gérer les contraintes des tables Clés primaires et étrangères Eviter les erreurs de saisie en gérant les types et contraintes Optimiser les vitesses d’exécution des requêtes Utiliser les index spatiaux ou non Utiliser les fonctions VACCUUM et ANALYZE Prévoir une réindexation régulière des tables dynamiques Vérifier et maintenir la vue geometry_columns à jour Optimiser les requêtes Placer les conditions WHERE les plus « rapides » en premier Privilégier l’usage des sous-requêtes Evaluer l’efficacité de la requête via l’instruction EXPLAIN ANALYZE Du côté de la BDD PostGIS, il existe également quelques règles d’optimisation qui sont similaires à celles appliquées dans le cas de BDD non spatiales. Un VACUUM complet requiert juste de l’espace disque mais facilite la réutilisation de la table. ANALYZE met à jour les statistiques ce qui permet ensuite de déterminer la manière la plus efficace pour effectuer une requête. En savoir plus : cf. cours L. Jégou 30/11 Source : Cornet 2011
TP1 : Création d’une BDD PostGIS TP 1 : Création BDD PostGIS TP1 : Création d’une BDD PostGIS Passons à la pratique. Nous allons comment installer et créer une base de données spatiale.
Méthodologie de création d’une BDD PostGIS TP 1 : Création BDD PostGIS Méthodologie de création d’une BDD PostGIS [ Configurations préalables du serveur PostgreSQL ] Créer l’utilisateur administrateur de la BDD Créer la connexion en tant qu’admin dans pgAdmin Créer la BDD (en tant qu’admin) Activer l’extension PostGIS (en tant que superutilisateur) Créer un schéma spécifique pour les données « métier » Configurer le chemin de parcours des schémas (search_path)
1. Créer l’utilisateur administrateur de la BDD TP 1 : Création BDD PostGIS 1. Créer l’utilisateur administrateur de la BDD En tant que superutilisateur ou utilisateur ayant des droits de création de rôles : CREATE ROLE admin_miashs LOGIN ENCRYPTED PASSWORD 'md59f1021e0f09d972e64a6af14407cb31a' CREATEDB CREATEROLE VALID UNTIL 'infinity'; Mot de passe : admin
2. Créer la connexion en tant qu’admin TP 1 : Création BDD PostGIS 2. Créer la connexion en tant qu’admin Changer le nom de l’hôte ou le numéro du port si nécessaire. Eviter d’enregistrer le mot de passe.
TP 1 : Création BDD PostGIS 3. Créer la BDD
4. Activer l’extension PostGIS pour cette BDD TP 1 : Création BDD PostGIS 4. Activer l’extension PostGIS pour cette BDD Attention il faut avoir les droits de superutilisateur
5. Créer un schéma spécifique pour les données « métier » TP 1 : Création BDD PostGIS 5. Créer un schéma spécifique pour les données « métier » CREATE SCHEMA tp AUTHORIZATION admin_miashs; GRANT ALL ON SCHEMA tp TO admin_miashs;
6. Configurer le chemin de parcours des schémas (search_path) TP 1 : Création BDD PostGIS 6. Configurer le chemin de parcours des schémas (search_path) ALTER DATABASE tp_miashs SET search_path = "$user", tp, public; En modifiant le chemin de parcours des schémas, cela permet à PostgreSQL de classer les schémas par ordre de priorité : d’abord celui dans le quel est positionné l’utilisateur, puis le schéma des données « métier » (ici tp), puis le schéma public (et le schéma topology si l’extension topology est créée en amont). Ainsi, pour les requêtes, le nom du schéma ne sera pas obligatoirement à inscrire s’il ce dernier est placé en priorité dans le search_path.
Aperçu de la table spatial_ref_sys de la BDD créée TP 1 : Création BDD PostGIS Aperçu de la table spatial_ref_sys de la BDD créée La table contient tous les systèmes de références spatiales existants. Voici un exemple de requête pour voir 3 d’entre eux : SELECT * FROM public.spatial_ref_sys WHERE srid IN(4326,2154,3857); Requête usuelle pour changer le système de référence spatial (SRID) d’un champ géométrique (geom) déjà existant et dont le SRID est erroné: ALTER TABLE ma_table ALTER COLUMN geom TYPE geometry(MULTIPOLYGON,4326) USING ST_SetSRID(geom,4326); Le SRID (Spatial Reference System Identifier) correspond au code EPSG (BDD mondiale des systèmes de référence spatiale) Nomenclature PROJ.4 utile pour conversions Regardons le contenu de la table « spatial_ref_sys » qui contient 5435 systèmes de références spatiales. Réalisons une requête qui sélectionne 3 des plus usuels, à savoir 4326, 2154 et 3857. Ces codes correspondent aux codes EPSG, ce qui est une nomenclature mondialement reconnue. Le code 4326 correspond au système de coordonnées en degré longitude/latitude c’est-à-dire à l’absence de système de projection appelé WGS 84. La colonne srtext détaille le système avec son datum, son sphéroïde etc. La colonne proj4text reprend la nomenclature de la bibliothèque Proj4. Le code 2154 correspond au système de projection RGF93 – Lambert 1993 qui est le système géodésique officiel adopté par la France et l’IGN. Le code 3857 représente la projection dite « Pseudo-Mercator » (également appelée « Web Mercator » ou simplement « Mercator ») qui est très largement utilisée pour le rendu des cartes sur internet (utilisé par Google Maps). Les systèmes de projection sont très importants lorsque l’on manipule de la donnée spatiale. Il existe de nombreuses fonctions de conversion qui sont très documentées sur le web. A titre informatif, voici ici une requête permettant de définir ou redéfinir un système de référence spatiale à une table donc à une couche SIG.
Plan du cours Introduction sur les bases de données spatiales et le choix de PostgreSQL/PostGIS Installation et configuration de PostgreSQL. Création de BDD spatiales PostGIS – TP 1 Spécificités de PostGIS – TP 2 Liaison PostGIS-QGIS : les fonctions complémentaires de QGIS de gestion et de visualisation des tables et vues de PostGIS – TP 3 Import/export de données spatiales via PostgreSQL et QGIS – TP 4 Requêtes spatiales simples – TP 5 Découverte de la cartographie interactive avec QGIS à partir notamment de données PostGIS – TP 6
III. Spécificités de PostGIS Spécificités PostGIS III. Spécificités de PostGIS
Spécificités d’une table/vue spatiale PostGIS Spécificités PostGIS Spécificités d’une table/vue spatiale PostGIS 1 couche SIG vecteur (feature layer) ou raster = 1 table (ou 1 vue) 1 entité ou objet spatial dans un SIG (feature object) = 1 ligne Exemple d’une table représentant une couche composée de 2 points Le TP a permis de montrer tous les ajouts apportés par PostGIS à une base de données créée sous PostgreSQL. Nous allons les regarder de plus près dans cette partie. Pour fixer les idées, il faut bien comprendre qu’une couche SIG vectorielle avec la notion sous-jacente de « feature » devient dans PostGIS une table (ou une vue). Chaque entité de la couche SIG devient une ligne (= un enregistrement) dans la table. La table PostGIS contiendra donc tous les attributs de la table attributaire de la couche vectorielle avec en plus dans ce cas un champ de type « geometry », nous y reviendrons. Voici par exemple une table représentant une couche SIG de 2 points. On retrouve l’identifiant unique pour chaque entité et aussi le champ stockant la géométrie, ici de type Point avec des coordonnées longitude/latitude. Si la couche SIG contient des données attributaires non spatiales, alors ces champs et ces données se retrouvent à l’identique dans la table PostGIS. Shuai, 2014
Spécificités PostGIS Qu’est-ce qu’une BDD spatiale PostGIS a de plus qu’une BDD PostgreSQL « classique » ? Types de données spécifiques Indexation spatiale Fonctions spatiales A la question «Qu’est-ce qu’une BDD spatiale PostGIS a de plus qu’une BDD PostgreSQL « classique » ? » il faut retenir les 3 éléments suivants : 1- Il existe des types de données spécifiques aux données spatiales. 2- Vous connaissez certainement les mécanismes d’indexation dans les SGBD afin d’optimiser les temps de calculs des requêtes. Pour les données spatiales, comme il existe ces types de données spécifiques, alors PostGIS propose une méthode d’indexation spatiale de ces données. 3- Enfin, PostGIS n’étant pas qu’un outil de stockage, de très nombreuses fonctions permettent de manipuler et d’analyser les données spatiales. Nous allons à présent détailler ces 3 aspects.
Spécificités PostGIS Qu’est-ce qu’une BDD spatiale PostGIS a de plus qu’une BDD PostgreSQL « classique » ? Types de données spécifiques Indexation spatiale Fonctions spatiales
Spécificités PostGIS 1. Quatre grands types de données spatiales ajoutés par PostGIS à PostgreSQL a. Geometry b. Geography D’après El Kharki & Mechbouh, 2015 PostGIS specific c. Raster PostGIS specific d. Topology Voici les 4 grands types de données spatiales : geometry, geography, raster et topology. Ce types sont liés à la nature des données elle-même. Notez que les types geometry et geography sont standardisés au niveau mondial (normes associées), tandis que les types raster et topology sont spécifiques à PostGIS. Ces différents types étant très importants, nous allons les regarder un à un. Peuvent coexister dans la même BDD, voire dans des colonnes séparées d’une même table
1.a. Les sous-types géométriques (geometry_column) Spécificités PostGIS 1.a. Les sous-types géométriques (geometry_column) Coordonnées pour les représentations planes PostGIS utilise tous les objets et fonctions de la norme OpenGIS « OGC Simple Features Specification for SQL » (et ISO SQL/MM) [ Géométrie 2D ] Le type geometry est tout simplement une coordonnée de type x/y dans un plan. C’est la norme OpenGIS qui a défini tous les sous-types géométriques simples (Point, Ligne, Polygone) et plus complexes (notion de GeometryCollection regroupant des multipoints, des polylignes et/ou des multipolygones). A titre informatif, la documentation en ligne de PostGIS illustre très bien tous ces différents objets et la notion d’objets invalides, c’est-à-dire qui ne respectent pas le type déclaré. PostGIS ajoute un niveau de complexité supplémentaire, les 3ème et 4ème dimensions. Le 3DZ correspond aux coordonnées 2D avec en plus l’altitude. Le 3DM correspond aux coordonnées 2D avec en plus une mesure quelconque (par exemple un taux de pollution). La 4D associe l’altitude Z et une mesure quelconque en plus de la 2D. Géométrie valide: http://postgis.refractions.net/documentation/manual-1.4/ch04.html#OGC_Validity PostGIS étend ce standard aux 3DZ (=2D + altitude), 3DM (=2D + mesure quelconque) et 4D (=XYZM ou 3DZM)
1.b. Type Geography (geography_column) Spécificités PostGIS 1.b. Type Geography (geography_column) Coordonnées géographiques (latitude/longitude, degrés) tenant compte de la courbure de la Terre WGS 84 long lat (SRID:4326) Avec fonctions spécifiques, notamment de calcul de distances Ne concerne que les types de géométries simples : POINT LINESTRING POLYGON MULTIPOINT MULTILINESTRING MULTIPOLYGON GEOMETRYCOLLECTION Tous les champ géographiques listés dans vue geography_columns Le type geography est un type très particulier puisqu’il tient compte de la courbure de la terre. Il ne s’agit donc pas d’une surface plane comme c’est le cas du type geometry. La coordonnée x correspond à la longitude et la coordonnée y à la latitude exclusivement, il n’y a donc qu’un seul système de référence spatial associé, le WGS84 (sans projection). Ce type est obligatoirement exprimé en degrés décimaux. Notez que le type geometry permet d’aplanir des coordonnées longitude/latitude via un système de projection (conique comme Lambert93 ou cylindrique comme les zones UTM par exemple), mais cela ne veut pas dire pour autant qu’on ne peut pas utiliser des coordonnées longitude/latitude avec un SRID WGS84 pour un type geometry ! Le type geography est surtout d’intérêt lorsque l’on souhaite faire des calculs de distance les plus précis possibles puisqu’effectivement la courbure de la terre est prise en compte. Les sous-types géographiques correspondent aux sous-types simples géométriques qui sont normés. Une table de données géographiques contiendra une colonne de type geography qui sera référencée dans la vue « geography_columns ».
Spécificités PostGIS Geometry vs Geography Utilisation CPU : Geography >>> Geometry Si emprise spatiale relativement petite Choisir un système de projection adapté Utiliser GEOMETRY et ses fonctions associées Si emprise mondiale ou à l’échelle d’un continent Choisir le système longitude/latitude WGS 84 (EPSG 4326) Utiliser GEOGRAPHY et ses fonctions associées Plus généralement voici quelques conseils pour le choix du type geometry ou geography selon les situations. http://postgis.net/docs/using_postgis_dbmanagement.html#PostGIS_GeographyVSGeometry
Déclaration des types Geometry et Geography Spécificités PostGIS Déclaration des types Geometry et Geography Soit directement (cf. TP 2) CREATE TABLE ville (id int4, nom varchar(20), ville_geom GEOMETRY); Soit indirectement avec AddGeometryColumn( [<schema>], <relation>, <attribut>, <srid>, <type>, <dimension>) CREATE TABLE ville2 (id int4, nom varchar(20)); SELECT AddGeometryColumn( '', 'ville2', 'ville_geom2', '2154', 'POLYGON', 2); Soit automatiquement via par exemple la commande shp2pgsql qui génère un fichier SQL et l’importe dans la base de données (cf. TP 4) Il y a 3 façons de déclarer les types geometry ou geography : soit directement, nous allons le voir dans le prochain TP. Par exemple ici pour la table ville, il suffit simplement d’inscrire le type geometry à la suite du nom du champ dans la table (ici ville_geom). soit indirectement avec la fonction AddGeometryColumn(). C’est notamment utile dans le cas où la table existe déjà et qu’on lui rajoute le champ géométrique. Il y a 6 types d’informations que l’on peut préciser pour ce nouveau champ : le nom du schéma dans PostgreSQL dans lequel se trouve la table à modifier, la relation c’est-à-dire le nom de la table, l’attribut c’est-à-dire le nom du champ géométrique à créer, le système de référence spatial srid, le sous-type géométrique (ici POLYGON) et enfin le nombre de dimensions (ici 2 sans ‘’). Dans l’exemple on ajoute le champ ville_geom2 dans la table ville2 que l’on a créé juste avant. soit via une commande d’import (par exemple shp2pgsql) qui crée un fichier SQL de création de table et l’importe dans la base de données. Nous le verrons dans le cadre du TP4.
Leurs formats de stockage (1/2) Spécificités PostGIS Leurs formats de stockage (1/2) Les spécifications de l’OpenGIS définissent 2 formats standards de stockage : Well-Known Text (WKT) Well-Known Binary (WKB) Point : 0101000000000000000000 Ligne : 010200000003000F03F000 000000F03F00000000000F03F040 PostGIS utilise d’autres formats : EWKB et EWKT : adaptés à 3DM, 3DZ et 4D et intégrant le SRID Formats canoniques SQL-MM Part 3… x : longitude y : latitude x y Nous avons vu comment déclarer ces types spatiaux lors de la création ou la modification d’une table. A présent, regardons le format de ces 2 types. Il faut savoir que PostGIS sait utiliser et convertir de très nombreux formats de données spatiales. Pour les données vectorielles, nativement il stocke ces informations aux formats EWKB ou EWKT qui sont illisibles. Pour les visualiser, le format le plus utilisé est le WKT (cf. tableau). Le WKB est un format de type binaire et donc illisible, mais pratique pour le stockage. Pour en savoir plus n’hésitez pas à consulter la doc de postgis.net En savoir plus : http://postgis.net/docs/using_postgis_dbmanagement.html https://en.wikipedia.org/wiki/Well-known_text
Leurs formats de stockage (2/2) Spécificités PostGIS Leurs formats de stockage (2/2) PostGIS stocke les géométries dans un format spécifique, mais il supporte un grand nombre de formats en entrée/sortie grâce aux différentes fonctions « ST_... » suivantes : Voici un exemple qui lit du GML et retourne du JSON : SELECT ST_AsGeoJSON(ST_GeomFromGML( '<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>')); Format texte Well-known text (WKT) ST_GeomFromText(text) retourne une geometry ST_AsText(geometry) retourne le texte ST_AsEWKT(geometry) retourne le texte Format binaire Well-known binary (WKB) ST_GeomFromWKB(bytea) retourne geometry ST_AsBinary(geometry) retourne bytea ST_AsEWKB(geometry) retourne bytea GeoJSON ST_AsGeoJSON(geometry) retourne text Geographic Mark-up Language (GML) ST_GeomFromGML(text) retourne geometry ST_AsGML(geometry) retourne text Keyhole Mark-up Language (KML) ST_GeomFromKML(text) retourne geometry ST_AsKML(geometry) retourne text Scalable Vector Graphics (SVG) ST_AsSVG(geometry) retourne text Selon la nature de vos données de départ, il faudra utiliser différentes fonctions permettant leur conversion en type geometry (ou geography) pour leur import notamment. Pour l’export il est également possible d’exporter une table PostGIS et de transformer les données du champ geometry (ou geography) selon le format de votre choix : KML, GeoJSON, SVG, etc. Les fonctions usuelles listées ici ont souvent en paramètre geometry, ces fonctions existent généralement aussi pour le type geography. Dans l’exemple il y a une couche vectorielle au format GML qui contient un seul point dont les coordonnées sont 1,1. La requête permet de convertir au format GeoJSON cette couche, dont vous reconnaîtrez la syntaxique dans la capture d’écran. http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html
1.c. Type Raster Spécificités PostGIS En savoir plus : Passons au 3ème type très important, le raster, qui correspond à une matrice de valeurs définie par sa taille de cellule (souvent carrée mais pas toujours), son nombre de bandes, son SRID, etc. Cette matrice a pour particularité d’être géopositionnée. Les données stockées sous un format raster représentent des phénomènes réels : Les données thématiques (désignées également sous le nom de données discrètes) représentent des entités telles que des données de sol ou d'occupation du sol. Les données continues représentent des phénomènes tels que la température ou l'altitude, ou encore des données spectrales telles que des images satellite et des photographies aériennes. Les images incluent des cartes ou dessins numérisés et des photographies de constructions. Ce type n’est pas normé, c’est-à-dire qu’il ne suit pas une norme internationale. Son format de stockage est donc spécifique à PostGIS. http://slideplayer.fr/slide/3470549/ En savoir plus : http://postgis.net/docs/manual-2.1/RT_reference.html Esri©
Spécificités PostGIS 1.c. Type Raster A chaque pixel de la grille est associée une valeur (altitude, température, densité de population, type d'occupation du sol, perméabilité...). Cette valeur est stockée dans une bande PostGIS permet d'associer plusieurs bandes à un raster. On peut par exemple disposer d'un raster de températures mensuelles moyennes qui contient une bande par mois de l'année PostGIS stocke chaque raster dans une table de la base de données. La vue raster_columns est l'équivalent pour les raster de la vue geometry_columns pour les données géométriques vectorielles Possibilité de tuiler le raster = le fractionner en unités plus petites qui permettront d'accélérer les traitement en utilisant des index. Chaque tuile (tile) est une ligne de la table Voici quelques précisions sur le type raster. http://si.cenlr.org/tp_postgis_raster
Spécificités PostGIS 1.d. Type Topology La topologie exprime les relations spatiales entre des entités vectorielles connectées ou adjacentes dans un SIG Les données topologiques ou basées sur une topologie sont utiles pour détecter et corriger les erreurs de numérisation La topologie est nécessaire pour effectuer certains types d’analyse spatiale, comme l’analyse de réseau (route, hydrographie) Exemples d’applications : Use PostGIS topologies to clean-up road networks (Toulouse) : http://blog.mathieu-leplatre.info/use-postgis-topologies-to-clean-up-road-networks.html Travaux pratiques - Routage FOSS4G avec pgRouting, le réseau routier d’OpenStreetMap et GeoExt : http://www.postgis.fr/chrome/site/docs/workshop-routing-foss4g/docs/pgRoutingWorkshop.pdf https://github.com/Oslandia/presentations/blob/master/pgconf_eu_2012/pgconfeu2012_vincent_picavet_postgis_topology.pdf?raw=true Enfin, le 4ème type est Topology. En savoir plus : https://strk.kbt.io/projects/postgis/Paris2011_TopologyWithPostGIS_2_0.pdf
1.d. Type Topology Spécificités PostGIS http://slideplayer.fr/slide/3470549/ En savoir plus : https://strk.kbt.io/projects/postgis/Paris2011_TopologyWithPostGIS_2_0.pdf
Spécificités PostGIS 1.d. Type Topology Pour gérer des objets topologiques, il faut installer au préalable l’extension postgis_topology dans un schéma de la base de données dédié CREATE SCHEMA topology AUTHORIZATION postgres; -- superutilisateur CREATE EXTENSION postgis_topology SCHEMA topology VERSION "2.2.2"; -- version de PostGIS Capture écran pgAdmin
Récapitulatif des principaux objets spatiaux de PostGIS Spécificités PostGIS Récapitulatif des principaux objets spatiaux de PostGIS Voici le récapitulatif des principaux types et sous-types spatiaux de PostGIS, classés selon les normes correspondantes. http://slideplayer.fr/slide/3470549/
Spécificités PostGIS Qu’est-ce qu’une BDD spatiale PostGIS a de plus qu’une BDD PostgreSQL « classique » ? Types de données spécifiques Indexation spatiale Fonctions spatiales Ainsi se clôt ce premier chapitre sur les types de données. Passons à la 2ème spécificité de PostGIS, à savoir l’indexation spatiale.
Spécificités PostGIS 2. Indexation spatiale utilisée pour améliorer les performances d’exécution des opérations spatiales L’indexation accélère les recherches en organisant les données dans des arbres de recherche qui peuvent être parcourus efficacement pour retrouver une entité particulière (ex : 9 ms au lieu de 55 ms pour une requête cf. http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/indexing.html) PostgreSQL utilise 3 types d’index par défaut : B-Tree, R-Tree et GiST PostGIS utilise une combinaison GiST (Generalized Search Trees) + R-Tree Lors de la création d’une table spatiale, prévoir obligatoirement la clause GiST CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); Les index spatiaux ne sont pas capables d’indexer des entités géométriques elles-mêmes, mais ils indexent leur étendues http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/indexing.html
Spécificités PostGIS Qu’est-ce qu’une BDD spatiale PostGIS a de plus qu’une BDD PostgreSQL « classique » ? Types de données spécifiques Indexation spatiale Fonctions spatiales Pour terminer la 3ème spécificité de PostGIS est l’ajout à PostgreSQL d’un grand nombre de fonctions spatiales. Pas le temps de les explorer en détail (on a déjà vu quelques fonctions ST_...), on va juste les catégoriser pour comprendre globalement à quoi elles servent.
Spécificités PostGIS 3. Fonctions spatiales http://www.postgis.us/downloads/postgis21_cheatsheet.html Conversion de données spatiales dans un format externe Gestion d’informations relatives aux tables spatiales et à l’administration de PostGIS Récupération de propriétés et de mesures d’une géométrie Comparaison de 2 géométries en respectant leurs relations spatiales Construction de nouvelles géométries à partir d’autres Fonctions SIG classiques : resample, clip, reclass, intersection, union, projection, etc. Fonctions spécifiques Raster, topologiques et géographiques (Cf. VI Requêtes spatiales simples) Voici la liste des principales grandes catégories de fonctions implémentées dans PostGIS. Nous en avons déjà vues/utilisées précédemment et nous les verrons plus en détail en fin de ce cours et durant les prochains cours.
TP2 : Création de tables spatiales simples TP 2 : Création tables spatiales simples TP2 : Création de tables spatiales simples 1 table avec objets géométriques 1 table avec objets géographiques Dans le cadre de ce TP, nous allons créé 2 tables indépendantes.
Requête-type de création de table géométrique ou géographique TP 2 : Création tables spatiales simples Requête-type de création de table géométrique ou géographique CREATE TABLE NomSchéma.NomTable ( ChampClePrimaire int4, geom GEOMETRY(Type,SRID) ); -- Ajout clé primaire ALTER TABLE NomSchéma.NomTable NomTable ADD CONSTRAINT NomTable_pkey PRIMARY KEY (ChampClePrimaire); -- Création index spatial CREATE INDEX NomTable_geom_idx ON NomSchéma.NomTable USING gist(geom); ChampClePrimaire = identifiant unique de type int4 SRID = identifiant du système de coordonnées (Code EPSG) Type = type de géométrie (POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION ou GEOMETRY pour les collections d’objets) Voici la méthode complète pour créer une table de données vectorielles (géométriques ou géographiques) avec un identifiant servant de clé primaire et un index spatial sur son champ ‘geom’.
Création d’une table de linéaires « plan » 2D et 3D TP 2 : Création tables spatiales simples Création d’une table de linéaires « plan » 2D et 3D Ex1 CREATE TABLE tp.route ( route_id int4, route_nom varchar(25), route_geom geometry(LINESTRING,4326) ); -- Ajout clé primaire ALTER TABLE tp.route ADD CONSTRAINT route_pkey PRIMARY KEY (route_id); -- Création index spatial CREATE INDEX route_geom_idx ON tp.route USING gist(route_geom); Exercice 1 : créer la table ‘route’ avec 3 champs dont un géométrique de type linéaire simple et dont le SRID est 4326 (WGS84, sans projection). Il y a 2 façons de procéder, soit via pgAdmin avec son éditeur de requête SQL, soit directement en ligne de commande via psql, une fois que vous êtes connectés à la base de données. Attention dans pgAdmin ne pas oublier d’utiliser le bouton d’actualisation pour mettre à jour et ainsi révéler les changements.
Création d’une table de linéaires « plan » 2D et 3D TP 2 : Création tables spatiales simples Création d’une table de linéaires « plan » 2D et 3D Ex1 -- Ajout d’un champ 3DZ ALTER TABLE tp.route ADD COLUMN route_geom3d geometry(LINESTRINGZ,4326); -- Vérification de la création des 2 champs géométriques SELECT * FROM geometry_columns; Vue système (catalogue des champs géométriques) Puis rajouter un 4ème champ contenant un champ linéaire 3D contenant des informations d’altitude. La requête « SELECT * FROM geometry_columns; » permet de voir l’ajout des 2 nouveaux champs géométriques (route_geom et route_geom3d).
Création d’une table de linéaires « plan » 2D et 3D TP 2 : Création tables spatiales simples Création d’une table de linéaires « plan » 2D et 3D Ex1 -- Suppression du champ 3DZ ALTER TABLE tp.route DROP COLUMN route_geom3d; -- Import de données INSERT INTO tp.route(route_id, route_nom, route_geom) VALUES (1,'ALL JULES GUESDE', ST_GeomFromText('LINESTRING(1.44452394986477 43.5927420100142,1.44548755936195 43.5930803303158)',4326)), (2,'ALL JULES GUESDE 2', ST_GeomFromText('LINESTRING(1.44644062624483 43.5933290926569,1.44782731902237 43.5938319696291)',4326)), (3,'ALL JULES GUESDE 3', ST_GeomFromText('LINESTRING(1.44923770115436 43.5943189332616,1.45158404591984 43.5951594870356)',4326)); Nous allons supprimer le champ 3DZ route_geom3d via la commande DROP COLUMN car il n’est pas utilisé par la suite. A présent insérons quelques valeurs, ici 3 lignes. Notez qu’il s’agit de 3 segments simples bornés chacun par 2 points dont les coordonnées sont bien en WGS84 (longitude/latitude). Pour que ces coordonnées soient bien prises en compte par PostGIS, il a fallu ajouter la fonction ST_GeomFromText() en veillant à bien respecter les différents critères et leur ordre (d’abord le type LINESTRING puis les coordonnées entre parenthèses et enfin le SRID). Pour le moment on ne peut pas visualiser le résultat sur une carte, nous le verrons plus tard. C’est la fin de l’exercice 1.
TP 2 : Création tables spatiales simples Création d’une table de ponctuels avec des coordonnées géographiques 2D et 3D Ex2 CREATE TABLE tp.mediatheque( med_id int4, med_nom varchar(50), med_geog geography(POINT, 4326)); -- Ajout clé primaire ALTER TABLE tp. mediatheque ADD CONSTRAINT mediatheque_pkey PRIMARY KEY (med_id); -- Création index spatial CREATE INDEX mediatheque_geom_idx ON tp.mediatheque USING gist(med_geog); -- Vérification de la création du champ géométrique SELECT * FROM geography_columns; Exercice 2 : créer une table avec des objets géographiques, ici il s’agit des médiathèques toulousaines. Notez que cet exemple n’est pas le plus pertinent car les points sont relativement très proches géographiquement, le type geometry aurait été plus adapté. La table ‘mediatheque’ contient 3 champs dont 1 géographique. Comme pour les champs de type géométriques, il est possible de voir la liste de tous les champs géographiques de la base de données, grâce à la requête « SELECT * FROM geography_columns; ». Vue système (catalogue des champs géographiques)
TP 2 : Création tables spatiales simples Création d’une table de ponctuels avec des coordonnées géographiques 2D et 3D Ex2 -- Import de données INSERT INTO tp.mediatheque(med_id, med_nom, med_geog) VALUES (1,'Médiathèque Empalot', ST_GeographyFromText('SRID=4326;POINT(1.44159535436499 43.5788683583451)')), (2,'Médiathèque Saint Cyprien', ST_GeographyFromText('SRID=4326;POINT(1.43059695519386 43.5989120232769)')), (3,'Médiathèque José Cabanis', ST_GeographyFromText('SRID=4326;POINT(1.4558973321938 43.6102357822794)')), (4,'Médiathèque Grand M', ST_GeographyFromText('SRID=4326;POINT(1.40069793520966 43.5675866961665)')); -- Vérification SELECT med_id, med_nom, ST_AsText(med_geog) FROM tp.mediatheque ; De la même façon que pour la table ‘route’ nous allons ajouter 4 points, ici grâce à la fonction ST_GeographyFromText() qui permet d’ajouter des coordonnées longitude/latitude. Attention, les variables ici sont séparées par des « ; ». La requête « SELECT med_id, med_nom, ST_AsText(mod_geog) FROM tp.mediatheque; » permet de visualiser le contenu de la table. C’est la fin de l’exercice 2 (pas de visualisation sur carte).
Plan du cours Introduction sur les bases de données spatiales et le choix de PostgreSQL/PostGIS Installation et configuration de PostgreSQL. Création de BDD spatiales PostGIS – TP 1 Spécificités de PostGIS – TP 2 Liaison PostGIS-QGIS : les fonctions complémentaires de QGIS de gestion et de visualisation des tables et vues de PostGIS – TP 3 Import/export de données spatiales via PostgreSQL et QGIS – TP 4 Requêtes spatiales simples – TP 5 Découverte de la cartographie interactive avec QGIS à partir notamment de données PostGIS – TP 6
IV. Liaison PostGIS-QGIS Les fonctions complémentaires de QGIS de gestion et de visualisation des tables et vues de PostGIS
Plusieurs logiciels SIG PostGIS-QGIS QGIS : un des logiciels SIG permettant la visualisation et la manipulation des données PostGIS Plusieurs logiciels SIG OpenJUMP QGIS uDig gvSIG QGIS et formats compatibles Vecteurs : Esri .shp, Esri géodatabase pers., SpatiaLite,GPX, KML, DXF, MIF/MID, TAB, Excel, CSV, SVG (pas WKT, ni DWG) Rasters : JPG, TIFF, ECW, PNG, MrSID Webservices : WMS, WFS (pas WFS-T, WPS, WCS) Yes* : oui avec extension additionnelle No* : +/- fonctionnelle QGIS est l’un des 4 logiciels SIG les plus utilisés pour la visualisation et la manipulation de données gérées dans PostGIS. Les autres sont OpenJump, uDig et gvSIG. Le tableau dresse la comparaison des capacités de chacun d’eux. QGIS offre le plus de fonctionnalités et c’est un logiciel qui monte en gamme d’années en années. A titre indicatif, voici la liste des principaux formats lus par QGIS. Nous en manipulerons quelques uns dans le cadre des TP. (Obe & Hsu, PostGIS in action 2nd edition, 2015)
Fonctionnalités de QGIS en lien avec PostGIS PostGIS-QGIS Fonctionnalités de QGIS en lien avec PostGIS Se connecter à PostgreSQL pour accéder aux "couches" PostGIS Ouvrir un nouveau projet QGIS Si première connexion au serveur PostgreSQL pour la BDD, 2 méthodes : ou menu [Couche] "Ajouter une couche vectorielle" et cocher "Base de données" ou menu [Couche] "Ajouter couche PostGIS", ou taper Ctrl+Shift+D cf. TP3 Si connexion déjà enregistrée (avec utilisateur ayant les droits d’accès à la BDD) Privilégier l’utilisation de l’extension DB Manager cf. TP3 Charger et visualiser les "couches" PostGIS dans un projet QGIS Tables ou vues à sélectionner ou à glisser-déposer depuis DB Manager Attention, message d’erreur fréquent : "la couche xxx n’est pas valide" La table ou la vue doit avoir obligatoire un identifiant unique de type int4 La vue geometry_columns doit être à jour et correctement renseignée (type et SRID) cf. TP3 Importer des données dans PostgreSQL/PostGIS Via DB Manager cf. TP4 Via les outils en ligne de commande, comme sh2pgsql ou ogr2ogr cf. TP4 Créer des cartes interactives intégrant des "couches" PostGIS cf. VII Il y a de nombreuses façons d’interconnecter QGIS avec PostGIS, en voici les principales. QGIS offre la possibilité de se connecter à la BDD PostGIS de son choix. QGIS permet de charger et visualiser des couches PostGIS. Il permet même d’importer des données dans PostGIS, nous le verrons dans le cadre du TP 4. Enfin il peut générer des cartes interactives pour des données vectorielles issues du logiciel lui-même, de BDD PostGIS ou provenant de webservices. Nous allons découvrir ici cette fonctionnalité pour les données PostGIS.
Extension DB Manager à installer dans QGIS PostGIS-QGIS Extension DB Manager à installer dans QGIS Afin d’explorer ces fonctionnalités, il faut installer l’extension DB Manager via le menu Extension de QGIS.
Fonctionnalités de DB Manager PostGIS-QGIS Fonctionnalités de DB Manager Le menu Base de données permet de : se connecter à une BDD existante ouvrir une fenêtre de requête SQL quitter l’extension DB manager Une fois connecté à une base existante, il apparaît : Le menu Schéma inclut des outils pour créer et pour effacer des schémas (vides) et, si la topologie est activée, de lancer le TopoViewer Le menu Table permet de : Créer/éditer des tables et supprimer des tables et des vues vider des tables et de les déplacer d’un schéma à un autre effectuer VACUUM puis ANALYZE sur chacune des tables sélectionnées importer des couches ou des fichiers, s’ils sont chargés dans QGIS ou s’ils existent sur l’ordinateur exporter les tables d’une base de données en shapefile ou autre format Autres fonctions de transfert : Glisser-déposer les tables ou vues depuis DB Manager vers l’explorateur QGIS Transférer des tables entre bases de données par un simple glisser-déposer Voici en détail la description de DB Manager. http://docs.qgis.org/2.14/pdf/fr/QGIS-2.14-UserGuide-fr.pdf (p.359-360)
TP3 : gestion et Visualisation dans QGIS TP 3 : Gestion/visualisation QGIS TP3 : gestion et Visualisation dans QGIS Connexion à la base de données, visualisation de couches PostGIS dans QGIS et utilisation de l’extension DB Manager
TP 3 : Gestion/visualisation QGIS En cas de première connexion au serveur PostgreSQL à la base de données via QGIS Méthode 1 : via l’outil d’ajout d’une couche vectorielle En cas de première connexion à la base de données PostGIS d’intérêt via QGIS, il existe 2 méthodes. La première est via l’outil d’une couche vectorielle, mais ce n’est pas la méthode à privilégier car il y a peu d’option pour configurer la connexion. Cela fonctionne, mais ce n’est pas la méthode à privilégier
TP 3 : Gestion/visualisation QGIS En cas de première connexion au serveur PostgreSQL à la base de données via QGIS Méthode 2 : via l’outil d’ajout d’une couche PostGIS Méthode à privilégier La deuxième méthode consiste à l’ajout d’une couche PostGIS via le bouton dédié. Il est alors possible de créer une nouvelle connexion avec l’utilisateur de son choix et d’affiner un certain nombre d’options.
TP 3 : Gestion/visualisation QGIS En cas de première connexion au serveur PostgreSQL à la base de données via QGIS Méthode 2 : via l’outil d’ajout d’une couche PostGIS Une fois connecté, les tables et vues de la BDD sont à sélectionner pour les ajouter au canevas de QGIS Une fois connecté à la BDD PostGIS, il suffit de sélectionner les tables ou vues via le tableau. Ce dernier permet notamment de voir si les couches sont valides ou non, ce qui n’est pas le cas de la table ville qi n’a pas de SRID reconnu par QGIS. Sélectionnons les 2 tables créées via le TP (route, mediatheque) pour les visualiser dans QGIS. Attention ! La table ville n’a pas de SRID elle n’est donc pas valide pour une visualisation dans QGIS
Résultat : visualisation dans QGIS TP 3 : Gestion/visualisation QGIS Résultat : visualisation dans QGIS Voici le résultat pour les 2 tables route et mediatheque. Pour la table ville2 présentée en démo, comme elle n’a pas d’enregistrement, il est donc normal de ne rien voir afficher sur la carte. NB : La table ville2 n’a pas d’enregistrement Rem : Le fond de carte a été ajouté via l’extension OpenLayers Plugin
Exploration de DB Manager : outil Fenêtre SQL TP 3 : Gestion/visualisation QGIS Exploration de DB Manager : outil Fenêtre SQL Je souhaite sélectionner les médiathèques qui sont proches du centre ville de Toulouse (il faut donc exclure celle du grand M). Pour ce faire je peux utiliser la fenêtre SQL de DB Manager.
Exploration de DB Manager : cas des couches non valides TP 3 : Gestion/visualisation QGIS Exploration de DB Manager : cas des couches non valides -- Script de création de table initial : CREATE TABLE ville ( id int4, nom varchar(20), ville_geom GEOMETRY ); QGIS n’a pas détecté de clé primaire (le champ id int4 existe mais il n’y a pas d’enregistrement dans la table), ni de champ géométrique correctement référencé dans geometry_columns, ni d’index spatial Traitons à présent le cas de la couche non valide ville.
Exploration de DB Manager : cas des couches non valides TP 3 : Gestion/visualisation QGIS Exploration de DB Manager : cas des couches non valides -- Script corrigé : DROP TABLE ville; CREATE TABLE ville ( id int4, nom varchar(20), ville_geom GEOMETRY ); ALTER TABLE ville ADD CONSTRAINT ville_pkey PRIMARY KEY (id), ADD CONSTRAINT enforce_geotype_geom CHECK (geometrytype(ville_geom) = 'POLYGON'::text), ADD CONSTRAINT enforce_srid CHECK (st_srid(ville_geom) = 4326); CREATE INDEX ville_geom_idx ON ville USING gist(ville_geom); Et voici le script corrigé avec l’ajout des contraintes manquantes et de l’index spatial.
TP 3 : Gestion/visualisation QGIS Bonnes pratiques pour assurer la liaison PostGIS-QGIS et l’intégrité des données de la BDD Vérifier que la vue ou la table possède un identifiant unique et que la colonne géométrie indique un type et un SRID Ajouter un index spatial ou non au(x) champ(s) qui le nécessite(nt) Méthode « complète » : CREATE TABLE NomSchéma.NomTable ( ChampClePrimaire int4, geom GEOMETRY(Type,SRID) ); ALTER TABLE NomSchéma.NomTable ADD CONSTRAINT NomTable_pkey PRIMARY KEY (ChampClePrimaire), ADD CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) = ‘Type’::text), ADD CONSTRAINT enforce_srid CHECK (st_srid(geom) = SRID); CREATE INDEX NomTable_geom_idx ON NomSchéma.NomTable USING gist(geom); Pour éviter que les couches soient invalides dans QGIS, voici quelques conseils. ChampClePrimaire = identifiant unique de type int4 SRID = identifiant du système de coordonnées (Code EPSG) Type = type de géométrie (POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION ou GEOMETRY pour les collections d’objets)
TP 3 : Gestion/visualisation QGIS Bonnes pratiques pour assurer la liaison PostGIS-QGIS et l’intégrité des données de la BDD Méthode alternative (ici l’index spatial est rajouté via DB Manager) : CREATE VIEW NomSchéma.NomVue AS SELECT ChampClePrimaire, ST_MaFonction(geom_de_départ, autres_parametres)::geometry(Type, SRID) ; Exemple (en supposant qu'on ne veut/peut pas utiliser la clé primaire de la table mediatheque et que le champ géographique med_geog de départ est en EPSG 4326) : CREATE VIEW mediatheque_grandm_buffer AS row_number() OVER () as id, ST_Buffer(med_geog, 2000)::geometry(POLYGON, 4326) as geom FROM mediatheque WHERE med_nom LIKE '%Grand%' Rem : row_number() OVER() assigne un numéro de ligne
Plan du cours Introduction sur les bases de données spatiales et le choix de PostgreSQL/PostGIS Installation et configuration de PostgreSQL. Création de BDD spatiales PostGIS – TP 1 Spécificités de PostGIS – TP 2 Liaison PostGIS-QGIS : les fonctions complémentaires de QGIS de gestion et de visualisation des tables et vues de PostGIS – TP 3 Import/export de données spatiales via PostgreSQL et QGIS – TP 4 Requêtes spatiales simples – TP 5 Découverte de la cartographie interactive avec QGIS à partir notamment de données PostGIS – TP 6
V. Import / Export Import/export de données spatiales via PostgreSQL et QGIS DB Manager
Utilitaires et interfaces pour l’import/export de données spatiales Données vectorielles de type shapefiles (.shp) Commandes dans le répertoire bin/ de PostgreSQL : shp2pgsql : shp PostgreSQL pgsql2shp : PostgreSQL shp Interface graphique dans pgAdmin (shp2pgsql-gui) Interface graphique de QGIS DB Manager Données vectorielles de tout format Commande dans le répertoire bin/ de PostgreSQL : ogr2ogr Données raster : commandes dans le répertoire bin/ de PostgreSQL raster2pgsql pour l’import gdal_translate et gdalwarp pour l’export Voici les principales commandes qui permettent l’import et/ou l’export de données spatiales. Il existe des commandes spécifiques pour les fichiers vectoriels de format propriétaire natif d’Esri (ArcGIS) dénommé « shapefile » (.shp) (NB : QGIS peut le lire aussi). Pour l’import il s’agit de shp2pqsql. Il est possible soit d’utiliser l’interface graphique « Shapefile and DBF loader » de pgAdmin, soit d’exécuter la commande directement dans une invite de commande DOS de votre machine, ou encore d’utiliser l’extension DB Manager de QGIS. Pour l’export, de la même façon on peut utiliser le plugin de pgAdmin, la commande pgsql2shp ou l’extension DB Manager de QGIS. La commande ogr2ogr est une commande générique adaptée à des dizaines de formats vectoriels. L’interface graphique de QGIS DB Manager est plutôt bien conçue et facilite généralement l’import des fichiers vectoriels de tout format. Enfin il existe des commandes pour l’import et l’export de rasters que nous allons explorer en TP.
TP4 : Import/export de données spatiales Via pgAdmin et QGIS DB Manager
Données source à télécharger TP 4 : Import/export Données source à télécharger Fichier Format Type SRS encodage source bornes-wi-fi shp POINT 4326 UTF8 Open data Toulouse communes MULTIPOLYGON espaces_verts kml velo-toulouse csv _9122_sens_unique geojson LINESTRING _ToulouseMetropole jpg RASTER 2154 Voici la liste des données sources à placer dans un répertoire de votre ordinateur. Eviter des noms de chemin trop longs ou avec des caractères spéciaux. https://data.toulouse-metropole.fr/page/home/
TP 4 : Import/export Liste des exemples en fonction des méthodes d’import/export de données spatiales Format fichiers pgAdmin plugin QGIS DB Manager Directement dans l’Invite de commande Shapefile Import OK shp2pgsql Export OK pgsql2shp Tout format vectoriel SHP uniquement ogr2ogr Raster _ raster2pgsql gdal_translate et gdalwarp Ex 3 Ex 4 Ex 5 Ex 6 Ex 7 Ex 9 Ex 8 Voici la liste des exemples que nous allons voir en TP afin d’illustrer une grande partie des possibilités d’import et d’export des données spatiales. Ex10
Import via plugin pgAdmin TP 4 : Import/export Import via plugin pgAdmin Ex3 bornes-wi-fi.shp Dans le plugin de pgAdmin le bouton Add File permet de charger le shapefile, ici bornes-wi-fi.shp. Attention, évitez des chemins d’accès trop longs ou des espaces. Remarquez l’absence de SRID. Cela peut être modifier directement dans l’interface du plugin, sinon il faudra régler ce problème plus tard (c’est ce que nous allons volontairement faire pour l’exercice). Enfin, il est possible de choisir différentes options d’import, notamment la définition de l’encodage des caractères, la création de l’index spatial, voire la possibilité de générer une couche de type ‘geography’ au lieu de ‘geometry’. Après avoir cliqué sur le bouton Import, la fenêtre de log indique que l’import s’est correctement réalisé. Il reste dans ce cas à résoudre le problème du système de référence spatial.
ALTER TABLE "bornes-wi-fi" ALTER COLUMN geom TYPE geometry(POINT,4326) TP 4 : Import/export Ex3 bornes-wi-fi.shp Problème de SRID = 0 Il faut modifier la table « bornes-wi-fi » afin de définir le système de référence spatial, ici srid = 4326 (WGS84, longitude / latitude) ALTER TABLE "bornes-wi-fi" ALTER COLUMN geom TYPE geometry(POINT,4326) USING ST_SetSRID(geom,4326); Voici la requête qui permet de définir le système de projection d’une table PostGIS grâce à la fonction ST_SetSRID(nom de la table, code EPSG). Attention, la table ‘bornes-wi-fi’ présente des caractères non appréciés par PostgreSQL ! Il faut donc encadrer le nom de cette table par des guillemets doubles dans la requête.
gid (clé primaire) et geom TP 4 : Import/export Ex3 bornes-wi-fi.shp Ajout champs gid (clé primaire) et geom Le SRID 4326 est à présent défini Quand on regarde le contenu de la table créée, on remarque l’ajout automatique de la clé primaire « gid » et de l’index spatial (méthode GIST) ainsi que la création du champ « geom » de type geometry(Point,4326). En bas de la diapo se trouve un aperçu des 3 premiers enregistrements de la table. Notez le format incompréhensible de stockage de la géométrie du champ geom. Index ajouté
TP 4 : Import/export Ex3 bornes-wi-fi.shp Utilisation de la fonction ST_AsText(geom) pour voir les coordonnées lisibles des points dans geom Afin de visualiser des coordonnées lisibles des 10 bornes WI-FI, la fonction ST_AsText appliquée au champ « geom » est utilisée. illisible lisible
Import en lignes de commandes TP 4 : Import/export Import en lignes de commandes Ex4 communes.shp Les commandes shp2pgsql et psql sont dans le sous-répertoire bin/ se positionner dans ce répertoire et exécuter la double commande séparée par un | : SRS Index Nom couche shp avec chemin accès Noms schéma.table shp2pgsql -s 4326 -I C:/mon_chemin/communes.shp tp.communes | psql -h localhost -d tp_miashsh -U admin_miashs Nom hôte Nom BDD Nom utilisateur Passons au deuxième exercice de cette série qui concerne l’import via le shell d’une couche de multipolygones correspondants aux contours des communes de Toulouse Métropole. Sous Windows, il faut ouvrir l’invite de commande via le bouton du menu Démarrer « Exécuter… » et taper « cmd ». Ensuite, pour éviter d’inscrire plusieurs fois de trop longs chemins d’accès, il est utile de se positionner directement dans le sous-répertoire bin/ de PostgreSQL afin d’accéder directement aux 2 commandes d’intérêt ici : shp2pgsql et psql. Voici la façon la plus directe de procéder : il suffit d’entrer la double commande séparée par un pipe ‘|’ afin d’éviter la création d’un fichier sql intermédiaire. La première partie de la commande ordonne à shp2pgsql d’importer le fichier communes.shp et de nommer la future table ‘communes’ dans le schéma ‘public’ de la base de données cible. De plus il y est spécifié de définir le système de référence spatial ici WGS84 (SRID 4326). La deuxième partie demande à psql de se connecter à la base de données bdd_postgis via l’utilisateur postgres sur le serveur local. Lors de l’exécution, il est demandé de spécifier le mot de passe de l’utilisateur (ici postgres). http://www.bostongis.com/pgsql2shp_shp2pgsql_quickguide.bqg
TP 4 : Import/export Ex4 communes.shp shp2pgsql gère de nombreuses options possibles visualisables via shp2pgsql -help Exemple : Rajouter -W LATIN1 lorsque c’est nécessaire Nous avons vu les principales options associées à la commande shp2pgsql, mais il est possible de paramétrer plus finement l’import grâce à l’utilisation des différentes options listées via la fonction shp2pgsql -help. C’est l’avantage d’utiliser cet exécutable directement en lignes de commandes.
TP 4 : Import/export Ex4 communes.shp Et voici le résultat de l’import.
Export via plugin pgAdmin TP 4 : Import/export Export via plugin pgAdmin Ex5 Tables bornes-wi-fi et communes exportées simultanément Testons à présent l’export de ces 2 tables récemment importées. Le plugin de pgAdmin est très simple d’utilisation, il suffit d’ajouter les tables, de régler les options et d’exécuter l’export.
Export en lignes de commandes TP 4 : Import/export Export en lignes de commandes Ex6 La commande pgsql2shp est dans le sous-répertoire bin/ se positionner dans ce répertoire et exécuter : Nom future couche shp avec chemin Nom hôte Nom utilisateur pgsql2shp -f C:/mon_chemin/communes -h localhost -u admin_miashs -P admin -p 5432 tp_miashs tp.communes Mot de passe port Nom BDD Noms schéma.table La commande pgsql2shp permet de régler plus finement tous les paramètres d’export (liste via pgsql2shp -help).
TP 4 : Import/export Visualisation des tables bornes-wi-fi et communes de la base de données dans QGIS
B. Import/export de données vectorielles de tout format TP 4 : Import/export B. Import/export de données vectorielles de tout format Interface graphique de QGIS DB Manager Ex7 espaces_verts.kml Importons à présent un fichier vectoriel au format KML, ici espaces-verts.kml. La méthode la plus rapide est d’utiliser l’extension DB Manager de QGIS et de paramétrer les différentes options en fonction du type de fichier en entrée. Une fois importée, la table apparaît dans l’arborescence et peut être glissée-déposée afin d’être visualisée dans QGIS.
B. Import /export de données vectorielles de tout format TP 4 : Import/export B. Import /export de données vectorielles de tout format Interface graphique de QGIS DB Manager Ex8 Velo-toulouse.csv Import Le champ geom n’est pas créé, la table n’est pas spatiale ! Voici un autre exemple avec le format CSV contenu deux champs X et Y pour les longitudes/latitudes. Remarquez que l’import via DB Manager fonctionne, mais cela ne crée pas une table spatiale car il n’y a pas de possibilité de transformer les champs X et Y en champ geom.
B. Import /export de données vectorielles de tout format TP 4 : Import/export B. Import /export de données vectorielles de tout format Interface graphique de QGIS DB Manager Ex8 Velo-toulouse.csv Import ALTER TABLE velo_toulouse ADD COLUMN geom geometry('POINT',4326); UPDATE velo_toulouse SET geom = ST_GeomFromText( 'POINT(' || "X" || ' ' || "Y" || ')', 4326 ); Dans ce cas il est nécessaire de modifier la table via pgAdmin ou psql afin de créer le champ geom et de le calculer à partir des longitudes X et latitudes Y. DB Manager signale l’absence d’index, on peut cliquer sur « en créer un » ou taper la commande SQL CREATE index. La visualisation dans QGIS montre le succès de l’import.
B. Import /export de données vectorielles de tout format TP 4 : Import/export B. Import /export de données vectorielles de tout format Interface graphique de QGIS DB Manager Ex8 Velo-toulouse.csv Export Pour l’export via l’extension DB manager, rien de plus simple, il suffit de sélectionner la table dans l’arborescence, de choisir dans le menu Table, « exporter vers le fichier » et de paramétrer les options d’export (ici choix du format SHP en sortie).
B. Import/export de données vectorielles de tout format TP 4 : Import/export B. Import/export de données vectorielles de tout format Commande ogr2ogr : La fonction « ogrinfo -- formats » liste tous les formats vectoriels et rasters compatibles avec les fonctions ogr Attention, le driver PostgreSQL n’existe pas dans la config de GDAL/OGR installé via PostGIS. Il est nécessaire d’installer GDAL indépendamment : par ex. via OSGEO4W en exécutant la commande ogr2ogr depuis l’OSGeo4W Shell Si problème d’encodage des caractères lors de l’import, il est possible d’ajouter --config PGCLIENTENCODING LATIN1 dans la commande : ogr2ogr --config PGCLIENTENCODING LATIN1 -- PostgreSQL PG:”host=hostname user=username dbname=databasename password=password” inputfile Ex9 9122_sens_unique.geojson Une commande spécifique existe pour l’intégration de données vectorielles d’un format autre que le shapefile. Il s’agit de ogr2ogr qui sert à la fois pour les imports et exports. La fonction ogrinfo - - formats liste tous les formats vectoriels et quelques formats raster compatibles.
B. Import/export de données vectorielles de tout format TP 4 : Import/export B. Import/export de données vectorielles de tout format Commande ogr2ogr : Exemples d’import Trace GPX : Fichier vectoriel MapInfo (logiciel SIG) (Obe & Hsu, PostGIS in action 2nd edition, 2015) Voici des exemples d’import de différents formats usuels en géomatique. https://trac.osgeo.org/postgis/wiki/UsersWikiOGR http://www.postgresonline.com/journal/archives/31-GDAL-OGR2OGR-for-Data-Loading.html
B. Import/export de données vectorielles de tout format TP 4 : Import/export B. Import/export de données vectorielles de tout format Commande ogr2ogr : Exemples d’export KML Autres (Obe & Hsu, PostGIS in action 2nd edition, 2015) Et voici des exemples pour l’export. https://trac.osgeo.org/postgis/wiki/UsersWikiOGR http://www.postgresonline.com/journal/archives/31-GDAL-OGR2OGR-for-Data-Loading.html
C. Import de données Rasters TP 4 : Import/export C. Import de données Rasters Commande raster2pgsql raster2pgsql –G pour lister tous les formats Rasters compatibles Double commande pour l’import : SRS Index Tuilage Nom couche shp avec chemin accès raster2pgsql -s 2154 -I -t 128x128 -C C:/mon_chemin/_ToulouseMetropole.jpg tp.toulouse_metropole | psql -h localhost -U admin_miashs -p 5432 -d tp_miashs Noms schéma.table Nom hôte Nom utilisateur port Nom BDD Ex10 _ToulouseMetropole.jpg http://postgis.net/docs/manual-2.2/using_raster_dataman.html#RT_Raster_Loader Pour importer les données raster dans PostgreSQL/PostGIS, il est nécessaire d’utiliser les lignes de commandes. En effet, la commande raster2pgsql ne propose pas d’interface utilisateur comme la commande shp2pgsql. De la même façon que pour une couche vecteur, une couche raster est divisée en un ensemble d’enregistrements (une ligne = une tuile) stockés dans une seule table. Il est possible avec la commande raster2pgsql d’importer simultanément une couche complète, de la tuiler et/ou de générer en parallèle de multiples résolutions (overviews) de la même couche dans des tables adjacentes. Ici nous allons importer l’image JPG de Toulouse Métropole qui n’est pas tuilée mais que nous allons tuiler selon une résolution de 128 pixels de côté. Le système de projection est RGF93-Lambert93.
3. Import de données Rasters TP 4 : Import/export 3. Import de données Rasters Commande raster2pgsql Voici le résultat de la table raster générée et de la vue raster_columns. Vue raster_columns
Plan du cours Introduction sur les bases de données spatiales et le choix de PostgreSQL/PostGIS Installation et configuration de PostgreSQL. Création de BDD spatiales PostGIS – TP 1 Spécificités de PostGIS – TP 2 Liaison PostGIS-QGIS : les fonctions complémentaires de QGIS de gestion et de visualisation des tables et vues de PostGIS – TP 3 Import/export de données spatiales via PostgreSQL et QGIS – TP 4 Requêtes spatiales simples – TP 5 Découverte de la cartographie interactive avec QGIS à partir notamment de données PostGIS – TP 6
VI. Requêtes spatiales simples Sélection attributaire simple, calculs spatiaux, sélections spatiales sans relation entre plusieurs tables [ Requêtes complexes et/ou avec les données raster : cf. cours L. Jégou ]
Rappels sur les requêtes SQL dans PostgreSQL 4 types de requêtes SQL : SELECT retourne des lignes en réponse à une requête INSERT ajoute des lignes dans une table UPDATE modifie des lignes existantes d’une table DELETE supprime des lignes d’une table La requête SELECT est la plus utilisée et elle est souvent utilisée sous la forme de sous-requêtes imbriquées pour optimiser les temps de calcul Quelques fonctions d’agrégation : avg() : la moyenne des valeurs dans un ensemble d’enregistrements sum() : la somme des valeurs d’un ensemble d’enregistrements count() : le nombre d’éléments contenus dans un ensemble d’enregistrements Avant de démarrer cette partie, voici quelques rappels de base sur les requêtes SQL et fonctions d’agrégation.
Fonctions qui informent sur les géométries Requêtes Fonctions qui informent sur les géométries ST_GeometryType(geometry) retourne le type de la géométrie ST_NDims(geometry) retourne le nombre de dimensions d’une géométrie ST_SRID(geometry) retourne l’identifiant de référence spatiale de la géométrie ST_X(geometry) retourne la composante X ST_Y(geometry) retourne la composante Y Exemple : -- Informations sur la couche velo_toulouse SELECT ST_GeometryType(geom) as type_geom, ST_NDims(geom) as nb_dimensions, ST_SRID(geom) as syst_ref_spatial, ST_X(geom) as longitude, ST_Y(geom) as latitude FROM tp.velo_toulouse http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html
Fonctions en lien avec les systèmes de projection Requêtes Fonctions en lien avec les systèmes de projection ST_AsText retourne la représentation au format Well-Known Text (WKT) sans la métadonnée SRID ST_SetSRID(geometry, srid) affecte une valeur au SRID d’une géométrie ST_SRID(geometry) retourne l’identifiant du système de référence spatiale d’un objet ST_Geometry comme défini dans la table spatial_ref_sys ST_Transform(geometry, srid) retourne une nouvelle géométrie après avoir re-projeté les données dans le système correspondant au SRID passé en paramètre Exemples : -- Changer le SRID d’un champ ‘geometry’ déjà existant et dont le SRID est erroné ALTER TABLE ma_table ALTER COLUMN geom TYPE geometry(MULTIPOLYGON,4326) USING ST_SetSRID(geom,4326); -- Convertir un champ ‘geometry’ en ‘geography’ ALTER TABLE ma_table2 ALTER COLUMN mon_champ TYPE geography(MULTIPOLYGON,4326) USING ST_Transform(mon_champ,4326)::geography; http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html
Fonctions spatiales travaillant sur les géométries Import/export / Requêtes Fonctions spatiales travaillant sur les géométries Lignes ST_Length(geometry) retourne la longueur d’une ligne ST_StartPoint(geometry) retourne le premier point d’une ligne ST_EndPoint(geometry) retourne le dernier point d’une ligne ST_NPoints(geometry) retourne le nombre de points dans une ligne Polygones ST_Area(geometry) retourne l’aire d’un polygone ST_NRings(geometry) retourne le nombre de contours (habituellement 1, plus lorsqu’il y a des trous) ST_ExteriorRing(geometry) retourne le contour extérieur ST_InteriorRingN(geometry,n) retourne le contour intérieur numéro n ST_Perimeter(geometry) retourne la longueur de tous les contours Collections ST_NumGeometries(geometry) retourne le nombre de composantes d’1 collection ST_GeometryN(geometry,n) retourne une composante spécifique ST_Area(geometry) retourne l’aire totale des composantes de type polygone ST_Length(geometry) retourne la longueur totale des composantes de type ligne http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html
Quelques exemples combinant plusieurs fonctions Requêtes Quelques exemples combinant plusieurs fonctions -- Superficie de la commune de Toulouse SELECT ST_Area(ST_Transform(geom,2154))/1000000 as superficie_toulouse_km2 FROM tp.communes WHERE libcom='TOULOUSE'; -- Quelle est la commune de Toulouse métropole qui a le plus petit périmètre ? libcom AS nom_commune, round((ST_Perimeter(ST_Transform(geom,2154))/1000)::numeric,2) as perimetre_km ORDER BY perimetre_km ASC LIMIT 1; Réponse : FONBEAUZARD (7.09 km) -- Longueur totale en km des routes en sens uniques Sum(ST_Length(ST_Transform(sens_geom,2154)))/1000 as long_tot_sens_unique_km FROM tp.sens_unique;
Fonction de test de la validité des géométries Requêtes Fonction de test de la validité des géométries La validité est surtout importante pour les polygones, qui définissent des aires et requièrent une bonne structuration. Les lignes sont vraiment simples et ne peuvent pas être invalides ainsi que les points. Pour détecter les possibles géométries invalides : Utiliser ST_IsValid(geometry) pour déterminer les géométries non valides de la table Utiliser ST_IsValidReason(geometry) pour trouver la cause de non validité Pour réparer une table présentant des géométries invalides : Méthode 1 mais ne fonctionne pas toujours efficacement : -- Création d’une table stockant les géométries invalides CREATE TABLE ma_table_invalide AS SELECT * FROM ma_table WHERE NOT ST_IsValid(geom); -- Suppression des géométries invalides de la table principale DELETE FROM ma_table Méthode 2 : un grand nombre de non-validités peut être résolu en utilisant ST_Buffer (En créant un buffer de zéro sur le polygone cela retourne un polygone OGC valide) http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html
Requêtes Fonctions de comparaisons de 2 géométries avec un résultat booléen TRUE ou FALSE ST_Contains(geometry A, geometry B) retourne TRUE si la géométrie A contient la géométrie B ST_Crosses(geometry A, geometry B) retourne TRUE si la géométrie A croise la géométrie B ST_Disjoint(geometry A , geometry B) retourne TRUE si les géométries ne s’intersectent pas ST_DWithin(geometry A, geometry B, radius) retourne TRUE si A est distante ≤ radius de B ST_Equals(geometry A, geometry B) retourne TRUE si A est la même géométrie que B ST_Intersects(geometry A, geometry B) retourne TRUE si A intersecte B ST_Overlaps(geometry A, geometry B) retourne TRUE si A et B on un espace en commun, mais ne sont pas complètement incluses l’un dans l’autre ST_Touches(geometry A, geometry B) retourne TRUE si le contour extérieur de A touche B ST_Within(geometry A, geometry B) retourne TRUE si A est hors de B Rem : Seule fonction qui ne renvoie pas un booléen mais une distance ST_Distance(geometry A, geometry B) retourne la distance minimum entre deux géométries Exemple : -- Liste des espaces verts en dehors de la commune de Toulouse (2 requêtes possibles) SELECT e.numero, e.intitule FROM tp.espaces_verts AS e JOIN tp.communes AS c ON ST_Contains(c.geom, e.geom) WHERE c.libcom NOT IN('TOULOUSE'); http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html SELECT e.numero,e.intitule FROM tp.espaces_verts AS e, tp.communes AS c WHERE c.libcom NOT IN('TOULOUSE') AND ST_Contains(c.geom, e.geom);
Requêtes Requêtes simples (1 couche manipulée) vs requêtes complexes (≥ 2 couches) Toutes les fonctions vues jusqu’à présent traitent les géométries “comme elles sont” et retournent : une analyse des objets (ST_Length(geometry), ST_Area(geometry)), une sérialisation des objets (ST_AsText(geometry), ST_AsGML(geometry)), une partie de l’objet (ST_RingN(geometry,n)) ou un résultat vrai/faux lors d’une comparaison de géométries (ST_Contains(geometry,geometry), ST_Intersects(geometry,geometry)) Les “fonctions de construction de géométries” prennent des géométries en entrée et retourne de nouvelles formes http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html
Fonctions de construction de géométries Requêtes Fonctions de construction de géométries ST_AsText(text) retourne la représentation Well-Known Text (WKT) de la géométrie/géographie sans métadonnée SRID ST_Buffer(geometry, distance) Pour les géométries: retourne une géométrie qui représente tous les points dont la distance depuis cette géométrie est inférieure ou égale à la distance utilisée. Les calculs se font dans le système de référence spatial de cette géométrie Pour les géographies: utilise une fonction de transformation planaire pour effectuer le calcul ST_Intersection(geometry A, geometry B) retourne une géométrie qui représente la portion commune des géométries A et B. L’implémentation du type géographie fait une transformation vers une géométrie pour faire l’intersection puis reprojette le résultat en WGS84 ST_Union() renvoie un objet géométrique qui représente l’ensemble d’union des objets géométriques désignés Cf. cours L. Jégou (idem pour les fonctions Raster) http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html
Exemple avec ST_Buffer, ST_Transform, ST_SetSRID et ST_MakePoint Requêtes Exemple avec ST_Buffer, ST_Transform, ST_SetSRID et ST_MakePoint -- Création d’une zone tampon de 300 m autour d’un point localisant l’entrée de l’université Toulouse Jean Jaurès (coordonnées en RGF93 Lamber93) CREATE TABLE tp.univ_buffer_300m AS SELECT row_number() OVER() as id, ST_Transform( ST_Buffer( ST_SetSRID(ST_MakePoint(570892,6276565),2154 ),300 ),4326 )::geometry(POLYGON,4326) as geom; ALTER TABLE tp.univ_buffer_300m ADD CONSTRAINT univ_buffer_300m_pkey PRIMARY KEY (id); CREATE INDEX univ_buffer_300m_geom_idx ON tp.univ_buffer_300m USING gist(geom);
Récap des principales fonctions Requêtes Récap des principales fonctions Constructeurs ST_MakePoint(Longitude, Latitude) Retourne un nouveau point. Note : ordre des coordonnées (longitude puis latitude). ST_GeomFromText(WellKnownText, srid) Retourne une nouvelle géométrie à partir d’une représentation au format WKT et un SRID. ST_SetSRID(geometry, srid) Met à jour le SRID d’une géométrie. Retourne la même géométrie. Cela ne modifie pas les coordonnées de la géométrie. Cette fonction est utile pour reconditionner les géométries sans SRID. ST_Expand(geometry, Radius) Retourne une nouvelle géométrie qui est une extension de l’étendue de la géométrie passée en argument. Cette fonction est utile pour créer des enveloppes pour des recherches utilisant les indexations. Sorties ST_AsText(geometry) Retourne une géométrie au format WKT. ST_AsGML(geometry) Retourne la géométrie au format standard OGC GML. ST_AsGeoJSON(geometry) Retourne une géométrie au format “standard” GeoJSON. Mesures ST_Area(geometry) Retourne l’aire d’une géométrie dans l’unité du système de référence spatiale. ST_Length(geometry) Retourne la longueur de la géométrie dans l’unité du système de référence spatiale. ST_Perimeter(geometry) Retourne le périmètre de la géométrie dans l’unité du système de référence spatiale. ST_NumPoints(linestring) Retourne le nombre de sommets dans une ligne. ST_NumRings(polygon) Retourne le nombre de contours dans un polygone. ST_NumGeometries(geometry) Retourne le nombre de géométries dans une collection de géométries. Relations ST_Distance(geometry, geometry) Retourne la distance entre deux géométries dans l’unité du système de référence spatiale. ST_DWithin(geometry, geometry, radius) Retourne TRUE si les géométries sont distantes d’un rayon de l’autre, sinon FALSE. ST_Intersects(geometry, geometry) Retourne TRUE si les géométries sont disjointes, sinon FALSE. ST_Contains(geometry, geometry) Retourne TRUE si la 1ère géométrie est totalement contenue dans la 2ème, sinon FALSE. ST_Crosses(geometry, geometry) Retourne TRUE si une ligne ou les contours d’un polygone croisent une ligne ou un contour de polygone, sinon FALSE. http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geometries.html
Plan du cours Introduction sur les bases de données spatiales et le choix de PostgreSQL/PostGIS Installation et configuration de PostgreSQL. Création de BDD spatiales PostGIS – TP 1 Spécificités de PostGIS – TP 2 Liaison PostGIS-QGIS : les fonctions complémentaires de QGIS de gestion et de visualisation des tables et vues de PostGIS – TP 3 Import/export de données spatiales via PostgreSQL et QGIS – TP 4 Requêtes spatiales simples – TP 5 Découverte de la cartographie interactive avec QGIS à partir notamment de données PostGIS – TP 6
VII. Découverte de la cartographie interactive avec QGIS Webmapping QGIS VII. Découverte de la cartographie interactive avec QGIS À partir notamment de données issues de tables ou de vues PostGIS Ainsi s’achève cette partie introductive sur les SGBD spatiaux et sur PostGIS. Passons à la partie pratique avec ce premier TP d’installation et d’exploration de PostGIS.
Extension qgis2web à installer Webmapping QGIS Extension qgis2web à installer
Paramétrage du plugin qgis2web Webmapping QGIS Paramétrage du plugin qgis2web
Résultat avec OpenLayers3 (JavaScript library) Webmapping QGIS Résultat avec OpenLayers3 (JavaScript library)
Résultat avec Leaflet (JavaScript library) Webmapping QGIS Résultat avec Leaflet (JavaScript library)
Webmapping QGIS Résultat avec Leaflet : exploration du répertoire et correction sur le style des communes Fichiers CSS Données au format JSON La carte web est ainsi indépendante de QGIS Modifications Fichiers js