Trang chủ QGIS Lập trình PyQGIS cho người không chuyên Bài 10: Công cụ chuỗi xử lý (Chaining Processing)

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

- Quảng cáo -

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 công cụ xử lý từ PyQGIS. Lần này, chúng tôi sẽ xem xét cách xâu chuỗi nhiều công cụ thành một quy trình công việc.

Trong bài viết này, chúng ta sẽ xây dựng một quy trình tính toán các thành phố nằm dọc theo sông Danube (dữ liệu từ NaturalEarthData). Trước tiên, chúng ta sẽ sử dụng GUI để chạy các công cụ tương ứng (Trích xuất theo thuộc tính, Buffer, và Extract theo vị trí) và kiểm tra quy trình làm việc. Sau đó, sẽ tiếp tục và tạo một phiên bản PyQGIS của quy trình làm việc.

Sau khi sử dụng GUI, chúng ta có thể tra cứu mã tương ứng trong lịch sử Processing . Nó trông giống như thế này:

processing.run("native:extractbyexpression", 
{'INPUT':'E:/Geodata/NaturalEarth/natural_earth_vector.gpkg|layername=ne_110m_rivers_lake_centerlines',
'EXPRESSION':'name = \'Donau\'','OUTPUT':'memory:'})
processing.run("native:buffer",
{'INPUT':'MultiLineString?crs=EPSG:4326&...','DISTANCE':0.1,'SEGMENTS':5,
'END_CAP_STYLE':0,'JOIN_STYLE':0,'MITER_LIMIT':2,'DISSOLVE':False,'OUTPUT':'memory:'})
processing.run("native:extractbylocation",
{'INPUT':'E:/Geodata/NaturalEarth/natural_earth_vector.gpkg|layername=ne_110m_populated_places',
'PREDICATE':[0],'INTERSECT':'MultiPolygon?crs=EPSG:4326&...','OUTPUT':'memory:'}) 

Các đoạn mã từ lịch sử Processing cung cấp hướng dẫn về cú pháp cần thiết nhưng chúng ta không thể sử dụng mã trực tiếp. Khi muốn chuyển đổi tập lệnh này thành tập lệnh, chúng ta cần xử lý các kết quả trung gian. Ở trên, các kết quả trung gian này được lưu trữ trong các lớp bộ nhớ. Lớp bộ nhớ do trích xuất theo thuộc tính được chuyển đến đầu vào công cụ Buffer dưới dạng ‘MultiLineString?crs=EPSG:4326&…’. Đối với tập lệnh của chúng ta, cần đi một cách khác và lưu trữ một tham chiếu đến kết quả trong một biến.

Kịch bản sau đây cho thấy kết quả của một công cụ có thể được chuyển sang công cụ tiếp theo: trong trường hợp các công cụ chúng tôi đang sử dụng trong ví dụ này, processing.run() luôn trả về một từ điển chỉ với một mục nhập có tên ‘OUTPUT’. Bằng cách này, chúng tôi lưu trữ lớp kết quả của Extract theo biểu thức trong biến danube. Sau đó, chúng tôi sử dụng lớp danube làm đầu vào cho công cụ đệm,…

my_gpkg = 'E:/Geodata/NaturalEarth/natural_earth_vector.gpkg'
rivers = '{}|layername=ne_110m_rivers_lake_centerlines'.format(my_gpkg)
places = '{}|layername=ne_110m_populated_places'.format(my_gpkg)
 
expression = "name = 'Donau'"
danube = processing.run("native:extractbyexpression", 
{'INPUT':rivers,'EXPRESSION':expression,'OUTPUT':'memory:'}
)['OUTPUT']
 
buffer_distance = 0.1 #degrees 
 
buffered_danube = processing.run("native:buffer", 
{'INPUT':danube,'DISTANCE':buffer_distance,'SEGMENTS':5,'END_CAP_STYLE':0,
'JOIN_STYLE':0,'MITER_LIMIT':2,'DISSOLVE':False,'OUTPUT':'memory:'}
)['OUTPUT']
 
places_along_danube = processing.run("native:extractbylocation", 
{'INPUT':places,'PREDICATE':[0],'INTERSECT':buffered_danube,'OUTPUT':'memory:'}
)['OUTPUT']
 
QgsProject.instance().addMapLayer(places_along_danube)
 
for feature in places_along_danube.getFeatures():
print(feature["name"]) 

Chạy tập lệnh này, kết quả nhận được như sau:

Bratislava
Belgrade
Budapest
Vienna

Trên đây là những điều cơ bản của các công cụ xử lý chuỗi để xây dựng các quy trình công việc phức tạp hơn. Điều quan trọng là tìm ra cú pháp chính xác bằng cách kiểm tra lịch sử Processing. Sau đó, chúng ta có thể lưu trữ các kết quả trong các biến và chuyển chúng sang các công cụ kế tiếp nhau. Cuối cùng, chúng ta có thể tải kết quả và khám phá, tạo kiểu hoặc in chúng.

Bình luận bằng Facebook Comments

MẠNG XÃ HỘI

1,010ThíchThích
167Đă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 9: Tạo và chỉnh sửa một lớp Vectơ

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ự...