Có một cách nhanh chóng để xóa tất cả các thuộc tính từ một lớp nhưng để lại các đa giác tại chỗ?


9

Tôi có một lớp Shapefile trong QGIS 2.6 với một số đa giác, mỗi đa giác có dữ liệu trong hơn 100 trường. Tôi cần tạo một lớp mới với tất cả các đa giác giống nhau, nhưng với tất cả các trường dữ liệu của chúng trống (được đặt thành 0, Null hoặc trống tùy thuộc vào loại trường). Có cách nào nhanh hơn để làm điều này hơn là nhấn xóa trên mỗi trường của mỗi đa giác một lần, tôi sẽ phải làm điều này hơn 1000 lần theo cách này.


1
Vui lòng chỉnh sửa câu hỏi để bao gồm phiên bản phần mềm GIS và định dạng dữ liệu (ví dụ: shapefile, FGDB, PostGIS, ..)
Vince

Câu trả lời:


3

Bạn không thể sao chép và dán dữ liệu của mình vào Lớp X (lớp / shapefile / lớp tính năng / bất cứ thứ gì) không có thuộc tính (ngoài OID và Hình học), sau đó sao chép và dán lại hình học "trống" hiện tại vào lớp ban đầu của bạn?


6

Bạn có thể nhập mã sau vào Bảng điều khiển Python để xóa TẤT CẢ các thuộc tính NULLcho một shapefile được tải vào QGIS. Chọn lớp từ bảng điều khiển lớp (Mục lục) và chạy mã:

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()        

Điều này đã được thử nghiệm trên QGIS 2.8.2.


CẬP NHẬT :

Để đối phó với những nhận xét của @Vince, mã sau đây có thể được sao chép trực tiếp / dán vào Python console và sẽ thay đổi các giá trị của các thuộc tính tùy thuộc vào loại của lĩnh vực (ví dụ 0cho số nguyên lĩnh vực; NULLcho chuỗi các lĩnh vực; và một kỷ nguyên của 1900-01-01cho một trường ngày ):

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
Bạn có thể điều chỉnh logic để gán 0 cho số, trống / NULL cho chuỗi và epoch cho ngày không?
Vince

@Vince - Cảm ơn bạn thân, tôi chắc chắn có thể cố gắng vì tôi không phải là chuyên gia trong vấn đề này :)
Joseph

@Vince - Cảm ơn bạn một lần nữa vì đã đề cập đến tinh chỉnh, tôi tình cờ tìm hiểu thêm về python =)
Joseph

1
Tôi đoán tuổi của tôi cho thấy khi tôi nghĩ về một kỷ nguyên của ngày 1 tháng 1 năm 1970 hoặc 1900 chứ không phải năm 2000;)
Vince

3

Bạn chỉ có thể lưu nó dưới dạng tệp mới và đánh dấu vào ô "Bỏ qua việc tạo thuộc tính" trong hộp thoại "Lưu dưới dạng ...". Nó làm chính xác những gì nó nói.

Sẽ có một cột bộ đếm số có tên FID, rõ ràng định dạng Shapefile yêu cầu ít nhất một thuộc tính? Nếu bạn có thể, sử dụng một cái gì đó tốt hơn, spatialite hoặc geopackage.


+1, bạn đúng vì phải có ít nhất một thuộc tính. Nhưng đây là một phương pháp rất hay và đơn giản vì bạn có thể chạy Máy tính Trường và thay thế tất cả các giá trị của FID thành NULL.
Joseph

1
Hành vi của QGIS có vẻ kỳ lạ. Cột FID có thể chỉnh sửa và nó không phải là ánh xạ thực tế giữa hình học và thuộc tính. Nếu bạn xóa cột, bạn sẽ nhận được một tên "id tính năng" không thể chỉnh sửa. Đó phải là kết quả đầu tiên rồi. VÒI 2.10. Tôi sẽ nộp một lỗi sau.
bugmenot123

2

Mở tệp .dbf bằng openoffice hoặc các tệp khác và xóa dữ liệu.
Bạn có thể sử dụng python để lặp qua các tệp và xóa tất cả trừ các tiêu đề Xem mô-đun python dbf


1
Sử dụng các công cụ không biết shapefile trên thành phần tệp dBase có thể gây ra tham nhũng shapefile. Nếu mục đích là để điền vào chỗ trống và số không, "xóa" dữ liệu sẽ chỉ tạo ra tệp dBase có ít bản ghi hơn .shp / .shx.
Vince

Thật vậy, nhưng chúng tôi chỉ đơn giản là xóa dữ liệu, không có rủi ro.
julsbreakdown 29/07/2015

Không, nhiệm vụ là bảo tồn đa giác và xóa các thuộc tính tương ứng, vì vậy rủi ro là rất cao. Bất kỳ câu trả lời nào không cảnh báo về tham nhũng tiềm năng đều không đủ nghiêm trọng.
Vince

Tôi nhận ra nó là một cách khó, tức là không phải là một cách thông thường nhưng nó hoạt động. Rõ ràng, rất mong được giữ một bản sao lưu dữ liệu gốc.
Leehan 29/07/2015

Trong trường hợp đặc biệt này, rủi ro không quá lớn vì tất cả các thuộc tính trong tất cả các trường đều được khởi tạo. Do đó, nếu thứ tự các bản ghi thay đổi trong tệp dbf, nó sẽ vẫn không gây ra bất kỳ sự lộn xộn nào vì tất cả các bản ghi có cùng dữ liệu trong các thuộc tính. Người dùng vẫn phải lưu ý rằng số lượng tính năng trong .dbf giống như trong .shp. Tuy nhiên, như @Vince đã viết, người dùng nên được cảnh báo rằng a) thay đổi thứ tự các hàng của b) số lượng hàng trong .dbf thường dẫn đến một shapefile bị hỏng và không sử dụng được.
dùng49584

2

QGIS có thể mở các tệp hình dạng mà không cần .dbf.

Vì vậy, bạn chỉ có thể xóa thành phần .dbf và tải trong .shp, sẽ chỉ mang lại hình học.


Đó là một mẹo hay mặc dù cá nhân tôi đã kiềm chế bản thân mình để không xóa bất kỳ tập tin liên quan nào :)
Joseph

1
Có, đổi tên có thể là một lựa chọn an toàn hơn.
HeikkiVesanto

2

Có lẽ bạn có thể chỉnh sửa tệp * .dbf bằng Excel.

Sau đó, bạn xóa tất cả các trường trừ geom một.

Cuối cùng lưu và thoát.

Sẽ rất hữu ích khi giữ một kho lưu trữ của * .shp trước khi làm điều này.


Ý nghĩa dường như là giữ nguyên lược đồ để chỉ các giá trị của các thuộc tính được đặt thành một số giá trị mặc định. Và bạn không thể lưu vào định dạng dbf bằng Excel.
dùng49584

2
Trường hình học không tồn tại trong thành phần dBase của shapefile.
Vince

ngay không có trường wkt khi chỉnh sửa dbf bằng excel.
Leehan 29/07/2015

Trường FID liên kết các hàng trong .dbf với hình học, được lưu trữ trong .shp. Thực sự, .dbf không liên quan gì đến hình học. vi.wikipedia.org/wiki/Shapefile
mr.adam 29/07/2015

1

Trong QGIS 2.8.x, bạn cũng có thể thoát khỏi các trường cụ thể hoặc tất cả. Mở bảng thuộc tính, Chuyển đổi chế độ chỉnh sửa, Nhấp vào nút "Xóa cột", Chọn tất cả các thuộc tính không mong muốn của bạn và Nhấp vào "OK". Lưu các chỉnh sửa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.