มีวิธีที่รวดเร็วเพื่อล้างคุณสมบัติทั้งหมดจากเลเยอร์ แต่ปล่อยให้รูปหลายเหลี่ยมอยู่ในสถานที่หรือไม่?


9

ฉันมีเลเยอร์ Shapefile ใน QGIS 2.6 ที่มีรูปหลายเหลี่ยมหลายรูปแต่ละอันมีข้อมูลในกว่า 100 ฟิลด์ ฉันต้องการสร้างเลเยอร์ใหม่ที่มีรูปหลายเหลี่ยมเดียวกันทั้งหมด แต่มีเขตข้อมูลทั้งหมดของพวกเขาว่างเปล่า (ตั้งค่าเป็น 0, ว่างเปล่าหรือว่างเปล่าขึ้นอยู่กับชนิดของเขตข้อมูล) มีวิธีที่รวดเร็วกว่าการกดลบในแต่ละเขตข้อมูลของรูปหลายเหลี่ยมในแต่ละครั้งฉันจะต้องทำมากกว่า 1,000 ครั้งด้วยวิธีนี้


1
โปรดแก้ไขคำถามเพื่อรวมรุ่นซอฟต์แวร์ GIS และรูปแบบข้อมูล (เช่น shapefile, FGDB, PostGIS, .. )
Vince

คำตอบ:


3

คุณไม่สามารถคัดลอกและวางข้อมูลของคุณลงในเลเยอร์ X (เลเยอร์ / รูปร่างไฟล์ / คุณสมบัติคลาส / อะไรก็ตาม) ที่ไม่มีแอททริบิวต์ (นอกเหนือจาก OID และเรขาคณิต) แล้วคัดลอกและวางเรขาคณิต "ว่าง" ตอนนี้ เป็นเลเยอร์ดั้งเดิมของคุณหรือไม่


6

คุณสามารถป้อนรหัสต่อไปนี้ใน Python Console เพื่อล้างคุณสมบัติทั้งหมดNULLสำหรับสำหรับ shapefile ที่โหลดลงใน QGIS เลือกเลเยอร์จากแผงเลเยอร์ (สารบัญ) และเรียกใช้รหัส:

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()   
for field in layer.dataProvider().attributeIndexes():   
    for feature in layer.getFeatures(): 
        layer.changeAttributeValue(feature.id(), field, NULL)    

layer.commitChanges()        

สิ่งนี้ได้รับการทดสอบบน QGIS 2.8.2


อัปเดต :

ในการตอบสนองต่อความคิดเห็นโดย @Vince รหัสต่อไปนี้สามารถคัดลอก / วางโดยตรงในคอนโซล Python และจะเปลี่ยนค่าของคุณสมบัติขึ้นอยู่กับประเภทของเขตข้อมูล (เช่น0สำหรับเขตข้อมูลจำนวนเต็มNULLสำหรับเขตสตริงและยุคของ1900-01-01สำหรับวันฟิลด์)

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()  
for field in layer.pendingFields():
        if field.typeName() == 'Integer':
                name_int = field.name()
                for feature in layer.getFeatures():
                        feature[name_int] = '0'
                        layer.updateFeature(feature)
        if field.typeName() == 'String':
                name_str = field.name()
                for feature in layer.getFeatures():
                        feature[name_str] = NULL
                        layer.updateFeature(feature)
        if field.typeName() == 'Date':
                name_dat = field.name()
                for feature in layer.getFeatures():
                        feature[name_dat] = '1900-01-01'
                        layer.updateFeature(feature)
layer.commitChanges()

1
คุณสามารถปรับแต่งตรรกะเพื่อกำหนดค่าศูนย์ให้เป็นตัวเลข, ว่าง / NULL ให้กับสตริงและยุคถึงวันที่ได้หรือไม่?
วินซ์

@Vince - เพื่อนขอบคุณฉันแน่นอนสามารถลองเป็นฉันผู้เชี่ยวชาญในเรื่องนี้ไม่มี :)
โจเซฟ

@Vince - ขอบคุณอีกครั้งสำหรับการพูดถึงการบิดผมเกิดขึ้นเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ python =)
โจเซฟ

1
ฉันเดาอายุของฉันแสดงเมื่อฉันคิดถึงยุคของ 1 มกราคม 1970 หรือ 1900 ไม่ใช่ 2000;)
Vince

3

คุณสามารถบันทึกเป็นไฟล์ใหม่และทำเครื่องหมายในช่อง "สร้างการข้ามแอตทริบิวต์" ในกล่องโต้ตอบ "บันทึกเป็น ... " มันทำสิ่งที่พูด

จะมีคอลัมน์ตัวนับตัวเลขหนึ่งชื่อ FID ดูเหมือนว่ารูปแบบ Shapefile ต้องการแอตทริบิวต์อย่างน้อยหนึ่งรายการหรือไม่ ถ้าคุณทำได้ให้ใช้อะไรที่ดีกว่า spatialite หรือ geopackage


+1 คุณพูดถูกเพราะต้องมีแอตทริบิวต์อย่างน้อยหนึ่งรายการ แต่นี้เป็นวิธีการที่ดีมากและง่ายที่สุดเท่าที่คุณสามารถเรียกใช้เครื่องคิดเลขฟิลด์และแทนที่ค่าทั้งหมดของ FID NULLไป
โจเซฟ

