Caricare in blocco più file di forma in PostGIS


33

Ho oltre un centinaio di livelli di dati in formato shapefile che voglio caricare in un database PostGIS. Sono tutti nella stessa proiezione, ma rappresentano diversi livelli di dati, quindi non hanno lo stesso schema.

Qual è il modo più efficace in termini di tempo per convertire in blocco tutti questi file nel mio database PostGIS (sul sistema operativo Windows 7)?

AGGIORNAMENTO: L' importazione di massa nel pgAdmin3 "Uploader del file di forma PostGIS" (come indicato di seguito) è ora disponibile per impostazione predefinita con PostGIS 2.0 .


Sto cercando una risposta semplice a questo. Tuttavia, voglio renderlo un processo batch che viene eseguito ogni notte. In effetti, voglio rendere PostGIS uno schiavo di ArcSDE (per il momento). Essendo nuovo in PostGIS e SQL, ho capito cosa farebbe lo script cmd.exe ma in qualche modo non mi si attacca nella testa. Quello che voglio fare è ottenere una serie di file shp che sono stati esportati da ArcSDE come processo batch, quindi caricarli nel mio PostGIS, che sovrascriverebbe già le tabelle / gis esistenti.
geosmiles

Lo farei come una nuova domanda, sulla falsariga di "come sincronizzare in batch i dati da ArcSDE a PostGIS". Potrebbero esserci alcune idee interessanti.
Mike T

Risposte:


22

Se si desidera attenersi a una GUI, la versione più recente di pgAdmin ha Shapefile Loader che può essere utilizzato come caricamento di massa

inserisci qui la descrizione dell'immagine


32

Se hai un computer Windows, puoi usarlo bene CMD.EXEcon alcuni for-loop esoterici. Assicurati di farlo in una directory "contenuta" con solo i file shp / sql che devi caricare.

Primo passo, crea i file del caricatore SQL (ho anche supposto che tu abbia dati Lat / Long WGS84 con 4326 .. aggiorna questo al tuo SRS):

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

Quindi controlla i tuoi file SQL per assicurarti che abbiano un bell'aspetto, quindi esegui un ciclo simile:

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

L' bashequivalente per le persone POSIX (Linux, Mac OS X, ecc.) È qualcosa di simile:

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

poi

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

o entrambe le parti convogliate in un singolo ciclo, se non è necessario conservare i .sqlfile provvisori :

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` | psql -d mydb > /dev/null
done

funzionerebbe meglio in un singolo ciclo,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,

sì, può essere fatto in un solo comando (ma senza la >parte di reindirizzamento, in quanto ciò interrompe la |parte del tubo), purché si sia sicuri che l'SQL passato a psql sia corretto. Direi che questo non è meglio, dal momento che non vi è alcuna registrazione dei dati in formato SQL.
Mike T,

4

Puoi anche utilizzare questo singolo comando che aiuta a eseguire il loop molto più facilmente e non è necessario creare separatamente .sql,

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.