From 8976f6822f1eab7e07ea66eefaa9bd8c48f404e3 Mon Sep 17 00:00:00 2001 From: havatv Date: Thu, 1 Nov 2018 16:03:43 +0100 Subject: [PATCH] Added file output to gdal extractprojection, added exception for non-gdal sources and fixed boolean parameter handling + some formatting --- .../processing/algs/gdal/extractprojection.py | 45 ++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/python/plugins/processing/algs/gdal/extractprojection.py b/python/plugins/processing/algs/gdal/extractprojection.py index 5f7709e571b..26a42371ec9 100644 --- a/python/plugins/processing/algs/gdal/extractprojection.py +++ b/python/plugins/processing/algs/gdal/extractprojection.py @@ -32,8 +32,10 @@ from qgis.PyQt.QtGui import QIcon from osgeo import gdal, osr from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm +from qgis.core import QgsProcessingException from qgis.core import (QgsProcessingParameterRasterLayer, - QgsProcessingParameterBoolean) + QgsProcessingParameterBoolean, + QgsProcessingOutputFile) pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0] @@ -41,16 +43,26 @@ pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0] class ExtractProjection(GdalAlgorithm): INPUT = 'INPUT' + PRJ_FILE_CREATE = 'PRJ_FILE_CREATE' + WORLD_FILE = 'WORLD_FILE' PRJ_FILE = 'PRJ_FILE' def __init__(self): super().__init__() def initAlgorithm(self, config=None): - self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT, self.tr('Input file'))) - self.addParameter(QgsProcessingParameterBoolean(self.PRJ_FILE, - self.tr('Create also .prj file'), False)) - + self.addParameter(QgsProcessingParameterRasterLayer( + self.INPUT, + self.tr('Input file'))) + self.addParameter(QgsProcessingParameterBoolean( + self.PRJ_FILE_CREATE, + self.tr('Create also .prj file'), False)) + self.addOutput(QgsProcessingOutputFile(self.WORLD_FILE, + self.tr('World file'))) + self.addOutput(QgsProcessingOutputFile( + self.PRJ_FILE, + self.tr('ESRI Shapefile prj file'))) + def name(self): return 'extractprojection' @@ -58,7 +70,8 @@ class ExtractProjection(GdalAlgorithm): return self.tr('Extract projection') def icon(self): - return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'projection-export.png')) + return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', + 'projection-export.png')) def group(self): return self.tr('Raster projections') @@ -69,12 +82,19 @@ class ExtractProjection(GdalAlgorithm): def commandName(self): return 'extractprojection' - def getConsoleCommands(self, parameters, context, feedback, executing=True): + def getConsoleCommands(self, parameters, context, feedback, + executing=True): return [self.commandName()] def processAlgorithm(self, parameters, context, feedback): - createPrj = QgsProcessingParameterBoolean(self.PRJ_FILE) - raster = self.parameterAsRasterLayer(parameters, self.INPUT, context) + createPrj = self.parameterAsBool(parameters, + self.PRJ_FILE_CREATE, + context) + raster = self.parameterAsRasterLayer(parameters, self.INPUT, + context) + if not raster.dataProvider().name() == 'gdal': + raise QgsProcessingException('This algorithm can only '\ + 'be used with GDAL raster layers') rasterPath = raster.source() rasterDS = gdal.Open(rasterPath, gdal.GA_ReadOnly) geotransform = rasterDS.GetGeoTransform() @@ -85,6 +105,7 @@ class ExtractProjection(GdalAlgorithm): outFileName = os.path.splitext(str(rasterPath))[0] + results = {} if crs != '' and createPrj: tmp = osr.SpatialReference() tmp.ImportFromWkt(crs) @@ -94,6 +115,9 @@ class ExtractProjection(GdalAlgorithm): with open(outFileName + '.prj', 'wt') as prj: prj.write(crs) + results[self.PRJ_FILE] = outFileName + '.prj' + else: + results[self.PRJ_FILE] = None with open(outFileName + '.wld', 'wt') as wld: wld.write('%0.8f\n' % geotransform[1]) @@ -106,5 +130,6 @@ class ExtractProjection(GdalAlgorithm): wld.write('%0.8f\n' % (geotransform[3] + 0.5 * geotransform[4] + 0.5 * geotransform[5])) - return {} + results[self.WORLD_FILE] = outFileName + '.wld' + return results