โหลดรูปร่างหลายไฟล์ลงใน PostGIS จำนวนมาก


33

ฉันมีชั้นข้อมูลกว่าร้อยชั้นในรูปแบบ shapefile ที่ฉันต้องการอัปโหลดไปยังฐานข้อมูล PostGIS พวกเขาทั้งหมดอยู่ในการฉายเดียวกัน แต่เป็นตัวแทนของชั้นข้อมูลที่แตกต่างกันดังนั้นพวกเขาจึงไม่มีสคีมาเดียวกัน

วิธีที่มีประสิทธิภาพมากที่สุดในการแปลงไฟล์เหล่านี้เป็นจำนวนมากเป็นฐานข้อมูล PostGIS ของฉัน (บน windows 7 OS) คืออะไร?

UPDATE:กลุ่มนำเข้าใน "shapefile อัปโหลด PostGIS" pgAdmin3 (ตามที่ระบุไว้ด้านล่าง) อยู่ในขณะนี้โดยเริ่มต้นด้วยPostGIS 2.0


ฉันกำลังมองหาคำตอบที่ simlar นี้ อย่างไรก็ตามฉันต้องการให้เป็นงานแบ็ตช์ที่รันทุกคืน ผลที่ตามมาฉันต้องการทำให้ PostGIS เป็นทาสของ ArcSDE (ในขณะนี้) เป็นสิ่งใหม่สำหรับ PostGIS และ SQL ฉันได้รับสิ่งที่สคริปต์ cmd.exe จะทำ แต่อย่างใดมันไม่ติดอยู่ในหัวของฉัน สิ่งที่ฉันต้องการทำคือรับชุดไฟล์ shp ที่ส่งออกจาก ArcSDE เป็นงานแบ็ตช์แล้วอัปโหลดไปยัง PostGIS ของฉันซึ่งจะเขียนทับ gis / tables ที่มีอยู่แล้ว
geosmiles

ฉันถามคำถามนี้เป็นคำถามใหม่ตามแนวของ "วิธีการแบตช์ซิงโครไนซ์ข้อมูลจาก ArcSDE ไปยัง PostGIS" อาจมีความคิดที่น่าสนใจ
Mike T

คำตอบ:


22

หากต้องการติดกับ GUI ดังนั้น pgAdmin เวอร์ชันใหม่กว่ามี Shapefile Loader ที่สามารถใช้เป็นโหลดจำนวนมาก

ป้อนคำอธิบายรูปภาพที่นี่


32

หากคุณมีคอมพิวเตอร์ที่ใช้ Windows คุณสามารถใช้ ol 'ที่ดีCMD.EXEด้วยความลับเล็ก ๆ น้อย ๆ ตรวจสอบให้แน่ใจว่าคุณทำเช่นนี้ในไดเรกทอรี "บรรจุ" โดยมีเฉพาะไฟล์ shp / sql ที่คุณต้องโหลด

ขั้นตอนแรกสร้างไฟล์ตัวโหลด SQL (ฉันสมมติว่าคุณมีข้อมูล Lat / Long WGS84 ที่มี 4326 .. อัปเดตเป็น SRS ของคุณ):

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

จากนั้นตรวจสอบไฟล์ SQL ของคุณเพื่อให้แน่ใจว่าไฟล์ดูดีจากนั้นทำการวนซ้ำที่คล้ายกัน:

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

สิ่งที่bashเทียบเท่ากับ POSIX folk (Linux, Mac OS X, ฯลฯ ) มีลักษณะดังนี้:

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

แล้วก็

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

หรือทั้งสองส่วนแบ่งเป็นลูปเดียวถ้าคุณไม่ต้องการเก็บ.sqlไฟล์ชั่วคราว:

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

จะทำงานได้ดีขึ้นในวงเดียวหรือไม่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, มันสามารถทำได้ในหนึ่งคำสั่ง (แต่ไม่มี>ส่วนที่เปลี่ยนเส้นทาง, ซึ่งจะเป็นการแบ่ง|ส่วนไพพ์), ตราบใดที่คุณแน่ใจว่า SQL ที่ส่งไปยัง psql นั้นถูกต้อง ฉันยืนยันว่ามันไม่ดีกว่าเนื่องจากไม่มีการบันทึกข้อมูลในรูปแบบ SQL
Mike T

3

นอกจากนี้คุณยังสามารถใช้คำสั่งเดียวซึ่งช่วยในการวนลูปง่ายขึ้นและไม่จำเป็นต้องสร้าง. sql แยกต่างหาก

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.