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.

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