จะแก้ไขข้อมูลคุณลักษณะได้อย่างง่ายดายโดยใช้นิพจน์ปกติได้อย่างไร


30

ฉันกำลังเขียนบทช่วยสอนสำหรับนักเรียน MSc ที่ใช้ QGIS หนึ่งในภารกิจที่ต้องมีการแก้ไขข้อมูลคุณลักษณะ (ดูร่าง PDF ของการสอนที่นี่หากสนใจ)

คำถามคือจะให้พวกเขาแก้ไขข้อมูลคุณลักษณะได้อย่างไร ฉันรู้ว่าคำถามนี้ได้รับการถามมาก่อนและคำตอบที่ใช้ง่าย: เพียงแค่ใช้ LibreOffice calc เพื่อแก้ไขและบันทึกจากนั้นตรวจสอบให้แน่ใจว่าลำดับแถวและชื่อคอลัมน์ยังคงเหมือนเดิม ฉันใช้วิธีนี้มาก่อนเพื่อให้ได้ผลที่ดีเยี่ยม

น่าเสียดายที่โซลูชันไม่สามารถใช้งานได้อีกต่อไป: บันทึกไฟล์. dbf ใน LibreOffice (5.4.2) หรือ OpenOffice (3.4.1) Calc คำนวณข้อมูลจากมุมมองของ QGIS (เฉพาะตัวเลขจำนวนเต็มแบบสุ่มปรากฏในตารางแอตทริบิวต์) และ สร้างไฟล์. dbt เพิ่มเติมแทน

เพื่อให้ได้คำถาม: ฉันจะบอกชั้นเรียนของนักเรียนปริญญาโทให้ทำสิ่งนี้ในสัปดาห์หน้าได้อย่างไร ฉันพิจารณาตัวเลือกต่อไปนี้:

  1. ใช้ R แทน (เหมาะสำหรับฉัน แต่น่ากลัวสำหรับนักเรียน)
  2. แก้ไขไฟล์เป็น. csv จากนั้นเข้าร่วมตามการประทับเวลา (ละเอียด แต่ดูเหมือนซับซ้อนเกินไปและสามารถแนะนำข้อผิดพลาดเพิ่มเติมได้ในทางปฏิบัติ 2 ชั่วโมง)
  3. ใช้โปรแกรมทางเลือก: ฉันลองใช้ Gnumeric และ Excel ไม่ได้สร้างผลลัพธ์ที่ดีอย่างรวดเร็ว

เพื่อช่วยตอบคำถามนี้ฉันได้สร้างตัวอย่างที่จำลองได้ เปิดไฟล์ "points.shp" ใน QGIS สังเกตตารางคุณลักษณะแล้วปิด แก้ไขสองสามเซลล์ในตารางแอตทริบิวต์ "points.dbf" ใน LibreOffice - บันทึก เปิด "points.shp" อีกครั้งใน QGIS และสังเกตตารางแอตทริบิวต์ที่มีสัญญาณรบกวน ไฟล์รูปร่างอื่น ๆ ในโฟลเดอร์. zip ได้รับความเสียหายโดย LibreOffice และ OpenOffice เพื่อแสดงให้เห็นว่าปัญหามีลักษณะอย่างไรสำหรับฉัน

กล่าวโดยย่อฉันจะแก้ปัญหานี้ได้ดีที่สุดอย่างไร


2
ยินดีต้อนรับสู่เว็บไซต์นี้ฉันอยากจะบอกว่านี่เป็นคำถามที่ถามกันมากและหวังว่าเราจะได้คำตอบที่ดี ผมถือว่าบิตของงูหลามจะออกจากคำถามสำหรับนักเรียนเหล่านี้เป็นวิธีการที่ฉันจะเข้าถึงปัญหานี้ในกรณีแรก ...
sgrieve

