PostGIS › Import/export de données vecteurs

← Précédent ↑ Retour Suivant →

Objectifs du module

À retenir par coeur

A Outils graphiques

AA Import avec shp2pg-gui

shp2pgsql-gui est un utilitaire fourni avec la version Windows de Postgis . C’est la version graphique du shp2pgsql en ligne de commande.

Par défaut, il se trouve au chemin C:\Program Files\PostgreSQL\9.3\bin\postgisgui\shp2pgsql-gui.exe mais il peut éventuellement être ailleurs en fonction de l’installation de PostGIS. S’il n’est pas installé, il peut être récupéré en téléchargeant PostGIS pour Windows . Il n’est pas nécessaire d’avoir les droits d’administrateur pour se servir de shp2pgsql-gui (à condition de choisir le ZIP sans le -setup ).

Répertoire contenant le programme shp2pgsql-gui . Ce répertoire peut varier d’un système à l’autre.
QUESTION AAA Capture d’écran de shp2-pg-gui après l’import (avec les messages de sortie)

AB Import/export avec ogr2gui

Exemple d’import

ogr2gui est une interface graphique pour ogr2ogr , un outil puissant qui permet de convertir d’un format vecteur à l’autre, qu’il s’agisse de fichiers, de bases de données, ou d’assemblages plus dynamiques.

Cela signifie qu’on peut importer en base moult formats de fichiers , ainsi que les exporter depuis la base, ou même copier d’une base à l’autre.

ogr2gui fournit une interface pratique mais cependant simpliste en comparaison de ce qui est possible avec ogr2ogr , mais permet de spécifier toute option souhaitée dans la zone de texte Options (la ligne de commande est toujours ce qu’il y a de plus puissant).

L’utilitaire est téléchargeable sur le site officiel : http://www.ogr2gui.ca/

L’exécutable ogr2gui parmi les autres fichiers du répertoire extrait de l’archive téléchargée.

Il suffit d’inverser Source et Target pour copier les données depuis la base PostGIS vers un shapefile au lieu du contraire.

Comme l’import, on peut exporter dans moult formats de fichiers et même d’une base de données à une autre.

Se référer à la documentation de ogr2ogr pour les options avancées.

AC Import avec le Gestionnaire de bases de données QGIS

Cet outil permet d’importer divers formats vectoriels dans PostGIS (y compris non-géométriques, comme les CSV). Comme il est lié à QGIS , c’est un outil de choix lorsqu’on travaille avec ce logiciel, car le gestionnaire de bases de données permet aussi d’inspecter les tables, exécuter des requêtes SQL, etc.
  • La connexion à la base doit être créée au préalable sur QGIS (CoucheAjouter une couche PostGIS )
  • Dans QGIS , cliquer sur le menu Base de donnée puis Gestionnaire de bases de donnéesGestionnaire de bases de données .

(cette méthode a déjà été expérimentée dans le module Travailler sur la France )

B Outils en ligne de commande

BA Import avec shp2pgsql

shp2pgsql est un utilitaire fourni avec PostGIS qui s’utilise en ligne de commande. Il ne fait qu’une seule chose : à partir d’un Shapefile , générer des instructions SQL qui créent la table et la peuple avec les données.
USAGE: shp2pgsql [<options>] <shapefile> [[<schema>.]<table>]

Exécuter shp2pgsql sans arguments pour obtenir de l’aide. Les options les plus importantes sont :

  • -s 4326 pour définir le SRID EPSG:4326 (ou un autre)
  • -I pour créer l’index spatial automatiquement
  • -W LATIN1 pour interpréter les textes du shapefile en ISO-8859-1 au lieu de UTF-8 (si les accents passent mal)

shp2pgsql ne se connecte pas à la base, il ne fait que générer le SQL qu’on pourra ensuite exécuter dans la base, en faisant ou bien un pipe vers la commande psql :

shp2pgsql shapefile.shp | psql -d postgis_database

... qui est le plus simple et le plus élégant (quand on dispose de psql ), sinon en enregistrant la sortie dans un fichier :

shp2pgsql shapefile.shp > shapefile.sql

... avant d’exécuter ce fichier, avec pgAdmin par exemple.

QUESTION BAA La ligne de commande shp2pgsql complète qui produit le fichier SQL
QUESTION BAB La première commande INSERT du fichier généré

BB Export avec pgsql2shp

pgsql2shp est l’inverse de shp2pgsql , ou presque. Elle se connecte à la base PostGIS spécifiée et exporte la table voulue dans un fichier shapefile du répertoire courant, nommé d’après la table.

Dans cet exemple :

pgsql2shp -h localhost -u user -P password postgis_database data_table

