В профильном сообществе попросили написать гайд по установке актуальной версии SagaGIS в QGIS. Исполняю обещание. В принципе, в составе QGIS SagaGIS уже включён, но во-первых, это временное явление (вроде как в новых версиях решили исключить SagaGIS из ядра), а во-вторых, в составе установочного пакета QGIS поставляется какая-то уж очень древняя версия Saga — кажется 7-я, тогда как актуальная версия на момент написания заметки — 9.2.
По пунктам, кратенько. Потом постараюсь добавить подробностей, когда будет больше свободного времени.
- Скачиваем последнюю версию SagaGIS.
- Распаковываем скачанный архив в какую-нибудь папку. Я предпочитаю OSGeo4W64\apps\, но можно любую другую.
- В QGIS отключаем плагин ядра SAGA GIS provider и скачиваем Processing Saga NextGen Provider. В Настройках последнего указываем путь к SagaGIS — куда мы его распаковали на предыдущем шаге. Закрываем QGIS.
- В папке с SagaGIS лежит архив saga4qgis.zip, внутри которого есть инструкция, что надо делать с содержимым этого архива. Не буду повторять её, но суть такова: содержимое архива надо распаковать (удалив предварительно уже существующее) в папку C:\Users\...\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\processing_saga_nextgen
Только не делайте это «в лоб», сперва найдите где конкретно лежит файл SagaNameDecorator.py и папка \description\ — удалите их и скопируйте на их место содержимое архива. - В принципе всё готово, можно запускать QGIS и радоваться возможности работать с последней версией SagaGIS. Но есть еще одна маленькая хитрость, сильно облегчающая работу. Надо открыть файл SagaAlgorithm.py и заменить
elif isinstance(param, (QgsProcessingParameterString, QgsProcessingParameterField)):
command += ' -{} "{}"'.format(param.name(), self.parameterAsString(parameters, param.name(), context))
на
elif isinstance(param, (QgsProcessingParameterString, QgsProcessingParameterField)):
command += ' -{} "{:.10}"'.format(param.name(), self.parameterAsString(parameters, param.name(), context))
Для чего нужен последний пункт: дело в том, что инструменты SagaGIS, работающие с векторными исходниками, на входе принимают только shape файлы SHP. А те, в свою очередь, согласно стандарту не поддерживают имена полей длиннее 10 символов. Поэтому если вы попробуете подсунуть в SagaGIS на вход какой-нибудь Geopackage с именем поля 11 символов и больше, то в исходном варианте
SagaAlgorithm.py вы получите ошибку. Мой же код автоматически обрезает имя поля по 10 символу и в результате формируется правильный shape-файл.
К слову сказать, похожие улучшения можно вставлять и в другие
Processing Provider плагины — они все сделаны более или менее похожим образом. Однако важно понимать, что если вы ухитрились создать в Geopackage несколько столбцов (полей) длинными именами, первые 10 символов которых побуквенно совпадают, то готовьтесь к удивительным глюкам.