อัปเดตพิกัดบน geopackage ด้วย shapefile

Aug 17 2020

ฉันมีไฟล์ geopackage ที่มีข้อมูลทั้งหมดเกี่ยวกับบางรายการ แต่ต้องอัปเดตพิกัด ฉันใช้ Leica 1200 GPS รุ่นเก่าเพื่อรับพิกัดใหม่และให้ ID เดียวกันกับจุดเหล่านี้ที่มีใน geopackage

วิธีที่ดีที่สุดในการอัปเดตพิกัดใน geopackage คือวิธีใดจากไฟล์รูปร่างที่สร้างโดย GPS โดยรู้ว่า ID จะเหมือนกันฉันใช้ฟังก์ชัน VLOOKUP ของ excel สำหรับสิ่งนี้ แต่อยากทราบว่ามีวิธี เพื่อทำภายใน QGIS

คำตอบ

2 user30184 Aug 18 2020 at 14:08

เป็นไปได้ แต่ไม่ใช่เรื่องเล็กน้อยที่จะทำเช่นนั้นกับ ogr2ogr และ ogrinfo ต้องใส่ shapefile ลงใน GeoPackage ก่อน แต่สามารถลบได้เมื่อมีการอัปเดตรูปทรงแล้ว

แหล่งข้อมูล

jointest1 มี 2 จุด

  ID (Integer) = 11
  POINT (77 33)

  ID (Integer) = 22
  POINT (15 35)

jointest2 ยังมีสองจุด

  ID (Integer) = 22
  POINT (5 25)

  ID (Integer) = 0
  POINT (3 2)

จุดมุ่งหมายคือการอัปเดตคุณลักษณะ 22 -> POINT (5 25) และคงคุณลักษณะ 11 ไว้เป็น POINT (77 33) ไม่ควรเพิ่มคุณลักษณะที่มี ID = 0 ที่ไม่มีใน jointest1

Layer jointest1 อยู่ใน GeoPackage "jointest.gpkg" และ jointest2 คือ shapefile นำเข้าครั้งแรก jointest2 ไปยัง GeoPackage

ogr2ogr -append -update -f gpkg jointest.gpkg jointest2.shp

ถัดไปใช้ ogrinfo กับพารามิเตอร์ -sql สำหรับรันคำสั่งอัพเดต ไวยากรณ์สำหรับคำสั่งนำมาจากhttps://stackoverflow.com/questions/19270259/update-with-join-in-sqlite.

ogrinfo -sql "update jointest1 set geom=(select geom from jointest2 where ID=jointest1.ID) where exists (select geom from jointest2 where ID=jointest1.ID)" jointest.gpkg 

ตรวจสอบสิ่งที่เรามีในตอนนี้ใน jointest1

ogrinfo jointest.gpkg jointest1
…
  ID (Integer) = 11
  POINT (77 33)

  ID (Integer) = 22
  POINT (5 25)

ตอนนี้เราสามารถวางตาราง jointest2 และดูดฐานข้อมูลได้ หากคุณเพิ่งวางตารางจากฐานข้อมูล SQLite ขนาดไฟล์จะยังคงเท่าเดิมจนกว่าคุณจะดูดฐานข้อมูล ไม่เป็นอันตรายหากคุณไม่ดูดฝุ่นคุณก็จะมีไฟล์ฐานข้อมูลที่ใหญ่ขึ้นเล็กน้อยในดิสก์

ogrinfo jointest.gpkg -sql "drop table jointest2"
ogrinfo jointest.gpkg -sql "vacuum" 
bugmenot123 Aug 17 2020 at 16:04

การอัปเดตพิกัดเป็นเรื่องยากและอาจต้องใช้การเล่นซอขั้นสูง ฉันอยากจะแนะนำแทน:

  • เปิดทั้งสองไฟล์ใน QGIS
  • เข้าร่วมแอตทริบิวต์จากเลเยอร์ GeoPackage ไปยังเลเยอร์ Shapefile โดยใช้ ID
  • บันทึกเลเยอร์นั้นเป็น GeoPackage ใหม่

ด้วยวิธีนี้คุณไม่ต้องสัมผัสกับการประมวลผลรูปทรงเรขาคณิต แต่มีเพียงข้อมูลแอตทริบิวต์ซึ่งเป็นวิธีที่ง่ายกว่า