Trang chủ QGIS Lập trình Python QGIS - PyQGIS Bài 5: Cách thêm/xóa trường và cập nhật giá trị thuộc tính

Bài 5: Cách thêm/xóa trường và cập nhật giá trị thuộc tính

- Quảng cáo -

Bài 1: Bắt đầu với lập trình Python QGIS
Bài 2: Thêm lớp Vector
Bài 3: Thêm lớp Raster
Bài 4: Làm việc với lớp Vector
Bài 5: Cách thêm/xóa trường và cập nhật giá trị thuộc tính
Bài 6: Thêm dữ liệu CSV
Bài 7: Drawing Marker
Bài 8: Vẽ Polyline và Polygon
Bài 9: Animate GPS Track
Bài 10: Đặt và tải lại nguồn dữ liệu bản đồ cơ sở (Basemap)

Loạt bài hướng dẫn Python QGIS này sẽ thảo luận về cách lấy các tính năng của lớp vectơ, thêm hoặc xóa một trường và cập nhật giá trị thuộc tính.

Tôi đang sử dụng lớp vectơ của Parks polygon in Vancouver, Canada trong hướng dẫn này. Bạn có thể tìm thấy dữ liệu này tại Vancouver City Data Catalog, nếu không bạn cũng có thể sử dụng dữ liệu của riêng mình.

Bước đầu tiên, hãy xác định dữ liệu dưới dạng lớp vectơ bằng cách sử dụng lớp QssVectorLayer như sau:

layer=QgsVectorLayer("F:\park_polygons.shp","park","ogr")

Sau đó, hãy kiểm tra tên trường có sẵn trong lớp park. Chúng tôi sẽ nhận được một danh sách có chứa tên của trường. Bởi vì nó trả về một danh sách, sau này chúng ta có thể truy cập các giá trị thuộc tính của một trường bằng cách sử dụng chỉ mục danh sách.

print (layer.fields().names())

Output:
[‘PARK_NAME’, ‘PARK_ID’, ‘PARK_URL’, ‘AREA_HEC’] 

Bây giờ, hãy in tất cả tên của công viên bằng phương pháp thuộc tính. Từ danh sách, chúng tôi biết rằng tên của công viên là giá trị đầu tiên trong danh sách, vì vậy nó có chỉ số 0, vì danh sách bắt đầu từ 0.

features=layer.getFeatures()
for f in features:
    print (f.attributes()[0])

Sample Output:
Aberdeen Park
Adanac Park
Alexandra Park
Alice Townley Park
Almond Park
Almond Park
Andy Livingstone Park
……

Để in các thuộc tính cho tất cả các trường, chỉ cần bỏ qua chỉ mục.

features=layer.getFeatures()
for f in features:
    print (f.attributes())

Sample Output:
‘Tecumseh Park’, 198, ‘http://covapp.vancouver.ca/parkfinder/parkdetail.aspx?inparkid=198’, ‘2.09’]
[‘Templeton Park’, 60, ‘http://covapp.vancouver.ca/parkfinder/parkdetail.aspx?inparkid=60’, ‘1.93’]

Bây giờ chúng ta hãy sử dụng một chút với một thuật ngữ có điều kiện, ví dụ chúng ta chỉ muốn biết công viên nào có diện tích hơn 200 ha. Để làm điều này, chúng tôi thực hiện một vòng lặp để kiểm tra từng tính năng có diện tích hơn 200 ha và đếm số lượng.

#GET FEATURE WITH AREA GREATER THAN 200 HA
features=layer.getFeatures()
n_total=0
n_200=0
for f in features:
    n_total +=1
    area_hec=f.attributes()[1]
    if area_hec > 200:
        print (f.attributes()[0], "Area(Ha): ", area_hec)
        n_200 +=1
print (f"Number of Parks with area > 200 Ha: {n_200} From {n_total} ")

Sample Output:
……. 
Trillium Park Area(Ha):  245
West Point Grey Park Area(Ha):  221
Westmount Park Area(Ha):  222
Yaletown Park Area(Ha):  237
Number of Parks with area > 200 Ha: 47 From 264

Thêm trường (field) mới

Để thêm một trường mới cho một lớp vectơ có thể được thực hiện bằng cách sử dụng phương thức addAttribut từ QssVectorDataProvider. Đó là lý do tại sao chúng ta cần khởi tạo lớp vectơ cho nhà cung cấp dữ liệu vectơ bằng phương pháp dataProvider. Sau đó, sử dụng phương thức addAttribution, một trường được thêm vào bằng cách sử dụng lớp QssField với hai tham số: Field Name và Type. Đối với loại trường có thể được xác định bằng cách sử dụng QVariant. Cuối cùng, chúng ta phải gọi phương thức updateFields để cập nhật lớp.

Ví dụ: trong hướng dẫn này, chúng tôi muốn thêm một trường có tên Length mà sau đó chứa mỗi chiều dài ranh giới công viên (park boundary length). Mã code thực hiện điều này như sau:

#ADDING NEW FIELD
from PyQt5.QtCore import QVariant
layer_provider=layer.dataProvider()
layer_provider.addAttributes([QgsField("Length",QVariant.Double)])
layer.updateFields()
print (layer.fields().names())

Output:
[‘PARK_NAME’, ‘PARK_ID’, ‘PARK_URL’, ‘AREA_HEC’, ‘Length’]

Thêm/Cập nhật thuộc tính của trường (Field’s Attributes)

Chúng ta đã có trường mới Length, nhưng không có giá trị thuộc tính trong đó, vẫn trống. Tiếp theo hãy tính độ dài đường biên và thêm nó vào từng tính năng.

Để thêm hoặc cập nhật giá trị thuộc tính, phương thức changeAttributionValues ​​được sử dụng từ lớp nhà cung cấp dữ liệu. Để tính toán độ dài đường biên có thể được thực hiện bằng phương pháp độ dài từ lớp QssGeometry. Giá trị của thuộc tính được xác định theo kiểu dữ liệu chính tả với khóa là chỉ mục của trường sẽ được cập nhật (trong trường hợp này là Length có chỉ số 4) và giá trị của độ dài đường biên (boundary length) tương ứng.

#UPDATING/ADD ATTRIBUTE VALUE
layer.startEditing()
for f in features:
    id=f.id()
    length=f.geometry().length()
    attr_value={4:length}
    layer_provider.changeAttributeValues({id:attr_value})
layer.commitChanges()

Thêm lớp vào khung bản đồ QGIS và mở bảng thuộc tính. Có thể được xem như trong hình dưới, trường mới và Length các giá trị độ dài đã được thêm vào mỗi tính năng.

Cập nhật giá trị thuộc tính của trường Length

Xóa trường (field)

Để xóa một trường, chỉ cần sử dụng phương thức deleteAttribut từ lớp nhà cung cấp dữ liệu. Phương thức yêu cầu một danh sách chứa chỉ mục trường sẽ bị xóa. Ví dụ: chúng tôi muốn xóa trường Length đã được thêm trước đó có chỉ mục 4. Khi hoàn tất, đừng quên gọi phương thức updateFields để thay đổi diễn ra.

#DELETE FIELD
layer_provider.deleteAttributes([4])
layer.updateFields()

Trên đây là tất cả các hướng dẫn cách làm việc với lớp vectơ, đặc biệt là cách thêm, xóa và cập nhật giá trị của trường.

Bình luận bằng Facebook Comments

MẠNG XÃ HỘI

1,010ThíchThích
263Đă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...