... la table data_table est exportée en shapefile , en produisant les 4 fichiers du Shapefile :

  • data_table.dbf : attributs
  • data_table.prj : information de projection
  • data_table.shp : géométries
  • data_table.shx : index spatial
QUESTION BBA Ligne de commande
QUESTION BBB Poids du fichier etablissements_culturels.shp généré

BC Import avec ogr2ogr

Nous allons maintenant importer des données de démographie carroyées sur le territoire, dont il va falloir reconstituer les géométries (les carreaux , polygones carrés).

QUESTION BCA La commande et ses arguments
QUESTION BCB La donnée est-elle géographique, au sens métier ?
QUESTION BCC La donnée est-elle géométrique, au sens de ogr2ogr ?

Une fois la table importée dans PostGIS, on va reconstituer, non pas seulement le point géométrique, mais le polygone carré. Il faut tout d’abord ajouter le champ geom à la table r_rfl09_laea1000 .

QUESTION BCD À quelle position dans le carreau correspondent les coordonnées fournies (centre, coin inférieur-gauche, coin supérieur-droit...) ? (une méta-donnée qu’on ne peut deviner)
QUESTION BCE Taille du côté des carreaux, en mètres
QUESTION BCF Nom de la projection, d’après les méta-données
QUESTION BCG SRID de la projection (un code EPSG, indiqué par l’INSEE via le lien Documentation générale sur le carroyage , depuis le lien d’origine ci-dessus)
QUESTION BCH Requête UPDATE qui définit la géométrie (avec SRID) pour tous les enregistrements de la table

Vérifier la couche avec QGIS :

Vue QGIS sur la France métropolitaine
QUESTION BCI Capture QGIS sur l’étendue de l’île d’Ouessant (échelle à laquelle les carrés sont bien visibles)

C Traiter les fichiers CSV

CA Préparer un fichier CSV à partir d’une source Métier

Comme exercice, nous allons importer des données européennes de la base ESPON Database sur l’emploi par groupe de secteur d’activité et par région européenne. ESPON fournit des jeux de données très complets et détaillés sur toutes sortes de thématiques, c’est pourquoi nous l’utiliserons à de multiples reprises au cours de cette formation.
Pourquoi LibreOffice plutôt que Microsoft Excel ?
  • Raison fonctionnelle : Excel ne permet pas de préciser certaines options lors de l’enregistrement d’un fichier CSV (caractère de délimitation, type d’encoding...), or tout l’enjeu est là. Il ne permet pas non plus de les spécifier à l’ouverture, ce qui pose problème avec les CSV qui utilisent le point-virgule ou la tabulation comme caractère de délimitation. Il existe cependant un Assistant d’import de texte mais il faut y penser alors que LibreOffice , lui, propose ces options dès l’ouverture d’un fichier CSV. Pour plus d’informations, consulter la la documentation Microsoft sur les CSV
  • Droits & licence : tout un chacun peut installer LibreOffice . Ce n’est pas le cas de Microsoft Office qui requiert des contreparties financières et la privatisation de l’ordinateur sur lequel il doit s’exécuter.

Dans le tableur, les 3 premières feuilles de calcul (Dataset , Indicators et Sources ) contienent des méta-données permettant de remonter à la source, savoir qui contacter en cas de besoin, etc.

La feuille Data à copier-coller
QUESTION CAA Nombre de colonnes contenues dans le CSV
QUESTION CAB Nombre d’enregistrements contenus dans le CSV
Premières lignes du fichier CSV enregistré

CB Inspecter les colonnes pour créer la table

Pour importer un contenu CSV dans PostgreSQL, il faut que la table et ses colonnes existent au préalable, ce qui peut être fait soit avec CREATE TABLE , soit graphiquement avec pgAdmin (ou d’autres outils).

L’enjeu est de déterminer le bon type à appliquer à chaque colonne, parmi les 3 principaux : integer (nombre entier), real (nombre décimal) et character varying (texte). S’il n’y a pas de méta-données sur le CSV, il faut les déterminer, soit par inspection des données, soit par itération d’essai/erreur :

  • tenter integer , qui refusera tout nombre décimal non entier et tout texte ; sinon :
  • tenter real , qui refusera tout texte (mais accepterait des nombres entiers) ; sinon :
  • utiliser character varying , qui acceptera tout (puisque toute valeur du CSV est un texte valide)

Tant que l’import réussit, il est possible (et fréquent) de retravailler les colonnes par la suite, comme par exemple, de générer une colonne integer à partir d’une colonne texte.

Exemple

En lisant le content CSV suivant :

id,name,evol,count
1,toto,43.3,5
2,tata,11,8
3,titi,8.1,0

On peut en déduire la table à créer :

CREATE TABLE espon_labour_market_sector
(
  id integer,
  name character varying,
  evol real,
  count integer
)

