QGIS, Postgis: ประเภทเรขาคณิตไม่ตรงกับประเภทคอลัมน์


30

ฉันกำลังพยายามนำเข้ารูปหลายเหลี่ยมหลายรูปไปยัง Postgis ใน QGIS ผ่าน SPIT ไม่สามารถนำเข้าหนึ่งในนั้นและส่งคืนข้อผิดพลาดนี้:

ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

ฉันพยายามเปลี่ยนคุณลักษณะ "Class Class" ในตารางนั้นใน SPIT Widnow จาก MULTIPOLYGON เป็น POLYGON แต่ไม่มีอะไรเกิดขึ้น

มีวิธีใดบ้างที่จะทำให้ Postgis ยอมรับทั้งสองประเภท (รูปหลายเหลี่ยมและหลายรูปหลายเหลี่ยม) หรือบางทีฉันสามารถแปลงเรขาคณิต shapefile จากรูปหลายเหลี่ยมเป็นรูปหลายเหลี่ยมได้? ความคิดใด ๆ

ฉันได้ลอง Qgis 2.0.1 ใน Windows และ Qgis 2.3 ใน ArchLinux แล้ว

คำตอบ:


14

ถ่มน้ำลายเป็นสีและไม่แนะนำอีกต่อไป ฉันขอแนะนำให้ใช้กล่องเครื่องมือการประมวลผลและเลือกอัลกอริทึม "นำเข้าสู่ PostGIS" ฉันโชคดีมากที่ใช้กิจวัตรนั้น สิ่งที่ควรทราบ:

  • พารามิเตอร์ฐานข้อมูล (ชื่อการเชื่อมต่อ) จะต้องตรงกับสิ่งที่คุณตั้งชื่อการเชื่อมต่อฐานข้อมูลของคุณจากกล่องโต้ตอบ "เพิ่มเลเยอร์ PostGIS"
  • ต้องมีสคีมาแล้ว - จะไม่สร้างขึ้นโดยอัตโนมัติ

มันทำงานได้อย่างสมบูรณ์ ขอบคุณ นอกจากนี้ฉันโหลด shapefile นี้ด้วย DB Manager ก่อนอื่นฉันจะโหลดเลเยอร์อื่นด้วย Multipolygon โดย SPIT จากนั้นฉันเขียนทับมันด้วยเลเยอร์ POLYGON ใน DBM (อิมพอร์ตเลเยอร์ / ไฟล์) มันใช้งานได้ดีเช่นกัน
dmh126

ฐานข้อมูลจะไม่แสดง (แม้ว่าจะมีชื่อเดียวกันใน QGIS 2.10 บน Windows)
Menelaos Kotsollaris

19

สิ่งนี้ดูเหมือนจะเป็นปัญหาที่ทราบแล้วซึ่งจะไม่ได้รับการแก้ไข: ดูhttp://hub.qgis.org/issues/5328

หากคุณต้องการวิธีแก้ปัญหาลองเปลี่ยนประเภทคอลัมน์รูปทรงเรขาคณิตของตารางเป็น 'เรขาคณิต' ทั่วไป:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

หลังจากนำเข้าเสร็จแล้วคุณสามารถเปลี่ยนกลับเป็นMultiPolygon:

ALTER TABLE my_table ALTER COLUMN geom 
    SET DATA TYPE geometry(MultiPolygon) USING ST_Multi(geom);

อีกทางเลือกหนึ่งให้ลองโหลดข้อมูลของคุณโดยใช้ogr2ogr


upvoting คำตอบของคุณ @ dbaston มันดีกว่าของฉัน :)
sfletche

19

ฉันใช้ ogr2ogr เพื่อนำรูปร่างของไฟล์เข้าสู่ฐานข้อมูล PostGIS โดยอัตโนมัติ โดยเฉพาะเกี่ยวกับคำถามใช้ตัวเลือก:

-nlt PROMOTE_TO_MULTI

สิ่งนี้จะบังคับให้ ogr2ogr ส่งเสริมรูปทรง POLYGON ไปที่ MULTIPOLYGON เพื่อหลีกเลี่ยงข้อผิดพลาด ตัวอย่างง่าย ๆ :

ogr2ogr -f "PostgreSQL" PG:"dbname='<my_db>'" -nlt PROMOTE_TO_MULTI <shapefile>

ฉันไม่ได้ระบุรายละเอียดโฮสต์ / รับรองความถูกต้องของ pgsql ในการแบทช์ไฟล์หลายรูปร่างคุณอาจทำสิ่งต่อไปนี้:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>

