Po aktualizacji QGIS 3.0 bardzo trudno było znaleźć jakiekolwiek informacje dotyczące pisania skryptów przetwarzających w QGIS 3.0.
@Underdark (patrz tutaj ) zapewnił podstawę szkieletu. Wydaje się, że ten kod został również dodany w QGIS podczas pisania nowego skryptu z szablonu (QGIS 3.0.2).
Jednak nie mogłem znaleźć sposobu, aby pomóc początkującym użytkownikom Python, takim jak ja, zrozumieć, jak zmienić ten kod, szczególnie w przypadku warstw wejściowych i wyjściowych.
Moim celem jest napisanie skryptu zawierającego 2 warstwy rastrowe i podwójną jako dane wejściowe, generując dwie warstwy.
Jakie byłyby wymagane zmiany w przykładowym kodzie, aby to umożliwić?
W przypadku QGIS 2.x użyłbym następującej składni:
##Layer1=raster
##Layer2=raster
##myDouble=Double
##OutLayer1=output raster
##OutLayer2=output raster
Z tego, co rozumiem, zmiany należy wprowadzić w następującej procedurze, ale nie jestem pewien, co wprowadzić.
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterFeatureSource(
self.INPUT,
self.tr("Input layer"),
[QgsProcessing.TypeVectorAnyGeometry]))
self.addParameter(QgsProcessingParameterFeatureSink(
self.OUTPUT,
self.tr("Output layer"),
QgsProcessing.TypeVectorAnyGeometry))
16 maja opublikowano dokumentację QGIS Python API . Jednak nadal nie jest dla mnie jasne, jak go tutaj używać. (Co może równie dobrze być brakiem wiedzy w języku Python)
Odpowiedzi:
Wraz z przejściem z QGIS2.x do QGIS3.x cała struktura przetwarzania została przerobiona, a jej duże części działają teraz jako klasy C ++, z którymi można współdziałać za pomocą Pythona. Niestety prosta składnia parametrów we / wy danych / zestawu danych nie jest już ważna. Nowa struktura parametrów jest znacznie bardziej zorientowana po wbudowanych algorytmach przetwarzania (Python), które znajdują się w preinstalowanym zestawie narzędzi.
Jak widzę, śledziłeś już opis nowej struktury algorytmu przez @underdark. Aby jednak dostosować tę strukturę do swoich wymagań (warstwy rastrowe, podwójne wprowadzanie itp.), Musisz zmienić kod w wielu miejscach skryptu. Zakodowałem szorstki przykład z krótkim wyjaśnieniem (tylko szkielet algorytmu oparty na przykładzie @underdarks):
Jakie kroki są zrobione?
QgsProcessingAlgorithm
.INPUT_RASTER_A = 'INPUT_RASTER_A'
) W celu odniesienia swojego algorytmu do parametrów dostarczonych przez strukturę przetwarzania.QgsProcessingParameterType
- w przypadku swojego algorytmu:QgsProcessingParameterRasterLayer
,QgsProcessingParameterNumber
, i tak dalej. Możesz przejrzeć wpisy API (tj.QgsProcessingParameterRasterLayer
), Aby przekazać odpowiednie argumenty i zbudować obiekty parametrów.context
ifeedback
obiekty doprocessAlgorithm()
metody, w której uzyskujesz wejściowe zestawy danych z parametrów w czasie wykonywania (w tym przypadku obiekty QgsRasterLayer przy użyciuparameterAsRasterLayer()
metody itp.).processAlgorithm()
.Mam nadzieję, że mógłbym dać ci wgląd w sposób projektowania algorytmów Python w QGIS3. Ilekroć utkniesz, zawsze pomocne jest sprawdzenie, jak istniejące algorytmy struktury przetwarzania przetwarzają parametry. Możesz je zobaczyć tutaj .
źródło