PostGIS içine toplu yükleme çoklu şekil dosyaları


33

PostGIS veritabanına yüklemek istediğim, yüzdelik veri katmanlarını shapefile biçiminde aldım. Hepsi aynı projeksiyonda, ancak aynı veri şemasına sahip olmadıkları için farklı veri katmanlarını temsil ediyorlar.

Tüm bu dosyaları PostGIS veritabanıma (Windows 7 işletim sisteminde) toplu olarak dönüştürmenin en etkili yolu nedir?

GÜNCELLEME: pgAdmin3 "PostGIS shapefile uploader" uygulamasında toplu içe aktarma (aşağıda belirtildiği gibi) varsayılan olarak PostGIS 2.0 ile kullanılabilir .


Bunun için basit bir cevap arıyorum. Ancak, her gece çalışan bir toplu iş yapmak istiyorum. Aslında PostGIS'imi ArcSDE'ye köle yapmak istiyorum (şimdilik). PostGIS ve SQL’de yeni olan, cmd.exe betiğinin ne yapacağını, ancak bir şekilde kafamın içine sokmadığını anladım. Yapmak istediğim, ArcSDE'den toplu iş olarak dışa aktarılan bir dizi shp dosyasını almak, sonra bunları zaten var olan gis / tabloların üzerine yazacak olan PostGIS'ime yüklemek.
geosmiles

Bunu yeni bir soru olarak soracağım, "toplu veri ArcSDE'den PostGIS'e nasıl senkronize edilir?" Bazı ilginç fikirler olabilir.
Mike T

Yanıtlar:


22

Bir GUI'ye bağlı kalmak istiyorsanız, pgAdmin'in daha yeni sürümü toplu yük olarak kullanılabilecek Shapefile Loader'a sahiptir.

görüntü tanımını buraya girin


32

Eğer bir Windows bilgisayarınız varsa, CMD.EXEbirkaç ezoterik for-loop ile iyi kullanabilirsiniz . Bunu, "içerdiği" bir dizinde yalnızca yüklemeniz gereken shp / sql dosyalarıyla yaptığınızdan emin olun.

İlk adım, SQL yükleyici dosyalarını oluşturun (4326 ile Lat / Long WGS84 verileriniz olduğunu da varsaydım .. bunu SRS'nize güncelleyin):

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

Sonra iyi göründüklerinden emin olmak için SQL dosyalarınızı kontrol edin, ardından benzer bir döngü yapın:

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

bashPOSIX halk (Linux, Mac OS X, vs) için eşdeğer gibi bir şey:

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

sonra

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

veya ara .sqldosyaları saklamanız gerekmiyorsa, her iki parça da tek bir döngüye bağlanır :

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

bu tek bir döngüde daha iyi çalışır 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
mıydı

yup, psql'ye iletilen SQL'in doğru olduğundan emin olduğunuz sürece, tek bir komutla yapılabilir (ancak >yönlendirme bölümü olmadan, bu |boru bölümünü kırar ). SQL formatında veri kaydı olmadığı için bunun daha iyi olmadığını savunuyorum.
Mike T

4

Ayrıca, çok kolay bir şekilde döngülemeye yardımcı olan ve ayrı ayrı .sql oluşturmanız gerekmeyen bu tek komutu da kullanabilirsiniz.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.