วิธีนี้ใช้ได้ผลและง่ายกว่าคำตอบอื่น ๆ มันสมควรได้รับ upvotes
Joe Germuska

5

แม้ว่าฉันจะพยายามแก้ไขด้วยอัลกอริทึม "นำเข้าสู่ PostGis" แต่ฉันไม่ประสบความสำเร็จ (ฐานข้อมูลของฉันไม่ปรากฏในรายการ - ฉันใช้ QGIS 2.10)

แต่ฉันใช้shp2pgsqlซึ่งเป็นงาน Prompt อย่างง่ายตามที่อธิบายไว้ด้านล่าง:

  • เปิดพร้อมท์คำสั่ง ( ในฐานะผู้ดูแลระบบ )
  • ไปที่โฟลเดอร์ PostgreSQL / bin ซึ่งควรมีลักษณะดังนี้: C:\Program Files\PostgreSQL\9.4\bin>
  • เพียงคัดลอกและวาง.shpไฟล์ของคุณไปยังไดเรกทอรีนี้ (ฉันคัดลอกทั้งโฟลเดอร์ด้วย.shpไฟล์ของฉัน
  • บนพรอมต์คำสั่งพิมพ์ต่อไปนี้: shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqlโดยที่MyShpDirไดเรกทอรีของคุณ 4326 คือSRIDของ WGS84 ดังนั้นเปลี่ยนหากคุณใช้ SSID ที่แตกต่างกันMySHPFile.shpไฟล์เฉพาะของคุณ ( MYSQLFileจะถูกสร้างขึ้นโดยอัตโนมัติ) เห็นได้ชัดว่าทำเช่นนี้กับไฟล์ทั้งหมดที่คุณต้องการแปลง ไฟล์จะถูกบันทึกในไดเรกทอรีปัจจุบันของคุณ ( C:\Program Files\PostgreSQL\9.4\binในกรณีของฉัน)

จากนั้นคัดลอกและวางไฟล์ SQL ใน PLSQL DataBase ของคุณ

ยิ่งไปกว่านั้นสิ่งที่น่าสนใจอีกอย่างเกี่ยวกับshp2pgsqlความจริงก็คือคุณสามารถสร้างดัชนีในตารางของคุณได้ทันทีโดยเพียงแค่เพิ่มIพารามิเตอร์ในคำสั่งเช่นนี้:

shp2pgsql -s 4326 -I MyShpDir/MySHPFile.shp> MYSQLFile.sql

กำไร! :)


3

ได้คุณสามารถบอกให้ PostGIS ยอมรับประเภทรูปทรงเรขาคณิตใดก็ได้ (รูปหลายเหลี่ยมรูปหลายเหลี่ยมจุดจุดเชื่อมต่อ ฯลฯ ) โดยเพิ่มข้อ จำกัด ต่อไปนี้ลงในตารางของคุณ

สำหรับ PostGIS 2.x (ใช้ typemod เรขาคณิตทั่วไป)

ALTER TABLE my_table ALTER COLUMN geom TYPE geometry(Geometry,4326);

คำตอบก่อนหน้า (สำหรับ PostGIS 1.x โดยใช้ข้อ จำกัด )

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)

ข้อผิดพลาดทางไวยากรณ์ที่หรือใกล้กับ CONSTRAINT ฉันได้ลอง SET CONSTRAINTS แล้ว แต่ฉันกลับพบว่ามีข้อผิดพลาดเดียวกันกับ CHECK
dmh126

คุณใช้ postgis เวอร์ชันใด
sfletche

Postgis 2.1 สำหรับ PostgreSQL 9.3
dmh126

ลองใช้มากกว่าenforce_geotype_geom enforce_geometry_typeแจ้งให้เราทราบว่าใช้งานได้หรือไม่และฉันจะแก้ไขคำตอบของฉันหากทำได้
sfletche

มันไม่ทำงาน ข้อผิดพลาดเดียวกัน
dmh126

2

ฉันลองใช้วิธีอัลกอริทึม 'นำเข้าสู่ PostGIS' แต่พบว่าไม่ได้ผลเช่นกัน ทางออกที่ง่ายที่สุดที่ฉันพบคือจะไปที่ฐานข้อมูล > DB ผู้จัดการนำทางไปยังฐานข้อมูลของคุณและคลิกที่นำเข้าชั้น / ไฟล์ (ลูกศรชี้ลง)ปุ่ม

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