Chargement en masse de plusieurs fichiers de formes dans PostGIS

33

J'ai plus d'une centaine de couches de données au format shapefile que je souhaite télécharger dans une base de données PostGIS. Ils sont tous dans la même projection, mais représentent différentes couches de données et n'ont donc pas le même schéma.

Quel est le moyen le plus rapide de convertir en masse tous ces fichiers dans ma base de données PostGIS (sous Windows 7)?

UPDATE: L' importation en bloc dans le programme de téléchargement de fichiers de formes PostGIS de pgAdmin3 (comme indiqué ci-dessous) est désormais disponible par défaut avec PostGIS 2.0 .

RyanDalton
la source
Je cherche une réponse similaire à cela. Cependant, je veux en faire un travail par lots qui s'exécute tous les soirs. En effet, je veux faire de mon PostGIS un esclave de ArcSDE (pour le moment). Etant nouveau dans PostGIS et SQL, je comprends ce que ferait le script cmd.exe mais en quelque sorte, cela ne me tient pas à la tête. Ce que je veux faire, c'est obtenir une série de fichiers shp qui ont été exportés à partir d'ArcSDE en tant que travail par lots, puis les télécharger dans mon PostGIS, ce qui écraserait déjà les gis / tables existants.
geosmiles
Je poserais cette question comme une nouvelle question, dans le sens de "Comment synchroniser par lots les données d'ArcSDE vers PostGIS". Il pourrait y avoir des idées intéressantes.
Mike T

Réponses:

22

Si vous souhaitez vous en tenir à une interface graphique, la version la plus récente de pgAdmin contient Shapefile Loader qui peut être utilisé en tant que chargement en bloc.

entrez la description de l'image ici

Mapperz
la source
32

Si vous avez un ordinateur Windows, vous pouvez utiliser good 'ol CMD.EXEavec quelques boucles for ésotériques. Assurez-vous de le faire dans un répertoire "contenu" avec uniquement les fichiers shp / sql que vous devez charger.

Première étape, créez les fichiers de chargement SQL (j'ai aussi supposé que vous avez des données WGS84 Lat / Long avec 4326 .. mettez cela à jour dans votre SRS):

for %f in (*shp) do shp2pgsql -s 4326 %f public.%~nf > %~nf.sql

Ensuite, vérifiez vos fichiers SQL pour vous assurer qu'ils ont l'air correct, puis faites une boucle similaire:

for %f in (*sql) do psql -h myserver -d mydb -U myuser -f %f > nul

L' bashéquivalent pour le folk POSIX (Linux, Mac OS X, etc.) est quelque chose comme:

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` > `basename $f .shp`.sql
done

puis

for f in *.sql
do
    psql -h myserver -d mydb -U myuser -f $f > /dev/null
done

ou les deux parties reliées en une seule boucle, si vous n'avez pas besoin de conserver les .sqlfichiers intermédiaires :

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` | psql -d mydb > /dev/null
done
Mike T
la source
cela fonctionnerait-il mieux en une seule boucle,for f in *.shp do shp2pgsql -s 4326 %f public.'basename $f .shp' > 'basename $f .shp'.sql | psql -h myserver -d mydb -U myuser done
Sam007
Eh oui, cela peut être fait en une seule commande (mais sans la >partie de redirection, car cela casse la |partie de tuyau), tant que vous êtes sûr que le SQL transmis à psql est correct. Je dirais que ce n'est pas mieux, car il n'y a pas d'enregistrement des données au format SQL.
Mike T
4

Vous pouvez également utiliser cette commande unique qui facilite beaucoup la mise en boucle et qui n’a pas besoin de créer .sql séparément.

for f in *.shp
    do shp2pgsql -c -D -s 4326 -I $f public.${f%.*} | psql -h hostname -d dbname -U usrname
done
Sam007
la source