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.
Topographic Correction                                      Without Topographic Correction



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()

Popular posts from this blog

How to fill gaps in SLC-Off Landsat 7 ETM+ Images with QGIS?