นำเข้า Shapefile ไปยัง postgis ด้วย ogr2ogr ให้: ไม่สามารถเปิดแหล่งข้อมูล


13

ฉันต้องการใช้ ogr2ogr เพื่อนำเข้า Shapefile ในฐานข้อมูล postgis ฉันติดตั้ง ogr2ogr สำเร็จแล้วและฉันรันจากคำสั่ง pgsql ต่อไปนี้:

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp

สิ่งที่ฉันได้รับกลับมาคือข้อความแสดงข้อผิดพลาด:

Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)

ฉันได้พยายามกำหนดเส้นทางแบบเต็มของ shapefile แต่ฉันได้รับข้อความเดียวกัน

นอกจากนี้ฉันพยายามเรียกใช้:

ogrinfo world_boundaries.shp

สิ่งเดียวกัน


หลังจากแก้ไขปัญหาด้วยสิทธิ์ของไฟล์ฉันได้รับข้อผิดพลาดดังต่อไปนี้:

  ERROR 1: AddGeometryColumn failed for layer world_boundaries, layer creation has failed.
  ERROR 1: Terminating translation prematurely after failed
  translation of layer world_boundaries (use -skipfailures to skip errors)

ฉันพยายามนำเข้ามันผ่าน GUI shp2pgsql และฉันได้รับข้อผิดพลาดดังต่อไปนี้:

ALTER TABLE "public".""
Failed in pgui_exec(): ERROR:  permission denied for relation spatial_ref_sys
 CONTEXT:  SQL statement "SELECT SRID         FROM spatial_ref_sys WHERE SRID = new_srid"
PL/pgSQL function addgeometrycolumn(character varying,character   varying,character varying,character varying,integer,character varying,integer,boolean) line 50 at SQL statement
 SQL statement "SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7)"
 PL/pgSQL function addgeometrycolumn(character varying,character  varying,character varying,integer,character varying,integer,boolean) line 5 at     SQL statement

Shapefile import failed.

ปัญหาในครั้งนี้คือผู้ใช้ฐานข้อมูลนี้ไม่มีสิทธิ์เพียงพอ มันคงที่:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

ข้อความแสดงข้อผิดพลาดถัดไปคือ:

  Warning 1: Geometry to be inserted is of type 3D Multi Polygon, whereas the layer geometry type is 3D Polygon.
 Insertion is likely to fail
 ERROR 1: INSERT command for new feature failed.
 ERROR:  Geometry type (MultiPolygon) does not match column type (Polygon)

ดังนั้นดูเหมือนว่าฉันต้องใช้พารามิเตอร์: -nlt MULTIPOLYGON แต่เมื่อฉันทำเช่นนั้นฉันได้รับข้อผิดพลาดอื่นซึ่งไม่สมเหตุสมผลสำหรับฉัน:

ERROR 1: PostgreSQL driver doesn't currently support database creation.
Please create database with the `createdb' command.
PostgreSQL driver failed to create PG:host=localhost user=my_user_name dbname=my_database password=password -nlt POLYGON

แต่โหลดได้โดยใช้ shp2pgsql GUI


ความคิดเห็นของ @elrobis ทำให้สิ่งนี้ใช้งานได้ในที่สุด โหลดข้อมูลใน db อย่างถูกต้อง!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

ดูเหมือนว่าไฟล์รูปร่างของคุณไม่ถูกต้อง ใช้งานกับซอฟต์แวร์อื่นได้หรือไม่?
Evil Genius

1
ใช่. มันโหลดอย่างถูกต้องใน QGIS
user1919

1
นอกจากนี้สมมติว่าฐานข้อมูลของคุณมีอยู่แล้วและสะกดอย่างถูกต้องในคำสั่ง ogr2ogr ของคุณและผู้ใช้ postgres ในคำสั่งมีสิทธิ์ครบถ้วนที่จำเป็นทั้งหมด (SELECT, INSERT, UPDATE, CREATE .. ฯลฯ ) ลองเพิ่ม-nln layernameอาร์กิวเมนต์ บางทีพร้อมกับ-overwriteดูว่ามันมาถึงชีวิต นอกจากนี้ถ้าฉันเป็นคุณฉันจะเรียกใช้ ogr2ogr sudoพร้อมกับ superuser postgres ของฉันเพียงเพื่อให้แน่ใจในการออกกฎการอนุญาตและสิทธิพิเศษ เมื่อสคริปต์ของคุณเป็นแบบทึบคุณสามารถจิกไปที่การอนุญาตและสิทธิ์ที่น่ารำคาญ :)
elrobis

3
ขอบคุณ การเพิ่ม -nlt GEOMETRY แทน -nlt POLYGON นั้นได้ทำการหลอก
user1919

1
ดีใจที่มันทำงาน ฉันจะไปข้างหน้าและตอบกลับอย่างเหมาะสมในคำตอบที่อธิบายว่าทำไมฉันจึงคิดว่ามันใช้งานได้
elrobis

คำตอบ:


17

เมื่อคุณค้นพบโดยการลองผิดลองถูกมีปัญหาจู้จี้เล็กน้อยที่คุณต้องแก้ไขซึ่งสุดท้ายได้รับการแก้ไขโดยใช้อาร์กิวเมนต์-nlt GEOMETRY*ของ ogr2ogr

* หมายเหตุข้อเสนอแนะในความคิดเห็นของ @ LeeHachadoorian ที่-nlt PROMOTE_TO_MULTIใช้เป็นวิธีการแก้ปัญหาเริ่มต้นแทนที่จะnlt GEOMETRYเป็นในอดีตส่งเสริมการปฏิบัติที่ดีที่สุดนอกเหนือจากผลประโยชน์เสริม

สิทธิ์ของผู้ใช้และข้อความผิดพลาด

อันดับแรก ogr2ogr ไม่สามารถเปิด shapefile ของคุณและคุณรู้ว่าปัญหาการอนุญาตนั้นมีผลกระทบต่อผู้ใช้ระบบปฏิบัติการที่เข้าถึง shapefile ของคุณ แต่มีบทเรียนสำคัญสำหรับผู้อื่นโดยเฉพาะข้อความแสดงข้อผิดพลาดของ ogr2ogr ในจุดนี้ทำให้เข้าใจผิด! อันที่จริงหนึ่งในผู้วิจารณ์คนแรกคิดว่าไฟล์ของคุณไม่ถูกต้องและเป็นที่ยอมรับว่าการเดาครั้งแรกของฉันคืออาจมีข้อผิดพลาด / การพิมพ์ผิดในพา ธ / ชื่อไฟล์หรืออาจมีอักขระที่ไม่ธรรมดาในเส้นทางไฟล์เช่น space— ที่ทำลายความสามารถของ ogr2ogr ในการชี้ไปที่รูปร่างไฟล์ ตามที่คุณค้นพบมันเป็นเพียงปัญหาของการอนุญาตของผู้ใช้ เนื่องจากข้อความแสดงข้อผิดพลาดสร้างปลาเฮอริ่งแดงนี่เป็นความเป็นไปได้ที่คนอื่นต้องเก็บไว้ในใจ :)

สิทธิ์ของผู้ใช้ SQL และความล้มเหลวลึกลับ

ฉันจะได้รับนิ่งงันจากข้อผิดพลาดที่สองของคุณสักพัก แต่โดยการทดสอบการใช้ SQL ของคุณด้วยการใช้ประโยชน์ที่แตกต่างกันนำเข้า (shp2pgsql) ซึ่งเป็นสมาร์ทคุณมีข้อผิดพลาดที่แม่นยำมากขึ้นและให้ผู้ใช้ SQL ของคุณสิทธิพิเศษที่จำเป็นในspatial_ref_sysตาราง ดังนั้นใครบางคนที่มีปัญหาในการรับคำแนะนำการนำเข้า ogr2ogr ของตนให้ทำงานอย่างถูกต้องควรตรวจสอบให้แน่ใจว่าผู้ใช้ SQL ของพวกเขามีสิทธิ์เพียงพอทั้งในฐานข้อมูลและตาราง 'spatial_ref_sys'

ประเภทเรขาคณิตผสมและแนวปฏิบัติที่ดีที่สุด

อุปสรรค์สุดท้ายที่คุณพบดูเหมือนว่าเกี่ยวข้องกับความจริงที่ว่ารูปร่างอนุญาตให้ทั้งรูปทรงเรขาคณิตเดียวและหลายส่วนเพื่ออยู่ร่วมกันในชุดข้อมูล / ไฟล์เดียวกัน มันถือว่าเป็นการปฏิบัติที่ไม่ถูกต้องในการผสมประเภทเรขาคณิตในตารางเดียวกันแม้ว่าจะเป็นประเภทเดี่ยว / หลายส่วนของคุณสมบัติเดียวกันและโดยค่าเริ่มต้นผู้เล่นโอเพ่นซอร์สใน toolchain ของคุณจะพยายามปกป้องคุณจากการผสมประเภทเรขาคณิต โชคดีที่พวกมันมีตัวเลือกให้คุณ เริ่มแรกฉันแนะนำให้ตั้งค่า-nlt GEOMETRY*อาร์กิวเมนต์ในคำสั่ง ogr2ogr ของคุณซึ่งอนุญาตให้คุณนำเข้าชุดข้อมูลรูปหลายเหลี่ยมของคุณได้ทั้งๆที่มีการประชุมที่วุ่นวายของ ESRI โปรดทราบว่านี่หมายความว่าคุณอาจมีรูปทรงเรขาคณิตทั้งส่วนเดียวและหลายส่วนในตารางของคุณและอาจสร้างอาการปวดหัวอื่น ๆ สำหรับคุณในภายหลัง!

มันมูลค่าการกล่าวขวัญ ogr2ogr ที่มีอีกตัวเลือกที่คุณควรพิจารณาคือ-nlt PROMOTE_TO_MULTIเพื่ออ้างถึงเอกสาร ..

เริ่มต้นด้วย GDAL 1.10, PROMOTE_TO_MULTI สามารถใช้ในการโปรโมตเลเยอร์ที่ผสมรูปหลายเหลี่ยมหรือหลายรูปแบบเป็นรูปหลายรูปแบบโดยอัตโนมัติ มีประโยชน์เมื่อทำการแปลงไฟล์รูปร่างเป็น PostGIS และไดรเวอร์เป้าหมายอื่น ๆ ที่ใช้การตรวจสอบอย่างเข้มงวดสำหรับประเภทรูปทรงเรขาคณิต

กล่าวอีกนัยหนึ่งถ้าคุณใช้PROMOTE_TO_MULTIแฟล็กฟีเจอร์ทั้งหมดของคุณจะถูกแปลงเป็นฟีเจอร์หลายส่วนแม้ว่าจะประกอบด้วยส่วนเดียวก็ตาม ตามที่บันทึกไว้โดย @LeeHachadoorian ในความคิดเห็น - และฉันแน่ใจว่าส่วนใหญ่จะเห็นด้วย - คุณควรที่จะเลือกธงธงที่PROMOTE_TO_MULTIหลวมGEOMETRYเพราะมันสอดคล้องกับแนวปฏิบัติที่ดีที่สุด โดยพื้นฐานแล้วโค้ดใด ๆ ที่คุณเขียนควรคาดหวังว่ารูปทรงหลายส่วน เป็นที่ยอมรับว่าสามารถทำความสะอาดและทำให้การพัฒนาง่ายขึ้น

คำแนะนำทั่วไปสำหรับผู้ที่มีปัญหากับการนำเข้า SHP เพื่อ POST

  1. ตรวจสอบให้แน่ใจว่าเส้นทางของคุณไม่มีตัวละครขี้ขลาดในตัวพวกเขาและไม่มีการพิมพ์ผิดหรือการสะกดผิดทั้งในเส้นทางหรือชื่อไฟล์
  2. ตามที่ @ user1919 ค้นพบตรวจสอบให้แน่ใจว่าผู้ใช้ระบบปฏิบัติการของคุณมีสิทธิ์เพียงพอในการเข้าถึง shapefile! ดังที่พวกเขาสาธิตมันสามารถช่วยในการลองเปิด shapefile ในซอฟต์แวร์อื่นเช่น QGIS - ถ้ามันทำงานในซอฟต์แวร์หนึ่งแล้วก็ไม่เสียหายและควรทำงานในซอฟต์แวร์อื่น

ในตอนแรกพิจารณาดำเนินการคำสั่ง ogr2ogr ของคุณsudoเกี่ยวกับปัญหาการอนุญาตให้ออกกฎจนกระทั่งหลังจากคุณทราบว่าสคริปต์ของคุณทำงานได้ตามที่ต้องการ

  1. เช่นเดียวกับที่ @ user1919 รับรู้ให้แน่ใจว่าผู้ใช้ SQL ของคุณมีสิทธิ์เพียงพอทั้งในฐานข้อมูลที่กำหนดเป้าหมายโดยสคริปต์ของคุณเช่นเดียวกับspatial_ref_sysตาราง

ในตอนแรกให้ลองใช้ผู้ใช้ระดับสูง PostGRESql ที่นี่เพื่อตัดปัญหาเรื่องสิทธิ์ใช้งาน SQL จนกว่าสคริปต์ของคุณจะทำงาน หากสคริปต์ของคุณทำงานกับ superuser แล้วล้มเหลวด้วยผู้ใช้ระบบอัตโนมัติที่ต้องการคุณรู้ว่าปัญหาเกี่ยวข้องกับผู้ใช้ SQL ไม่ใช่ข้อมูลหรือสภาพแวดล้อมของคุณ (การติดตั้ง gdal / ogr เป็นต้น)

  1. ลองตั้งค่า-nltธงอย่างใดอย่างหนึ่งหรือPROMOTE_TO_MULTI GEOMETRYเนื่องจาก shapefiles อนุญาตให้มีการประชุมประเภทคุณลักษณะที่คลายบางครั้งคุณต้องสั่งให้ยูทิลิตี้โอเพนซอร์สของคุณรองรับได้มากขึ้น :)

  2. หากคุณกำลังนำเข้าสู่ PostGRESql หรือ MySQL ลองตั้งค่า-lco PRECISION=no.. คำเตือนฉันไม่เข้าใจว่าอาร์กิวเมนต์นี้ทำอะไร แต่นี่คือสิ่งที่ฉันเคยมีประสบการณ์ .. อย่างที่คุณรู้รูปร่างมักจะรวมถึงSHAPE_LENGTHและSHAPE_AREAเขตข้อมูลและฉัน ฉันสังเกตเห็นบางครั้งเมื่อฉันประสบความล้มเหลวของความลึกลับหากฉันลบเขตข้อมูลเหล่านั้นฉันจะได้รับข้อมูลที่จะนำเข้าอย่างถูกต้อง อย่างไรก็ตามหากฉันใช้-lco PRECISION=noฉันสามารถรับข้อมูลที่จะนำเข้าได้โดยไม่ต้องลบฟิลด์เหล่านั้น คำแนะนำของฉันคือใช้พารามิเตอร์นี้เป็นขั้นตอนการแก้ไขปัญหา แต่เพื่อทำความเข้าใจว่าปัญหาใดที่แก้ไขได้จริงก่อนที่คุณจะยอมรับการนำเข้าในโซลูชันการผลิต

  3. ท้ายที่สุดถ้าคุณใช้ MySQL ระวังว่ารูปทรงที่มีขนาดใหญ่มากบางตัวอาจทำให้max_allowed_packetพารามิเตอร์ของ MySQL ผิดไป คุณสามารถอ่านเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ในเอกสารประกอบสำหรับไดรเวอร์ MySQLแต่วิธีแก้ไขคือการเปลี่ยนการตั้งค่า MySQL ของคุณเพื่อให้มีขนาดใหญ่กว่าค่าเริ่มต้น

ตัวอย่าง SHP ไปยังคำสั่งการนำเข้า PostGIS สำหรับ ogr2ogr

เพื่อประโยชน์ของมือใหม่ที่อาจเดินผ่านที่นี่นี่คือสิ่งที่ SHP ของฉันส่วนใหญ่จะโพสต์การนำเข้าดูเหมือนว่าใช้ ogr2ogr โปรดสังเกตว่าฉันใส่พา ธ / ชื่อไฟล์ไว้ในเครื่องหมายคำพูดสิ่งนี้จะช่วยป้องกันช่องว่างอักขระแปลก ๆ และการแบ่งบรรทัดข้ามเทอร์มินัล .. และฉันได้รวมอาร์กิวเมนต์ส่วนใหญ่ที่กล่าวถึงข้างต้นไว้แล้วนอกเหนือจากการแทนที่ฟิลด์ชื่อเรขาคณิต ฟิลด์ FID และชื่อเลเยอร์:

ogr2ogr -f "PostgreSQL" "PG:host=127.0.0.1 user=myuser dbname=mydb password=mypassw0rd" "C:/path/to/some_shapefile.shp" -lco GEOMETRY_NAME=the_geom -lco FID=gid -lco PRECISION=no -nlt PROMOTE_TO_MULTI -nln new_layername -overwrite


3
เรื่อง-nlt PROMOTE_TO_MULTIนี้เป็นแนวปฏิบัติที่ดีที่สุดสำหรับรูปหลายเหลี่ยม ฉันขอแนะนำให้เปลี่ยนคำตอบของคุณเพื่อแนะนำว่านี่เป็นตัวเลือกเริ่มต้นที่ดีเท่านั้นที่จะถูกละเมิดหลังจากพิจารณาอย่างถี่ถ้วน ฉันยังขอแนะนำอย่างยิ่งให้ไม่ใช้geometryประเภททั่วไปในการจัดการรูปหลายเหลี่ยมหลายรูปแบบ / รูปหลายเหลี่ยมแบบผสมยกเว้นว่าผู้ใช้ / นักพัฒนารู้จริงๆว่าพวกเขากำลังทำอะไรอยู่และจำเป็นต้องผสมรูปหลายเหลี่ยมรูปแบบเส้นและจุด
Lee Hachadoorian

1
@ LeeHachadoorian เห็นด้วย ฉันแก้ไขคำตอบตามที่แนะนำ ในการป้องกันของฉันPROMOTE_TO_MULTIใหม่พอ (GDAL 1.10) ที่ฉันยังคงเริ่มต้นกับโซลูชันเดิมที่พร้อมใช้งานเมื่อฉันเริ่มต้นทั้งหมด :) .. ในความเป็นธรรมทุกอย่าง แต่ shapefile จะรวมประเภทเดียวและหลายส่วนเท่านั้นดังนั้นจะไม่มีสถานการณ์ใดที่ ogr2ogr จะผลัก shp ให้ผ่าน-nlt GEOMETRYและสร้างตารางที่มีจุดเส้นและ polys :)))) อย่างไรก็ตามฉันเห็นด้วยกับตำแหน่งของคุณในเรื่องนี้อย่างสมบูรณ์
elrobis

1
Shapefiles อนุญาตรูปหลายเหลี่ยมหลายรูปแบบในรูปหลายเหลี่ยม พวกเขาไม่มีประเภท MultiPolygon ดังนั้นแม้เพียงแค่พบไฟล์รูปร่างชนิดนี้เราก็ต้องใช้-nlt PROMOTE_TO_MULTIเพื่อทำให้งานนี้สำเร็จ
CMCDragonkai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.