MAJ du 28/03/2017 - Sylvain M sur le forumSIG nous informe que la BD Topo peut être téléchargé directement en format SQL pour PostGreSQL - Plus d'informations ici et ici.
/!\ 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 :
- Chargement de l’ensemble des thèmes du premier département.
- Ajout des couches des autres départements aux tables déjà présentes.
- 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
Questions sur la création du fichier .sh
Bonjour,
J'essaye d'importer toutes les couches communes de tous les départements qui sont des données fournies par l'IGN.
J'ai essayé de suivre votre méthode mais je bloque dès le début, à savoir la création du fichier import_lot1.sh.
Comment créer ce fichier ? Est-ce simplement un fichier texte où l'on met l'extension .sh ?
Merci par avance pour votre aide,
Cordialement,
Eva
Poster un nouveau commentaire