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 thuộc tính của chúng và cách đặt các giá trị trường. Lần này, thay vì đặt các trường thành một số giá trị đặt trước, chúng tôi sẽ sử dụng các biểu thức QGIS để tính toán các giá trị.

Trước hết, hãy tạo ra một lớp vectơ với ba tính năng! Mã tạo lớp sử dụng lại những thứ gì chúng tôi đã trình bày trong các bài viết trước:

from qgis.PyQt.QtCore import QVariant
 
vl = QgsVectorLayer("Point", "Companies", "memory")
 
pr = vl.dataProvider()
pr.addAttributes([QgsField("Name", QVariant.String),
QgsField("Employees",  QVariant.Int),
QgsField("Revenue", QVariant.Double),
QgsField("Rev. per employee", QVariant.Double),
QgsField("Sum", QVariant.Double),
QgsField("Fun", QVariant.Double)])
vl.updateFields()
 
my_data = [
{'x': 0, 'y': 0, 'name': 'ABC', 'emp': 10, 'rev': 100.1},
{'x': 1, 'y': 1, 'name': 'DEF', 'emp': 2, 'rev': 50.5},
{'x': 5, 'y': 5, 'name': 'GHI', 'emp': 100, 'rev': 725.9}]
 
for rec in my_data:
f = QgsFeature()
pt = QgsPointXY(rec['x'], rec['y'])
f.setGeometry(QgsGeometry.fromPointXY(pt))
f.setAttributes([rec['name'], rec['emp'], rec['rev']])
pr.addFeature(f)
 
vl.updateExtents() 
QgsProject.instance().addMapLayer(vl) 

Mở bảng thuộc tính và bạn sẽ thấy rằng ba trường cuối cùng trống.

Hãy điền giá trị chúng với các biểu thức !

Cú pháp biểu thức hoàn toàn giống như các trường tính toán trong GUI. Vì vậy, bạn có thể kiểm tra chúng trong GUI trước khi sao chép chúng vào tập lệnh PyQGIS của bạn.

Biểu thức đầu tiên tính toán doanh thu trên mỗi nhân viên. Cái thứ hai tính tổng của tất cả các giá trị doanh thu trong lớp. Biểu thức thứ ba cuối cùng không thực sự có ý nghĩa nhưng minh họa thực tế là chúng ta có thể sử dụng một loạt các hàm biểu thức, chẳng hạn như diện tích và bộ đệm trong các biểu thức của chúng ta:

expression1 = QgsExpression('Revenue/Employees')
expression2 = QgsExpression('sum(Revenue)')
expression3 = QgsExpression('area(buffer($geometry,Employees))') 

Để thực hiện các biểu thức của chúng tôi, chúng tôi cần cung cấp một QssExpressionContext thích hợp. Để thiết lập nó, sử dụng:

context = QgsExpressionContext()
context.appendScopes(QgsExpressionContextUtils.globalProjectLayerScopes(vl)) 

(QgsExpressionContextUtils.globalProjectLayerScopes() là một hàm tiện lợi bổ sung toàn bộ phạm vi toàn cục, dự án và lớp cùng một lúc. Phạm vi cụ thể nhất của người dùng, tức là từ toàn cục đến dự án đến lớp.)

Bây giờ, chúng ta có thể lặp qua các tính năng của lớp và áp dụng các biểu thức bằng cách gọi hàm Assessment() của chúng:

with edit(vl):
for f in vl.getFeatures():
context.setFeature(f)
f['Rev. per employee'] = expression1.evaluate(context)
f['Sum'] = expression2.evaluate(context)
f['Fun'] = expression3.evaluate(context)
vl.updateFeature(f) 

Tuy nhiên, đây không phải là cách duy nhất để tính giá trị trường. Ngoài ra, bạn cũng có thể sử dụng Python thuần, ví dụ:

with edit(vl):
for f in vl.getFeatures():
f['Rev. per employee'] = f['Revenue'] / f['Employees']
vl.updateFeature(f) 

Trên đây là những điều cơ bản trong việc sử dụng các biểu thức QGIS cũng như Python thuần túy để tính toán các giá trị trường trong PyQGIS. Bạn có thể sử dụng cả hai tùy chọn này tùy thuộc vào sở thích và yêu cầu cụ thể của dự án.

Bình luận bằng Facebook Comments