1
พฤติกรรมของ QGIS ดูแปลก ๆ FID คอลัมน์สามารถแก้ไขได้และไม่ใช่การจับคู่ที่แท้จริงระหว่างเรขาคณิตและแอตทริบิวต์ หากคุณลบคอลัมน์คุณจะได้รับชื่อ "feature id" ซึ่งไม่สามารถแก้ไขได้ นั่นควรจะเป็นผลลัพธ์แรกแล้ว QGIS 2.10 ฉันจะยื่นข้อบกพร่องในภายหลัง
bugmenot123

2

เปิดไฟล์. dbf ด้วย openoffice หรืออื่น ๆ แล้วลบข้อมูล
คุณสามารถใช้ python เพื่อวนลูปไฟล์และลบทั้งหมดยกเว้นส่วนหัว ดูโมดูล dbf python


1
การใช้เครื่องมือ shapefile-ignorant บนคอมโพเนนต์ไฟล์ dBase มีแนวโน้มที่จะทำให้เกิดความเสียหายของ shapefile หากวัตถุประสงค์คือการเติมช่องว่างและเลขศูนย์การ "ลบ" ข้อมูลจะสร้างไฟล์ dBase ที่มีระเบียนน้อยกว่า. shp / .shx
วินซ์

แน่นอน แต่เราเพียงแค่ลบข้อมูลออกไม่มีความเสี่ยงใด ๆ
julsbreakdown

ไม่งานคือการรักษารูปหลายเหลี่ยมและล้างคุณสมบัติที่เกี่ยวข้องดังนั้นความเสี่ยงจึงสูงมาก คำตอบใด ๆ ที่ไม่เตือนถึงความเสียหายที่อาจเกิดขึ้นไม่ได้คำนึงถึงความเสี่ยงอย่างจริงจัง
วินซ์

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

ในกรณีพิเศษนี้ความเสี่ยงนั้นไม่ดีนักเนื่องจากแอตทริบิวต์ทั้งหมดในฟิลด์ทั้งหมดจะถูกเตรียมใช้งาน ดังนั้นหากลำดับของเร็กคอร์ดเปลี่ยนแปลงในไฟล์ dbf มันจะยังไม่เลอะเพราะเร็กคอร์ดทั้งหมดมีข้อมูลเดียวกันในแอ็ตทริบิวต์ ผู้ใช้ยังคงต้องดูแลว่าจำนวนฟีเจอร์ใน. dbf นั้นเหมือนกับใน. shp อย่างไรก็ตามตามที่ @Vince เขียนไว้ผู้ใช้ควรได้รับการเตือนว่า a) การเปลี่ยนลำดับของแถวของ b) จำนวนแถวใน. dbf โดยทั่วไปจะนำไปสู่รูปร่างไฟล์ที่เสียหายและใช้งานไม่ได้
user30184

2

QGIS สามารถเปิดไฟล์รูปร่างโดยไม่ต้อง. dbf

ดังนั้นคุณสามารถลบองค์ประกอบ. dbf และโหลดใน. shp ซึ่งจะนำมาซึ่งรูปทรงเรขาคณิตเท่านั้น


นั่นคือเคล็ดลับที่ดีถึงแม้ว่าผมเองงดเว้นตัวเองที่จะไม่ลบไฟล์ใด ๆ ที่เกี่ยวข้อง :)
โจเซฟ

1
ใช่การเปลี่ยนชื่ออาจเป็นตัวเลือกที่ปลอดภัยกว่า
HeikkiVesanto

2

บางทีคุณสามารถแก้ไขไฟล์ * .dbf ด้วย Excel

จากนั้นคุณลบฟิลด์ทั้งหมดยกเว้น Geom หนึ่ง

ในที่สุดก็บันทึกและออกจาก

มันจะมีประโยชน์ในการเก็บถาวรของ * .shp ก่อนทำสิ่งนี้


ความหมายดูเหมือนว่าจะทำให้ schema ยังคงเหมือนเดิมดังนั้นควรตั้งค่าคุณลักษณะเฉพาะเป็นค่าเริ่มต้นบางอย่างเท่านั้น และคุณไม่สามารถบันทึกลงในรูปแบบ dbf ด้วย Excel
30184

2
ไม่มีฟิลด์เรขาคณิตในองค์ประกอบ dBase ของ shapefile
วินซ์

ไม่มีฟิลด์ wkt เมื่อแก้ไข dbf ด้วย excel
Leehan

เขตข้อมูล FID เชื่อมโยงแถวใน. dbf กับรูปทรงเรขาคณิตซึ่งเก็บไว้ใน. shp จริงๆแล้ว. dbf ไม่เกี่ยวข้องกับรูปทรงเรขาคณิต en.wikipedia.org/wiki/Shapefile
mr.adam

1

ใน QGIS 2.8.x คุณสามารถกำจัดฟิลด์ที่เฉพาะเจาะจงหรือทั้งหมด เปิดตารางแอตทริบิวต์, สลับโหมดแก้ไข, คลิกที่ปุ่ม "ลบคอลัมน์", เลือกแอตทริบิวต์ที่คุณไม่ต้องการแล้วคลิก "ตกลง" บันทึกการแก้ไข

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