Massal memuat beberapa shapefile ke PostGIS

33

Saya memiliki lebih dari seratus lapisan data dalam format shapefile yang ingin saya unggah ke dalam database PostGIS. Mereka semua dalam proyeksi yang sama, tetapi mewakili lapisan data yang berbeda sehingga mereka tidak memiliki skema yang sama.

Apa cara paling efektif waktu untuk mengonversi semua file ini secara massal ke dalam database PostGIS saya (di windows 7 OS)?

UPDATE: Mengimpor secara massal di pgAdmin3 "Pengunggah shapefile PostGIS" (sebagaimana disebutkan di bawah) sekarang tersedia secara default dengan PostGIS 2.0 .

Ryan Dalton
sumber
Saya mencari jawaban simlar untuk ini. Namun saya ingin menjadikannya pekerjaan batch yang berjalan setiap malam. Sebenarnya saya ingin menjadikan PostGIS saya sebagai budak ArcSDE (untuk saat ini). Menjadi baru untuk PostGIS dan SQL, saya mendapatkan apa yang akan dilakukan skrip cmd.exe tetapi entah bagaimana tidak menempel di kepala saya. Yang ingin saya lakukan adalah mendapatkan serangkaian file shp yang telah diekspor dari ArcSDE sebagai pekerjaan batch, kemudian mengunggah ini ke PostGIS saya, yang akan menimpa gis / tabel yang sudah ada di tempatnya.
geosmiles
Saya akan menanyakan ini sebagai pertanyaan baru, di sepanjang baris "bagaimana cara menyinkronkan data dari ArcSDE ke PostGIS." Mungkin ada beberapa ide menarik.
Mike T

Jawaban:

22

Jika ingin tetap menggunakan GUI maka pgAdmin versi terbaru memiliki Shapefile Loader yang dapat digunakan sebagai beban massal

masukkan deskripsi gambar di sini

Mapperz
sumber
32

Jika Anda memiliki komputer Windows, Anda dapat menggunakan yang baik CMD.EXEdengan beberapa for-loop esoterik. Pastikan Anda melakukan ini di direktori "berisi" dengan hanya file shp / sql yang perlu Anda muat.

Langkah pertama, buat file SQL loader (Saya juga berasumsi Anda memiliki data Lat / Long WGS84 dengan 4326 .. perbarui ini ke SRS Anda):

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

Kemudian periksa file SQL Anda untuk memastikan mereka terlihat baik, kemudian lakukan perulangan serupa:

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

The bashsetara untuk POSIX rakyat (Linux, Mac OS X, dll) adalah sesuatu seperti:

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

kemudian

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

atau kedua bagian disalurkan ke satu loop tunggal, jika Anda tidak perlu menyimpan .sqlfile sementara :

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` | psql -d mydb > /dev/null
done
Mike T
sumber
apakah ini akan bekerja lebih baik dalam satu loop,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
yup, ini dapat dilakukan dalam satu perintah (tetapi tanpa bagian >redirect, karena ini akan merusak bagian |pipa), selama Anda yakin SQL yang diteruskan ke psql sudah benar. Saya berpendapat bahwa ini tidak lebih baik, karena tidak ada catatan data dalam format SQL.
Mike T
4

Anda juga dapat menggunakan perintah tunggal ini yang membantu dalam perulangan jauh lebih mudah dan juga tidak perlu membuat .sql secara terpisah,

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

Anda mungkin juga ingin melihat SPIT , yang merupakan plugin loader PostGIS untuk QGIS

Ryan Garnett
sumber
1
Kupikir aku mungkin memposting ulang tautannya karena tautanmu
Akheloes