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