QUESTION CBA SQL de création de la table pour le CSV précédent

CC Importer un CSV dans le PostgreSQL local avec COPY FROM

PostgreSQL permet d’importer le contenu d’un fichier CSV dans une table, avec l’instruction COPY FROM , qui s’utilise le plus couramment comme ceci :
COPY nom_de_la_table FROM ’/chemin/du/fichier.csv’ CSV HEADER

S’assurer que le CSV est dans un répertoire local accessible par le serveur PostgreSQL, et récupérer le chemin absolu (sous Windows, il serait de la forme C:\dossier\...\espon-labour-market-sectors.csv ).

QUESTION CCA SQL de l’instruction COPY FROM pour importer le fichier CSV précédent
QUESTION CCB SQL de l’instruction COPY FROM dans le cas où l’on aurait des valeurs séparées par un point virgule au lieu d’une virgule (d’après la documentation PostgreSQL)

CD Importer un CSV dans le PostgreSQL distant avec \copy

Le shell PostgreSQL nommé psql offre des commandes propres, c’est-à-dire en amont du SQL, il gère lui-même. C’est le cas de la commande \copy qui fonctionne avec la même syntaxe que SQL COPY, mais en utilisant un fichier local au client (et non pas au serveur)

Pour reprendre l’exemple précédent, on taperait ceci dans psql :

\copy nom_de_la_table FROM ’/chemin/du/fichier.csv’ CSV HEADER

CE Générer la géométrie d’après X/Y

On peut rencontrer des CSV géolocalisés , qui sont des CSV normaux qu’on importe en base mais à partir desquels on va pouvoir générer une colonne géométrique en utilisant des champs X et Y .
QUESTION CEA Le caractère de délimitation utilisé dans ce CSV
QUESTION CEB Nom des champs X et Y, respectivement
QUESTION CEC SRID utilisé pour les coordonnées (n’est pas précisé sur data.gouv.fr, donc à deviner) ; il s’agit de l’identifiant numérique
QUESTION CED Code SQL de l’instruction ALTER TABLE
QUESTION CEE Code SQL de l’instruction UPDATE

CF Export CSV : la méthode du copier-coller avec pgAdmin

Cette méthode peut s’appliquer lorsque le volume de données n’est pas trop grand : jusqu’à quelques dizaines de milliers d’enregistrements, voire davantage en fonction de la mémoire vive du poste de travail.

Le panneau de sortie de pgAdmin, quand tout est sélectionné screen-pgadmin-selectall.png 400 right
SELECT * FROM etablissements_culturels
QUESTION CFA Le caractère de délimitation à utiliser (pour tout copié-collé depuis pgAdmin)
QUESTION CFB Capture de la fenêtre LibreOffice avec le haut du tableau
Ici, le contenu CSV a transité par le presse-papier directement vers le tableur. On aurait aussi bien pu l’enregistrer dans un fichier .csv avec un éditeur de texte.

CG Export CSV : la méthode robuste avec COPY TO

De la même façon qu’avec COPY FROM, l’instruction COPY TO permet d’exporter une table vers un fichier CSV, avec la syntaxe de base suivante :

COPY nom_de_la_table TO ’/chemin/du/fichier.csv’ CSV HEADER

La variante \copy , comme on l’a vu précédemment avec \copy nom_de_la_table FROM ... , fonctionne aussi pour l’export d’une table dans un fichier CSV local au client :

\copy nom_de_la_table to ’/chemin/du/fichier/local.csv’ CSV HEADER
QUESTION CGA Instruction COPY qui permettrait d’exporter la supposée table big_data_table dans le fichier /tmp/big_data_table.csv en utilisant le délimiteur * et avec les textes dans l’encoding iso-8859-1 (l’instruction n’est pas à exécuter, c’est une question théorique)

CH Stratégie d’import CSV : production d’un shapefile intermédiaire avec QGIS

Le SIG QGIS permet d’exploiter directement les CSV avec une interface riche en options, qui accepte non seulement des points en colonnes X et Y , mais aussi du WKT. Cet écran est disponible sous le menu CoucheAjouter une couche de texte délimité .

Fenêtre d’import

À partir de là, on peut importer la couche dans la base PostGIS :

  • Soit enregistrant la couche en Shapefile (clic droit sur la couche puis Sauvegarder sous ), pour ensuite l’importer avec n’importe quelle méthode (shp2pgsql-gui , shp2pgsql , ogr2gui , Gestionnaire de bases de données QGIS ...)
  • Soit en important dans PostGIS la couche QGIS en tant que telle (c’est bien une couche QGIS mais sa source est l’interprétation particulière d’un fichier CSV), avec le Gestionnaire de bases de données QGIS tel que vu précédent dans AC )
Suivant → ← Précédent Retour