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