Correcion Topografica Con SAGA y PyQGIS
Law, K.H., Nichol, J. (2004): 'Topographic Correction for Differential Illumination Effects on Ikonos Satellite Imagery', ISPRS 2004 International Society for Photogrammetry and Remote Sensing,pdf.
from qgis.core import QgsProcessing
from qgis.core import QgsProcessingAlgorithm
from qgis.core import QgsProcessingMultiStepFeedback
from qgis.core import QgsProcessingParameterRasterLayer
from qgis.core import QgsProcessingParameterNumber
from qgis.core import QgsProcessingParameterRasterDestination
import processing
class LandsatMinnaertCorrection(QgsProcessingAlgorithm):
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterRasterLayer('banda', 'Banda', defaultValue=None))
self.addParameter(QgsProcessingParameterRasterLayer('demmismopixel', 'DEM MISMO PIXEL', defaultValue=None))
self.addParameter(QgsProcessingParameterNumber('sunazimuthdegrees', 'SUN_AZIMUTH DEGREES', type=QgsProcessingParameterNumber.Double, minValue=0, maxValue=360, defaultValue=180))
self.addParameter(QgsProcessingParameterNumber('sunelevationdegrees', 'SUN_ELEVATION DEGREES', type=QgsProcessingParameterNumber.Double, minValue=0, maxValue=90, defaultValue=45))
self.addParameter(QgsProcessingParameterNumber('uni', 'Minnaert Correction (Superficie lamberth=Superfice Ideal=Plano)', type=QgsProcessingParameterNumber.Double, minValue=0, maxValue=1, defaultValue=0.5))
self.addParameter(QgsProcessingParameterRasterDestination('IngreseSalida', 'Ingrese Salida', createByDefault=True, defaultValue=None))
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(2, model_feedback)
results = {}
outputs = {}
# Fill sinks (wang & liu)
alg_params = {
'ELEV': parameters['demmismopixel'],
'MINSLOPE': 0.01,
'FDIR': QgsProcessing.TEMPORARY_OUTPUT,
'FILLED': QgsProcessing.TEMPORARY_OUTPUT,
'WSHED': QgsProcessing.TEMPORARY_OUTPUT
}
outputs['FillSinksWangLiu'] = processing.run('saga:fillsinkswangliu', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
feedback.setCurrentStep(1)
if feedback.isCanceled():
return {}
# Topographic correction
alg_params = {
'AZI': parameters['sunazimuthdegrees'],
'DEM': parameters['demmismopixel'],
'HGT': parameters['sunelevationdegrees'],
'MAXCELLS': 1000,
'MAXVALUE': 1,
'METHOD': 4,
'MINNAERT': parameters['uni'],
'ORIGINAL': parameters['banda'],
'CORRECTED': parameters['IngreseSalida']
}
outputs['TopographicCorrection'] = processing.run('saga:topographiccorrection', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
results['IngreseSalida'] = outputs['TopographicCorrection']['CORRECTED']
return results
def name(self):
return 'Landsat Minnaert Correction'
def displayName(self):
return 'Landsat Minnaert Correction'
def group(self):
return 'Correciones'
def groupId(self):
return 'Correciones'
def createInstance(self):
return LandsatMinnaertCorrection()
