Laden Sie mehrere Shapefiles in PostGIS

33

Ich habe über hundert Datenebenen im Shapefile-Format, die ich in eine PostGIS-Datenbank hochladen möchte. Sie befinden sich alle in derselben Projektion, stellen jedoch unterschiedliche Datenebenen dar, sodass sie nicht dasselbe Schema haben.

Was ist die zeiteffektivste Methode, um all diese Dateien als Massenkonvertierung in meine PostGIS-Datenbank zu konvertieren (unter Windows 7)?

UPDATE: Der Massenimport im pgAdmin3 "PostGIS-Shapefile-Uploader" (wie unten angegeben) ist jetzt standardmäßig mit PostGIS 2.0 verfügbar .

RyanDalton
quelle
Ich suche eine einfache Antwort darauf. Ich möchte es jedoch zu einem Batch-Job machen, der jeden Abend ausgeführt wird. Tatsächlich möchte ich mein PostGIS (vorerst) zu einem Slave für ArcSDE machen. Als Neuling in PostGIS und SQL verstehe ich, was das Skript cmd.exe tun würde, aber irgendwie steckt es nicht in meinem Kopf. Ich möchte eine Reihe von SHP-Dateien abrufen, die aus ArcSDE als Batch-Job exportiert wurden, und diese dann in mein PostGIS hochladen, wodurch die bereits vorhandenen GIS / Tabellen überschrieben werden.
Geosmiles
Ich würde dies als neue Frage im Sinne von "Batch-Synchronisierung von Daten von ArcSDE nach PostGIS" stellen. Es könnte einige interessante Ideen geben.
Mike T

Antworten:

22

Wenn Sie sich an eine grafische Benutzeroberfläche halten möchten, verfügt die neuere Version von pgAdmin über einen Shapefile Loader, der als Massenladeprogramm verwendet werden kann

Bildbeschreibung hier eingeben

Mapperz
quelle
32

Wenn Sie einen Windows-Computer haben, können Sie good 'ol CMD.EXEmit ein paar esoterischen for-Schleifen verwenden. Stellen Sie sicher, dass Sie dies in einem "enthaltenen" Verzeichnis mit nur den shp / sql-Dateien tun, die Sie laden müssen.

Erstellen Sie im ersten Schritt die SQL Loader-Dateien (ich habe auch angenommen, dass Sie Lat / Long WGS84-Daten mit 4326 haben. Aktualisieren Sie diese auf Ihre SRS):

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

Überprüfen Sie dann Ihre SQL-Dateien, um sicherzustellen, dass sie gut aussehen, und führen Sie dann eine ähnliche Schleife durch:

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

Das bashÄquivalent für POSIX-Benutzer (Linux, Mac OS X usw.) lautet etwa:

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

dann

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

oder beide Teile werden zu einer Schleife zusammengefasst, wenn Sie die vorläufigen .sqlDateien nicht aufbewahren müssen :

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` | psql -d mydb > /dev/null
done
Mike T
quelle
würde dies besser in einer einzigen Schleife 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
funktionieren
yup, es kann in einem Befehl ausgeführt werden (aber ohne den >Redirect-Teil, da dieser den |Pipe-Teil unterbricht), solange Sie sicher sind, dass die an psql übergebene SQL korrekt ist. Ich würde argumentieren, dass dies nicht besser ist, da es keine Aufzeichnung der Daten im SQL-Format gibt.
Mike T
3

Sie können auch diesen einzelnen Befehl verwenden, der das Schleifen erheblich vereinfacht und es nicht erforderlich macht, .sql separat zu erstellen.

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