Trang chủ QGIS Lập trình PyQGIS cho người không chuyên Bài 9: Tạo và chỉnh sửa một lớp Vectơ

Bài 9: Tạo và chỉnh sửa một lớp Vectơ

- Quảng cáo -

Trong các bài viết trước, chúng ta đã tạo các lớp bằng cách tải các bộ dữ liệu hiện có vào dự án (project). Trong bài viết này, chúng ta sẽ tạo một lớp mới từ đầu.

Để bắt đầu, hãy tạo một đối tượng QssVectorLayer mới cho đối tượng point với tên lớp là “temp” trên bộ nhớ:

vl =QgsVectorLayer("Point", "temp", "memory")

Sau đó, chúng ta có thể thêm một số trường thuộc tính bằng cách sử dụng hàm addAttributes().

from qgis.PyQt.QtCore importQVariant
pr =vl.dataProvider()
pr.addAttributes([QgsField("name", QVariant.String),
QgsField("age",  QVariant.Int),
QgsField("size", QVariant.Double)])
vl.updateFields()

Một mô hình phổ biến trong ví dụ này là “update-after-change”. Khi thực hiện thay đổi đối với dữ liệu lớp, các thay đổi này không được lớp phản ánh tự động. Do đó, chúng ta cần gọi hàm updateFields() sau khi thêm các thuộc tính.

Với lớp được thiết lập, chúng ta có thể thêm một tính năng điểm và thêm lớp vào dự án:

f =QgsFeature()
f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(10,10)))
f.setAttributes(["Ada L.", 2, 0.3])
pr.addFeature(f)
vl.updateExtents()
QgsProject.instance().addMapLayer(vl)

Tương tự như ở trên, ở đây chúng ta cần gọi updateExtents() sau khi thêm các tính năng cho nhà cung cấp dữ liệu. Nếu không, phạm vi lớp sẽ không chính xác.

Bây giờ chúng ta hãy xem một số thống kê lớp:

print("No. fields:", len(pr.fields()))
print("No. features:", pr.featureCount())
e =vl.extent()
print("Extent:", e.xMinimum(), e.yMinimum(), e.xMaximum(), e.yMaximum())

for f invl.getFeatures():
print("Feature:", f.id(), f.attributes(), f.geometry().asPoint())

Điều này sẽ cho kết quả:

No. fields: 3
No. features: 1
Extent: 10.0 10.0 10.0 10.0
Feature: 1 [‘Ada L.’, 2, 0.3] <QgsPointXY: POINT(10 10)>

Hãy chú ý đến sự kết hợp của addAttribution()updateFields().

vl.startEditing()
 
my_field_name = 'new field'
vl.addAttribute(QgsField(my_field_name, QVariant.String))
vl.updateFields()
 
for f in vl.getFeatures():
print("Feature:", f.id(), f.attributes(), f.geometry().asPoint()) 

Điều này sẽ cho kết quả:

Feature: 1 [‘Ada L.’, 2, 0.3, None] <QgsPointXY: POINT(10 10)>

Vì vậy, có một trường thuộc tính mới. Chúng ta có thể điền nó bằng cách gán giá trị mong muốn của mình cho trường tính năng. Một lần nữa, chúng ta phải theo mô hình cập nhật sau thay đổi, lần này sử dụng updateFeature():

my_field_value = 'Hello world!'
for f in vl.getFeatures():
f[my_field_name] = my_field_value
vl.updateFeature(f)
 
vl.commitChanges()
 
for f in vl.getFeatures():
print("Feature:", f.id(), f.attributes(), f.geometry().asPoint()) 

Điều này sẽ cho kết quả:

Feature: 1 [‘Ada L.’, 2, 0.3, ‘Hello world!’] <QgsPointXY: POINT(10 10)>

Bây giờ, điều duy nhất còn lại phải làm là dừng phiên chỉnh sửa:

iface.vectorLayerTools().stopEditing(vl)  

Có một cách khác để gọi thủ công startEditing(), commitChanges(), stopEditing() và xử lý các rollback. Cách tiếp cận thay thế này sử dụng trình quản lý bối cảnh sẽ sử dụng nội bộ vl.startEditing()và gọi vl.commitChanges() thành công và nó sẽ quay trở lại nếu có bất kỳ ngoại lệ nào xảy ra. Đây là cách nó được thực hiện bằng cách sử dụng với chỉnh sửa (vl):

my_field_name = 'new field'
my_field_value = 'Hello world!'
 
with edit(vl):
vl.addAttribute(QgsField(my_field_name, QVariant.String))
vl.updateFields()
for f in vl.getFeatures():
f[my_field_name] = my_field_value
vl.updateFeature(f) 

Trên đây là các bước cơ bản để tạo một lớp mới từ đầu. Bạn đã thấy cách xác định các trường thuộc tính và thêm các tính năng. Cuối cùng, chúng tôi đã sửa đổi lớp và thêm một trường thuộc tính khác.

Bình luận bằng Facebook Comments

MẠNG XÃ HỘI

1,010ThíchThích
432Đăng kýĐăng Ký

TOOL PXTmap.com

BÀI VIẾT LIÊN QUAN

Bài 14: Viết kịch bản xử lý

Trong các bài trước, chúng tôi đã đề cập đến cách chạy các công cụ Processing cũng như cách xâu chuỗi các...

Bài 13: Tạo các hàm để tải các lớp GeoPackage

Hiện tại chúng ta đã từng sử dụng GeoPackages. Ví dụ: trong Tải một lớp vectơ, chúng tôi đã giới thiệu cách...

Bài 12: Sử dụng biểu thức để tính giá trị

Trong các bài trước đây, chúng tôi đã đề cập đến cách tạo các lớp vectơ, cách thêm các trường vào bảng...

Bài 11: Quản lý các lớp dự án (đổi tên và loại bỏ)

Trong các bài trước, chúng tôi đã đề cập đến việc thêm các lớp từ các tệp cũng như tạo các lớp...

Bài 10: Công cụ chuỗi xử lý (Chaining Processing)

Trong Bài 7: Chạy công cụ xử lý (Processing), chúng ta đã khám phá những điều cơ bản của việc chạy các...