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 công cụ Processing để tạo ra các quy trình công việc phức tạp hơn. Lần này, chúng ta sẽ tiến thêm một bước và tạo tập lệnh xử lý có thể được gọi công cụ Processing.

Khi chúng ta hoàn thành, tập lệnh Processing sẽ có thể lấy một lớp vectơ làm đầu vào, thực hiện thao tác đệm trên lớp này và trả về đầu ra trên vùng đệm.

Chọn Create New Script từ công cụ Processing để bắt đầu:

Để tạo tập lệnh Processing mới, chúng ta cần QgsProcessingAlgorithm. Điều này có nghĩa là chúng ta phải triển khai lớp tùy chỉnh của riêng (được gọi là ExampleAlgo) dựa trên QgsProcessingAlgorithm. Hàm __init__ là hàm tạo được gọi là của một lớp. Nó định nghĩa cách các đối tượng mới của lớp này được tạo. Trong trường hợp này, chúng tôi xác định rằng các đối tượng exampleAlgo nên được tạo giống như các đối tượng QgsProcessingAlgorithm bằng cách gọi hàm tạo của nó bằng super() ._ init _():

from qgis.core import QgsProcessingAlgorithm
 
class ExampleAlgo(QgsProcessingAlgorithm):
INPUT = 'INPUT'
OUTPUT = 'OUTPUT'
 
def __init__(self):
super().__init__() 

Đây mới chỉ là khởi đầu. Bên cạnh hàm tạo, thuật toán của chúng tôi phải cung cấp các hàm bắt buộc sau:

name: Trả về tên thuật toán duy nhất, được sử dụng để xác định thuật toán.
displayName: Trả về tên thuật toán sẽ được hiển thị hộp công cụ Processing.
createInstance: Phải trả về một bản sao mới của thuật toán. 
initAlgorithm: Ở đây xác định đầu vào và đầu ra của thuật toán. INPUT và OUTPUT là tên được đề xuất cho các tham số đầu vào chính và đầu ra chính, tương ứng. Nếu một tham số phụ thuộc vào tham số khác, ParentParameterName được sử dụng để chỉ định mối quan hệ này (có thể là trường / dải của một lớp hoặc đơn vị khoảng cách của một lớp).
processAlgorithm: Đây là nơi diễn ra quá trình xử lý. Các tham số được truy xuất bằng các hàm mục đích đặc biệt, ví dụ parameterAsSourceparameterAsDouble.

Ba chức năng đầu tiên không thú vị lắm. Chúng ta cần chọn một tên và hiển thị tên cho thuật toán. Hàm createdInstance luôn trông giống nhau:

def name(self):
return "exalgo_processing_run"
 
def displayName(self):
return "Example Processing.run() script"
 
def createInstance(self):
return type(self)() 

Tiếp theo, chúng ta cần xác định đầu vào và đầu ra của thuật toán bằng cách thêm hai tham số tương ứng vào thuật toán: QssProcessingParameterFeatureSource là đầu vào và QssProcessingParameterVectorDestination là đầu ra. Lưu ý rằng điều này yêu cầu chúng ta nhập các tham số này vào đầu tập lệnh:

from qgis.core import (QgsProcessing, QgsProcessingAlgorithm, 
QgsProcessingParameterFeatureSource, 
QgsProcessingParameterVectorDestination) 

Các chuỗi ‘Input layer’ và ‘Output layer’ ra là các nhãn sẽ được hiển thị trong hộp thoại giao diện người dùng được tạo tự động. (Nếu bạn xem các ví dụ xử lý tập lệnh phức tạp khác, chẳng hạn như tập lệnh trong hướng dẫn sử dụng chính thức, bạn sẽ thấy rằng các chuỗi này có thể được dịch cho các cài đặt ngôn ngữ QGIS khác nhau bằng cách thêm hàm tr ()).

def initAlgorithm(self, config=None):
self.addParameter(
QgsProcessingParameterFeatureSource(
self.INPUT,
'Input layer',
[QgsProcessing.TypeVectorAnyGeometry]
)
)
 
self.addParameter(
QgsProcessingParameterVectorDestination (
self.OUTPUT,
'Output layer'
)
) 

Bây giờ chúng ta cuối cùng cũng có thể thực hiện mã xử lý dữ liệu thực tế trong hàm processAlgorithm(). Điều này dựa trên những gì chúng tôi đã trình bày trong các công cụ Chaining Processing. Tuy nhiên, lưu ý rằng vì thuật toán bộ đệm đang được chạy như một bước trong thuật toán lớn hơn của chúng tôi, nên tùy chọn is_child_algorithm nên được đặt thành True:

def processAlgorithm(self, parameters, context, feedback):
outputFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
 
buffered_layer = processing.run("native:buffer", 
{
'INPUT': parameters['INPUT'],
'DISTANCE': 1000000,
'SEGMENTS': 5,
'END_CAP_STYLE': 0,
'JOIN_STYLE': 0,
'MITER_LIMIT': 2,
'DISSOLVE': False,
'OUTPUT': outputFile
}, 
is_child_algorithm=True,
context=context, 
feedback=feedback
)['OUTPUT']
 
return {self.OUTPUT : buffered_layer} 

Nếu chúng ta kết hợp tất cả lại, kịch bản cuối cùng trông như thế này:

from qgis.core import (QgsProcessing, QgsProcessingAlgorithm, 
QgsProcessingParameterFeatureSource, 
QgsProcessingParameterVectorDestination)
import processing 
 
class ExampleAlgo(QgsProcessingAlgorithm):
INPUT = 'INPUT'
OUTPUT = 'OUTPUT'
 
def __init__(self):
super().__init__()
 
def name(self):
return "exalgo_processing_run"
 
def displayName(self):
return "Example Processing.run() script"
 
def createInstance(self):
return type(self)()
 
def initAlgorithm(self, config=None):
self.addParameter(
QgsProcessingParameterFeatureSource(
self.INPUT,
'Input layer',
[QgsProcessing.TypeVectorAnyGeometry]
)
)
 
self.addParameter(
QgsProcessingParameterVectorDestination (
self.OUTPUT,
'Output layer'
)
)
 
def processAlgorithm(self, parameters, context, feedback):
outputFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
 
buffered_layer = processing.run("native:buffer", 
{
'INPUT': parameters['INPUT'],
'DISTANCE': 1000000,
'SEGMENTS': 5,
'END_CAP_STYLE': 0,
'JOIN_STYLE': 0,
'MITER_LIMIT': 2,
'DISSOLVE': False,
'OUTPUT': outputFile
}, 
is_child_algorithm=True,
context=context, 
feedback=feedback
)['OUTPUT']
 
return {self.OUTPUT : buffered_layer} 

Đây là một ví dụ làm việc tối thiểu! Hướng dẫn sử dụng chính thức cung cấp một kịch bản rộng lớn hơn nhiều và nhiều thông tin cơ bản. Ví dụ: bạn có thể muốn nhóm các tập lệnh của mình để tạo thành các nhóm thuật toán tương tự. Có một hàm nhóm tùy group() để đạt được điều này.

Trên đây là những điều cơ bản để tạo tập lệnh Xử lý có thể được gọi từ công cụ Processing.

Bình luận bằng Facebook Comments