I am trying run an exported QGIS model as Python script from Anaconda.
I followed Executing a standalone QGIS python script on Windows 10, and I get no error of modules, when running this I get no error nor output but some warnings of deprecation
import os, sys
Append QGIS Python library to python search path
sys.path.append(r'C:\Program Files\QGIS 3.6\apps\Python37')
Append location of DLLs to current system PATH envrionment variable
os.environ['PATH'] += r";C:\Program Files\QGIS 3.6\apps\qgis\python;"
print (os.environ['PATH'])
from qgis.core import QgsProcessing
from qgis.core import QgsProcessingAlgorithm
from qgis.core import QgsProcessingMultiStepFeedback
from qgis.core import QgsProcessingParameterRasterLayer
from qgis.core import QgsProcessingParameterFeatureSink
sys.path.append(r'C:\Program Files\QGIS 3.6\apps\qgis\python\plugins')
import processing
class Trees(QgsProcessingAlgorithm):
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterRasterLayer('dsm', 'DSM', defaultValue="Path/dsm.tif"))
self.addParameter(QgsProcessingParameterRasterLayer('dtm', 'DTM', defaultValue="Path/dtm.tif"))
self.addParameter(QgsProcessingParameterRasterLayer('zone', 'Zone', defaultValue="Path/odm_orthophoto.tif"))
self.addParameter(QgsProcessingParameterFeatureSink('Finaltrees', 'FinalTrees', type=QgsProcessing.TypeVectorAnyGeometry, createByDefault=True, defaultValue='Path/finaltrees.shp'))
def processAlgorithm(self, parameters, context, model_feedback):
# Use a multi-step feedback, so that individual child algorithm progress reports are adjusted for the
# overall progress through the model
feedback = QgsProcessingMultiStepFeedback(20, model_feedback)
results = {}
outputs = {}
# Heights calculator
alg_params = {
'CELLSIZE': None,
'CRS': None,
'EXPRESSION': '\"DSM@1\" - \"DTM@1\"',
'EXTENT': None,
'LAYERS': parameters['dtm'],
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['HeightsCalculator'] = processing.run('qgis:rastercalculator', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(1)
if feedback.isCanceled():
return {}
# NDVI calculator
alg_params = {
'CELLSIZE': 0,
'CRS': None,
'EXPRESSION': 'sqrt(256* \"Zone@2\"- 256 * \"Zone@3\")',
'EXTENT': None,
'LAYERS': parameters['dtm'],
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['NdviCalculator'] = processing.run('qgis:rastercalculator', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(2)
if feedback.isCanceled():
return {}
# NDVI Selector
alg_params = {
'CELLSIZE': 0,
'CRS': None,
'EXPRESSION': '\"\'Output\' from algorithm \'NDVI calculator\'@1\"> 100',
'EXTENT': None,
'LAYERS': outputs['NdviCalculator']['OUTPUT'],
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['NdviSelector'] = processing.run('qgis:rastercalculator', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(3)
if feedback.isCanceled():
return {}
# Only NDVI
alg_params = {
'CELLSIZE': 0,
'CRS': None,
'EXPRESSION': '(\"\'Output\' from algorithm \'NDVI Selector\'@1\" =1)*\"\'Output\' from algorithm \'NDVI Selector\'@1\"',
'EXTENT': None,
'LAYERS': outputs['NdviSelector']['OUTPUT'],
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['OnlyNdvi'] = processing.run('qgis:rastercalculator', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(4)
if feedback.isCanceled():
return {}
# Build virtual raster
alg_params = {
'ADD_ALPHA': False,
'ASSIGN_CRS': None,
'INPUT': outputs['OnlyNdvi']['OUTPUT'],
'PROJ_DIFFERENCE': False,
'RESAMPLING': 0,
'RESOLUTION': 1,
'SEPARATE': False,
'SRC_NODATA': '0',
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['BuildVirtualRaster'] = processing.run('gdal:buildvirtualraster', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(5)
if feedback.isCanceled():
return {}
# True NDVI
alg_params = {
'CELLSIZE': 0,
'CRS': None,
'EXPRESSION': '(\"Zone@4\" -\"Zone@1\" ) /(\"Zone@4\" +\"Zone@1\" )',
'EXTENT': None,
'LAYERS': parameters['zone'],
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['TrueNdvi'] = processing.run('qgis:rastercalculator', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(6)
if feedback.isCanceled():
return {}
# Polygonize (raster to vector)
alg_params = {
'BAND': 1,
'EIGHT_CONNECTEDNESS': False,
'FIELD': 'Value',
'INPUT': outputs['BuildVirtualRaster']['OUTPUT'],
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['PolygonizeRasterToVector'] = processing.run('gdal:polygonize', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(7)
if feedback.isCanceled():
return {}
# Extract by attribute
alg_params = {
'FIELD': 'Value',
'INPUT': outputs['PolygonizeRasterToVector']['OUTPUT'],
'OPERATOR': 0,
'VALUE': '1',
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['ExtractByAttribute'] = processing.run('native:extractbyattribute', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(8)
if feedback.isCanceled():
return {}
# Fix geometries
alg_params = {
'INPUT': outputs['ExtractByAttribute']['OUTPUT'],
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['FixGeometries'] = processing.run('native:fixgeometries', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(9)
if feedback.isCanceled():
return {}
# JUSTNDVI
alg_params = {
'ALPHA_BAND': False,
'CROP_TO_CUTLINE': True,
'DATA_TYPE': 0,
'INPUT': outputs['TrueNdvi']['OUTPUT'],
'KEEP_RESOLUTION': False,
'MASK': outputs['FixGeometries']['OUTPUT'],
'MULTITHREADING': False,
'NODATA': None,
'OPTIONS': '',
'SET_RESOLUTION': False,
'SOURCE_CRS': None,
'TARGET_CRS': None,
'X_RESOLUTION': None,
'Y_RESOLUTION': None,
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['Justndvi'] = processing.run('gdal:cliprasterbymasklayer', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(10)
if feedback.isCanceled():
return {}
# NDVIValues
alg_params = {
'FIELD_NAME': 'NDVI',
'INPUT_RASTER': outputs['Justndvi']['OUTPUT'],
'RASTER_BAND': 1,
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['Ndvivalues'] = processing.run('native:pixelstopoints', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(11)
if feedback.isCanceled():
return {}
# Clip raster by mask layer
alg_params = {
'ALPHA_BAND': False,
'CROP_TO_CUTLINE': True,
'DATA_TYPE': 0,
'INPUT': outputs['HeightsCalculator']['OUTPUT'],
'KEEP_RESOLUTION': False,
'MASK': outputs['FixGeometries']['OUTPUT'],
'MULTITHREADING': False,
'NODATA': None,
'OPTIONS': '',
'SET_RESOLUTION': False,
'SOURCE_CRS': None,
'TARGET_CRS': None,
'X_RESOLUTION': None,
'Y_RESOLUTION': None,
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['ClipRasterByMaskLayer'] = processing.run('gdal:cliprasterbymasklayer', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(12)
if feedback.isCanceled():
return {}
# Mean NDVI
alg_params = {
'DISCARD_NONMATCHING': False,
'INPUT': outputs['FixGeometries']['OUTPUT'],
'JOIN': outputs['Ndvivalues']['OUTPUT'],
'JOIN_FIELDS': None,
'PREDICATE': 1,
'SUMMARIES': 6,
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['MeanNdvi'] = processing.run('qgis:joinbylocationsummary', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(13)
if feedback.isCanceled():
return {}
# Heights
alg_params = {
'FIELD_NAME': 'Height',
'INPUT_RASTER': outputs['ClipRasterByMaskLayer']['OUTPUT'],
'RASTER_BAND': 1,
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['Heights'] = processing.run('native:pixelstopoints', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(14)
if feedback.isCanceled():
return {}
# Peaks
alg_params = {
'DISCARD_NONMATCHING': True,
'INPUT': outputs['FixGeometries']['OUTPUT'],
'JOIN': outputs['Heights']['OUTPUT'],
'JOIN_FIELDS': None,
'PREDICATE': 1,
'SUMMARIES': 3,
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['Peaks'] = processing.run('qgis:joinbylocationsummary', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(15)
if feedback.isCanceled():
return {}
# PeaksnNDVI
alg_params = {
'DISCARD_NONMATCHING': True,
'INPUT': outputs['Peaks']['OUTPUT'],
'JOIN': outputs['MeanNdvi']['OUTPUT'],
'JOIN_FIELDS': 'NDVI_mean',
'METHOD': 1,
'PREDICATE': 2,
'PREFIX': '',
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['Peaksnndvi'] = processing.run('qgis:joinattributesbylocation', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(16)
if feedback.isCanceled():
return {}
# Add geometry attributes
alg_params = {
'CALC_METHOD': 0,
'INPUT': outputs['Peaksnndvi']['OUTPUT'],
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['AddGeometryAttributes'] = processing.run('qgis:exportaddgeometrycolumns', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(17)
if feedback.isCanceled():
return {}
# Extract by expression
alg_params = {
'EXPRESSION': 'NDVI_mean > 0.2 AND NDVI_mean IS NOT NULL AND Height_max > 1 AND Height_max IS NOT NULL AND area > 1',
'INPUT': outputs['AddGeometryAttributes']['OUTPUT'],
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['ExtractByExpression'] = processing.run('native:extractbyexpression', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(18)
if feedback.isCanceled():
return {}
# Join attributes by field value
alg_params = {
'DISCARD_NONMATCHING': True,
'FIELD': 'Height',
'FIELDS_TO_COPY': None,
'FIELD_2': 'Height_max',
'INPUT': outputs['Heights']['OUTPUT'],
'INPUT_2': outputs['ExtractByExpression']['OUTPUT'],
'METHOD': 1,
'PREFIX': '',
'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['JoinAttributesByFieldValue'] = processing.run('native:joinattributestable', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(19)
if feedback.isCanceled():
return {}
# Delete duplicates by attribute
alg_params = {
'FIELDS': 'NDVI_mean',
'INPUT': outputs['JoinAttributesByFieldValue']['OUTPUT'],
'OUTPUT': parameters['Finaltrees']
}
outputs['DeleteDuplicatesByAttribute'] = processing.run('native:removeduplicatesbyattribute', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
results['Finaltrees'] = outputs['DeleteDuplicatesByAttribute']['OUTPUT']
return results
def name(self):
return 'trees'
def displayName(self):
return 'trees'
def group(self):
return ''
def groupId(self):
return ''
def createInstance(self):
return Trees()
Is this possible?
mainroutine. – Djedouas Sep 04 '19 at 06:21mainthat returns the output ? – Ayoub Beltarchi Sep 04 '19 at 21:29