13
การแก้ไขส่วน. DBF โดยตรงของ shapefile นั้นอันตรายเกินไปที่จะแนะนำให้ใช้เป็นประจำและไม่ควรใช้โดยผู้เริ่มใช้เลย - อย่างน้อยก็ไม่ใช่ถ้ามีใครสนใจข้อมูล อย่างไรก็ตามมีวิธีการแก้ปัญหาที่น่าเชื่อถือมากกว่าในลักษณะที่คล้ายกัน: รักษาฟิลด์ตัวระบุที่ไม่ซ้ำกันใน shapefile ไม่ต้องแก้ไข ให้เก็บแอตทริบิวต์ไว้ในตารางที่เกี่ยวข้องแทน (ในรูปแบบใด ๆ ที่ GIS ของคุณสามารถอ่านได้) เข้าร่วมในตัวระบุเดียวกัน ในตอนนี้คุณสามารถแก้ไขตารางคุณลักษณะได้อย่างอิสระโดยไม่สูญเสียการเชื่อมต่อระหว่างรูปร่างและคุณลักษณะ - ตราบใดที่คุณป้องกันฟิลด์ตัวระบุ
whuber

1
Python แก้ปัญหาได้ดีตราบใดที่ใช้งานและเข้าใจได้ง่าย ... เกี่ยวกับการรักษาหมายเลขตัวบ่งชี้นั้นเป็นตัวเลือกที่ดี - (ตัวเลือก 2 ในคำถามของฉัน) และอาจเป็นคำตอบเริ่มต้นของฉัน อย่างไรก็ตามหวังว่าจะเป็น "การแก้ไขด่วน" ที่ง่ายกว่าซึ่งไม่เกี่ยวข้องกับไฟล์เพิ่มเติม (5 ไฟล์ต่อไฟล์ค่อนข้างเพียงพอสำหรับ IMO!)
RobinLovelace

3
คุณหมายถึงอะไร 5 ต่อไฟล์รูปร่าง? ลอง 9! :-) (ไฟล์ดัชนีสามารถสะสมขึ้นอยู่กับว่ามีการใช้ GIS ใด) เมื่อคุณต้องการไฟล์ที่เกี่ยวข้องมากกว่าหนึ่งไฟล์เพื่อรักษาชุดข้อมูล - และ Shapefiles ต้องการอย่างน้อยสาม - มันไม่มีปัญหาใด ๆ โยนในไฟล์เพิ่มเติม เพิ่มไฟล์ข้อมูลเมตาเช่นกันในขณะที่คุณอยู่ที่นั่น :-) และเมื่อคุณตั้งค่าการเข้าร่วมแล้วจะไม่เกิดขึ้นโดยอัตโนมัติหรือไม่ (ฉันไม่เห็นว่าสามารถใช้การประทับเวลาสำหรับการเข้าร่วมได้อย่างไรซึ่งจะใช้แทนระบบควบคุมเวอร์ชันแทน)
whuber

3
หากคุณมีความชอบใด ๆ ที่จะแนะนำให้รู้จักกับฐานข้อมูล spatiaLite มี GUI สำหรับการแก้ไขฟิลด์และเครื่องมือบรรทัดคำสั่งสำหรับข้อมูล OSM จากนั้นคุณสามารถเกี่ยวข้องกับ SQL เพียงเล็กน้อยและนักเรียนของคุณอาจจะก้าวไปข้างหน้าของเส้นโค้ง
Scro

คำตอบ:


18

คำตอบที่ง่ายที่สุดที่ฉันได้พบตามคำแนะนำของ Ryan Garnett เพื่อทำภายใน QGIS:

ใช้ regexp_replace

ความสามารถนี้ถูกเพิ่มไปยังเครื่องคำนวณภาคสนามเมื่อ 1 ปีที่แล้วโดยJürgen Fischer (ดังที่แสดงในรายงานข้อผิดพลาดนี้ ) ฉันพยายามหาวิธีทำสิ่งนี้มาระยะหนึ่ง แต่ไม่สามารถค้นหา "qgis regex" และคำที่คลุมเครืออื่น ๆ ได้

ฟังก์ชั่นการใช้งานของมันน่าจะเป็นตัวอย่างที่ดีที่สุดโดยความต้องการสร้างมาตรฐานให้กับค่าทั้งหมดในคอลัมน์ "ชื่อ" ตัวอย่างเช่นหากเราจำเป็นต้องแทนที่เซลล์ทั้งหมดที่มีรูปแบบ "Tesc" ด้วย 'เทสโก้' การลบข้อมูลที่ไม่จำเป็นเช่น "เทสโก้ถนน Infirmary" (ผู้สนับสนุน OSM ที่เพิ่มบ่อย ๆ ) สามารถใช้ฟังก์ชันต่อไปนี้:

regexp_replace ("ชื่อ", 'Tesc. *', 'เทสโก้')

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

ฉันเดาว่านี่เป็นฟังก์ชั่นการแสดงออกปกติของไพ ธ อนเพราะมันแตกต่างจาก grep เล็กน้อยซึ่งฉันเคยใช้มาก่อน

ฉันคิดว่าเอกสารเพิ่มเติม (รายละเอียดเกี่ยวกับเว็บไซต์ QGISจำกัด เพียงไม่กี่คำ) เป็นสิ่งจำเป็นในการทำงานดังนั้นฉันจึงได้ทำบุ๊กมาร์กหน้าต่อไปนี้ไว้ใช้อ้างอิงในอนาคต:

วิธีแก้ปัญหานี้มีข้อดีสองประการ:

  1. เรียบง่าย: ไม่จำเป็นต้องใช้โปรแกรมเพิ่มเติมหรือส่วนเสริมใด ๆ
  2. แนะนำให้นักเรียนรู้จักพลังของการแสดงออกปกติโดยใช้ฟังก์ชั่น (Pythonic?) (ข้อความที่เป็นตัวแทนของ '' 'คำเตือน: "หรือไม่มีสัญลักษณ์ล้มเหลว) และฟังก์ชั่นบรรทัดคำสั่ง

ขอโทษที่ตอบคำถามของฉันเองและขอบคุณผู้อื่นที่ให้คำแนะนำฉันไปสู่แสงสว่าง! ฉันหวังว่ากระทู้คำถามนี้จะเป็นประโยชน์ต่อการศึกษาแก่ผู้อื่นที่ประสบปัญหาคล้ายกัน


3
ไม่ต้องกังวลการตอบคำถามของคุณเองไม่ใช่ปัญหา
underdark

ฉันดีใจที่คุณพบบางสิ่งที่จะช่วยคุณ ขอบคุณสำหรับการแบ่งปันฉันรู้ว่าฉันจะใช้สิ่งนี้
Ryan Garnett

1
ฉันถาม QGIS devs เป็น Qt regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect

9

นี่อาจเป็นคำตอบที่โง่เง่าเพราะอาจเป็นวัตถุประสงค์การเรียนรู้สำหรับนักเรียนที่จบ แต่มีเหตุผลที่คุณไม่แก้ไขคุณลักษณะใน QGIS ด้วยการใช้เครื่องคำนวณภาคสนามหรือไม่? ในเวอร์ชันก่อนหน้าของคุณลักษณะการแก้ไข QGIS (ก่อนหน้า 1.7) ภายใน QGIS โดยตรงไม่สามารถทำได้; ดังนั้นความจำเป็นในการแก้ไขไฟล์. DBF ใน OpenOffice เป็นต้น

ตั้งแต่ 1.7 และ 1.8 คุณสามารถแก้ไขข้อมูลแอตทริบิวต์ได้โดยตรงใน Field Calculator พร้อมความสามารถในการแสดงนิพจน์แบบมีเงื่อนไข นอกจากนี้ยังมีปลั๊กอินแอททริบิว Python ที่มีอยู่ซึ่งสามารถให้ตัวเลือกเพิ่มเติมสำหรับการแก้ไขแอททริบิวต์ นี่อาจเป็นวิธีแก้ปัญหาและหรือตัวเลือกสำหรับการสอนของคุณ

ในฐานะนักศึกษาปริญญาโทคนก่อนและตอนนี้เป็นพนักงานมหาวิทยาลัยฉันเข้าใจปัญหานี้ข้อกำหนดก่อนหน้านี้เพื่อดำเนินการนอกเหนือจาก QGIS และตอนนี้ขอขอบคุณความสามารถในการแก้ไขคุณลักษณะทั้งหมดภายใน QGIS ฉันยินดีที่จะช่วยเหลือคุณในเรื่องนี้มากกว่านี้หากคุณต้องการ


1
สวัสดีไรอันใช่ว่าจะเป็นทางออกที่ดี มันเป็นความสามารถในการค้นหาและแทนที่ข้อความในตารางแอตทริบิวต์เพื่อสร้างมาตรฐานชื่อ OSM ที่ยุ่งเหยิงซึ่งผลักดันให้ฉันลองแก้ไขไฟล์. dbf โดยตรง ฉันต้องการแก้ไขภายใน QGIS จะลองใช้ปลั๊กอิน Python แอตทริบิวต์ - อาจเป็นวิธีแก้ปัญหาความคิด ควรทำให้ความจริงฉันกำลังมองหาการค้นหา / แทนที่ความสามารถ regex ชัดเจนในคำถาม
RobinLovelace

@ user1694378 คุณยังสามารถชี้แจงคำถามของคุณได้
underdark

ขอบคุณ underdark ที่ผลักดันให้ฉันทำอย่างนั้นดีกว่าสะท้อนให้เห็นถึงสิ่งที่ฉันอยากทำจริง ๆ
RobinLovelace

3

คุณสามารถใช้ฐาน LibreOffice ของการปรับเปลี่ยนไฟล์

  1. เปิดฐาน (รับเมนูหลัก)
  2. เลือก "เชื่อมต่อกับฐานข้อมูลที่มีอยู่" และเลือกประเภท "dBASE"
  3. เลือกโฟลเดอร์ที่มีไฟล์ dbf ของคุณ
  4. เลือกตัวเลือกสุดท้ายตามต้องการและ "เสร็จสิ้น"
  5. ตั้งชื่อไฟล์การเชื่อมต่อฐานข้อมูลของคุณตามที่คุณต้องการ (เช่น "MyxBasefiles.odb) และบันทึกไว้ที่ใดที่หนึ่งจากนั้นให้เข้าถึงไฟล์ฐานข้อมูลของคุณโดยคลิกที่ไฟล์นี้ ooOoo, Nice
  6. เลือก "ตาราง" ที่แผงด้านซ้ายและมีไฟล์ข้อมูลของคุณ (เรียกว่า "ตาราง") ยุ่งกับพวกเขา

ตอนนี้คุณสามารถเริ่มแก้ไขได้ หวังว่ามันจะดีพอสำหรับวัตถุประสงค์ของคุณ

คุณยังสามารถลองDBF Explorer ได้แม้ว่าจะเป็น Windows เท่านั้น มันมีการค้นหาและแทนที่

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


1
สวัสดี RK ขอบคุณสำหรับคำตอบที่ปรากฏ: น่าจะเป็นวิธีที่เชื่อถือได้และปลอดภัยในการแก้ไขไฟล์. dbf ฉันแค่ลองสิ่งที่คุณพูดและฉันยินดีที่จะบอกว่ามันใช้งานได้
RobinLovelace

ดีแล้วที่รู้. บทเรียนที่ดีที่คุณมี :)
RK

แต่ ... ฉันแค่ลองทำในสิ่งที่คุณพูดและฉันยินดีที่จะบอกว่ามันใช้ได้กับเซลล์แต่ละเซลล์ น่าเสียดายที่ไม่ใช่โซลูชัน 100% สำหรับแอปพลิเคชันนี้โดยเฉพาะเนื่องจากปรากฏว่า OOBase ไม่มีฟังก์ชันแทนที่การค้นหาที่จำเป็นสำหรับการสอนเนื่องจาก [ข้อบกพร่อง] ( lists.freedesktop.org/archives/libreoffice-bugs/2010 - ธันวาคม / … ) ทำงานแน่นอนในแต่ละเซลล์แม้ว่า: ทดสอบ นั่นคือโซลูชัน 90% สำหรับการแก้ไขแบบเซลล์ต่อเซลล์ยกเว้นว่าฉันพลาดฟังก์ชั่นการค้นหาแบบแทนที่ แนวคิดใดบ้างที่จะแทนที่รายการ "Tesc. *" ทั้งหมดด้วย "Tesco"
RobinLovelace

ลิงก์ที่ดีกว่าสำหรับข้อผิดพลาดพื้นฐานของ OO: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace

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