Sử dụng thuật toán xử lý QGIS3 từ các tập lệnh PyQGIS độc lập (bên ngoài GUI)


23

Tôi đang viết một tập lệnh phải hoạt động bên ngoài GUI của QGIS. Tôi gọi một số hàm API từ qgis.core nhưng tôi muốn sử dụng plugin xử lý.

Tôi có thể nhập xử lý với sys.path.append () nhưng tôi không thể chạy bất kỳ quy trình nào. Hơn nữa, tất cả các thuật toán "bản địa" đều bị thiếu trong QssApplication. ProcessingRegistry (). Thuật toán ()

Vì vậy, nó có thể chạy xử lý theo cách đó? Tôi đang thiếu gì?

import os, sys
from qgis.core import *
QgsApplication.setPrefixPath('/usr', True)
qgs = QgsApplication([], False)
qgs.initQgis()

sys.path.append('/usr/share/qgis/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
import processing

layer1 = QgsVectorLayer('data/ROUTE_PRIMAIRE.SHP')
layer2 = QgsVectorLayer('data/ROUTE_SECONDAIRE.SHP')

processing.run('qgis:union', layer1, layer2, 'test.shp') # returns nothing

Tôi đang ở trên QGIS 3.0.1 - Debian 9

Câu trả lời:


28

Bạn có thể chạy thuật toán xử lý QGIS ở chế độ độc lập (không có GUI) theo cách này:

import sys

from qgis.core import (
     QgsApplication, 
     QgsProcessingFeedback, 
     QgsVectorLayer
)

# See /gis//a/155852/4972 for details about the prefix 
QgsApplication.setPrefixPath('/usr', True)
qgs = QgsApplication([], False)
qgs.initQgis()

# Append the path where processing plugin can be found
sys.path.append('/docs/dev/qgis/build/output/python/plugins')

import processing
from processing.core.Processing import Processing
Processing.initialize()

layer1 = QgsVectorLayer('/path/to/geodata/lines_1.shp', 'layer 1', 'ogr')
layer2 = QgsVectorLayer('/path/to/geodata/lines_2.shp', 'layer 2', 'ogr')

# You can see what parameters are needed by the algorithm  
# using: processing.algorithmHelp("qgis:union")
params = { 
    'INPUT' : layer1,
    'OVERLAY' : layer2, 
    'OUTPUT' : '/path/to/output_layer.gpkg|layername=output'
}
feedback = QgsProcessingFeedback()

res = processing.run('qgis:union', params, feedback=feedback)
res['OUTPUT'] # Access your output layer

Thuật toán bản địa

Bây giờ, nếu bạn muốn sử dụng thuật toán gốc (nghĩa là thuật toán từ nhà cung cấp riêng, thuật toán được viết bằng C ++), bạn cần thêm nhà cung cấp sau khi khởi tạo Xử lý:

import sys

from qgis.core import (
     QgsApplication, 
     QgsProcessingFeedback, 
     QgsVectorLayer
)
from qgis.analysis import QgsNativeAlgorithms

# See /gis//a/155852/4972 for details about the prefix 
QgsApplication.setPrefixPath('/usr', True)
qgs = QgsApplication([], False)
qgs.initQgis()

# Append the path where processing plugin can be found
sys.path.append('/docs/dev/qgis/build/output/python/plugins')

import processing
from processing.core.Processing import Processing
Processing.initialize()
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())

layer = QgsVectorLayer('/path/to/geodata/lines.shp', 'my layer', 'ogr')

# You can see what parameters are needed by the algorithm  
# using: processing.algorithmHelp("native:extractvertices")
params = {
    'INPUT': layer,
    'OUTPUT': 'memory:'
}
feedback = QgsProcessingFeedback()

res = processing.run("native:extractvertices", params, feedback=feedback)
res['OUTPUT'] # Access your output layer

Hoạt động tốt, cảm ơn! Có thể ghi đầu ra trên đĩa cùng một lúc, nếu một đường dẫn được cung cấp?
vidlb

Chắc chắn, đó là một lựa chọn rất hữu ích là tốt.
Germán Carrillo

1
Đây là ma thuật thuần túy - Cảm ơn bạn đã chia sẻ giải pháp chi tiết của bạn!
root676

@ GermánCarrillo Bằng cách nào đó, một mã rất giống nhau không hoạt động. Xem thêm: gis.stackexchange.com/questions/286281/ trộm
Ông Che

Tôi thử chạy thuật toán QGIS trong Plugin QGIS, cách này có hoạt động giống như vậy không? Bởi vì tôi không thể làm cho nó chạy được
gHupf

1

Tôi đã gặp lỗi "NameError: name 'QssNativeAlacticms' không được xác định" khi tôi cố gắng sử dụng thuật toán gốc như trên, trong bản cài đặt OSGeo4W có bao gồm QGIS 3.4.4. Giải pháp hóa ra là nhập thiếu:

from qgis.analysis import QgsNativeAlgorithms

(từ tập lệnh độc lập của QGIS 3.4 / 3.6 )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.