Skip to Content

Importer par lot l'IGN BD TOPO® de plusieurs départements dans PostGreSQL


/!\ Pour profiter pleinement de ce tutoriel, il vous faudra utiliser shp2pgsql et psql /!\

J’ai réalisé ces opérations sous openSUSE 42.1 avec le paquet postgresql94-postgis-utils qui contient les utilitaires nécessaires.

L’import de l’ensemble des thèmes de la BD TOPO® se fera en 3 temps :

  1. Chargement de l’ensemble des thèmes du premier département.
  2. Ajout des couches des autres départements aux tables déjà présentes.
  3. Nettoyage des doublons pour chaque thème.

Création d’un schéma

Il est fortement déconseillé de travailler avec public, je vous encourage donc à en créer un nouveau.
Dans mon exemple, le schéma s’appellera simplement ign_bdtopo

Prérequis des fichiers

Par défaut la BD TOPO® est structurée en shapefiles dans des dossiers par thèmes.
Regroupez l’ensemble des fichiers dans un seul et même répertoire (un par département) et placez les scripts au même niveau.

Premier import

Dans le dossier de votre premier département, créer un fichier import_lot1.sh

Copier / coller le code suivant en l’adaptant à votre environnement et notamment à l’emplacement de shp2pgsql et de psql :

#!/bin/bash 

for f in *.SHP
do
    /usr/lib/postgresql94/bin/shp2pgsql -D -s 2154 -W "ISO-8859-1" $f ign_bdtopo.`basename $f .SHP` > `basename $f .SHP`.sql
done

for f in *.sql
do
    /usr/lib/postgresql94/bin/psql -h 10.4.27.104 -U postgres -d pigs -f $f
done 

Dans cet exemple j’importe les données de la BD TOPO® qui sont en Lambert93 (2154) et encodées en ISO-8859-1. Attention à la casse, mes extensions de fichiers sont bien en majuscules. Pour la seconde partie, ce sont les infos de PostGreSQL : mon IP serveur est 10.4.27.104, mon utilisateur est postgres et ma base de données s’appelle pigs.

Important : pour des raisons de performances d’import, ies index spatiaux ne sont pas créé durant l’import, il faudra le faire après.

Une fois que vous avez édité vos paramètres, ouvrez un terminal et lancez le script via la commande

./import_lot1.sh 

J’ai bien l’ensemble des thèmes de ma BD TOPO® dans mon schéma ign_bdtopo

Deuxième, troisième, etc. import

 A présent, il faut que les autres couches s’ajoutent aux tables sans les écraser.

Changez le nom du script en import_lot2.sh et modifiez-le en conséquence :

#!/bin/bash

for f in *.SHP
do
    /usr/lib/postgresql94/bin/shp2pgsql -a -D -s 2154 -W "ISO-8859-1" $f ign_bdtopo.`basename $f .SHP` > `basename $f .SHP`.sql
done

for f in *.sql
do
    /usr/lib/postgresql94/bin/psql -h 10.4.27.104 -U postgres -d pigs -f $f
done

-a pour "append" va ajouter les données dans écraser les précédentes.

Placez le dans les répertoires de vos autres départements et exécutez le script l’un après l’autre.

Nettoyer les doublons

La BD TOPO® n’est pas strictement découpée aux limites départementales. Vous allez donc avoir des objets et lignes en double.

Nous allons donc rechercher les lignes qui ont le même identifiant et la même géométrie

Pour chaque thème, exécutez la requête suivante :

DELETE FROM ign_bdtopo.commune
WHERE gid IN (SELECT gid
              FROM (SELECT gid,
                             ROW_NUMBER() OVER (partition BY commune.id, commune.geom ORDER BY gid) AS rnum
                     FROM ign_bdtopo.commune) t
              WHERE t.rnum > 1);

Dans cet exemple, je nettoie les doublons de ma couche commune.
AVANT :

 

APRES  : 

Répétez l’opération sur l’ensemble de vos thèmes en changeant commune par le nom de la table concernée.

Vous avez maintenant une BDTopo sur n départements. Dans mon cas, j’ai fait l’économie de 330 opérations pour l’import de 6 départements.

Merci à Michaël Douchin pour ses conseils. Cette méthode fait gagner un temps considérable mais reste "artisanale", si vous voulez améliorer ces scripts n’hésitez pas à partager votre expérience :)


Site officiel : forumSIG
Autres Liens : Manuel shp2pgsql

Commentaires

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.