diff --git a/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py b/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py index 871ad7a3e6f9..c6289b073f2f 100644 --- a/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py +++ b/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py @@ -71,7 +71,7 @@ from .tri import tri from .warp import warp -# from .extractprojection import ExtractProjection +from .extractprojection import ExtractProjection # from .rasterize_over import rasterize_over from .Buffer import Buffer @@ -181,7 +181,7 @@ def loadAlgorithms(self): tri(), warp(), # rasterize(), - # ExtractProjection(), + ExtractProjection(), # rasterize_over(), # ----- OGR tools ----- Buffer(), diff --git a/python/plugins/processing/algs/gdal/extractprojection.py b/python/plugins/processing/algs/gdal/extractprojection.py index 408f4ef67a47..b90c4b96fbef 100644 --- a/python/plugins/processing/algs/gdal/extractprojection.py +++ b/python/plugins/processing/algs/gdal/extractprojection.py @@ -32,8 +32,10 @@ from osgeo import gdal, osr from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm -from processing.core.parameters import ParameterRaster -from processing.core.parameters import ParameterBoolean +from qgis.core import QgsProcessingException +from qgis.core import (QgsProcessingParameterRasterLayer, + QgsProcessingParameterBoolean, + QgsProcessingOutputFile) pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0] @@ -41,15 +43,26 @@ 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(ParameterRaster(self.INPUT, self.tr('Input file'))) - self.addParameter(ParameterBoolean(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 +71,8 @@ def displayName(self): 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,20 +83,31 @@ def groupId(self): 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): - rasterPath = self.getParameterValue(self.INPUT) - createPrj = self.getParameterValue(self.PRJ_FILE) - - raster = gdal.Open(str(rasterPath)) - crs = raster.GetProjection() - geotransform = raster.GetGeoTransform() + createPrj = self.parameterAsBool(parameters, + self.PRJ_FILE_CREATE, + context) + raster = self.parameterAsRasterLayer(parameters, self.INPUT, + context) + if not raster.dataProvider().name() == 'gdal': + raise QgsProcessingException(self.tr('This algorithm can ' + 'only be used with ' + 'GDAL raster layers')) + rasterPath = raster.source() + rasterDS = gdal.Open(rasterPath, gdal.GA_ReadOnly) + geotransform = rasterDS.GetGeoTransform() + inputcrs = raster.crs() + crs = inputcrs.toWkt() raster = None + rasterDS = None outFileName = os.path.splitext(str(rasterPath))[0] + results = {} if crs != '' and createPrj: tmp = osr.SpatialReference() tmp.ImportFromWkt(crs) @@ -92,15 +117,21 @@ def processAlgorithm(self, parameters, context, feedback): 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]) wld.write('%0.8f\n' % geotransform[4]) wld.write('%0.8f\n' % geotransform[2]) wld.write('%0.8f\n' % geotransform[5]) - wld.write('%0.8f\n' % (geotransform[0] + - 0.5 * geotransform[1] + - 0.5 * geotransform[2])) - wld.write('%0.8f\n' % (geotransform[3] + - 0.5 * geotransform[4] + - 0.5 * geotransform[5])) + wld.write('%0.8f\n' % (geotransform[0] + + 0.5 * geotransform[1] + + 0.5 * geotransform[2])) + wld.write('%0.8f\n' % (geotransform[3] + + 0.5 * geotransform[4] + + 0.5 * geotransform[5])) + results[self.WORLD_FILE] = outFileName + '.wld' + + return results diff --git a/python/plugins/processing/tests/testdata/expected/gdal/dem.prj b/python/plugins/processing/tests/testdata/expected/gdal/dem.prj new file mode 100644 index 000000000000..a30c00a55de1 --- /dev/null +++ b/python/plugins/processing/tests/testdata/expected/gdal/dem.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/python/plugins/processing/tests/testdata/expected/gdal/dem.wld b/python/plugins/processing/tests/testdata/expected/gdal/dem.wld new file mode 100644 index 000000000000..b603f023ecee --- /dev/null +++ b/python/plugins/processing/tests/testdata/expected/gdal/dem.wld @@ -0,0 +1,6 @@ +0.00010000 +0.00000000 +0.00000000 +-0.00010000 +18.66634794 +45.81165144 diff --git a/python/plugins/processing/tests/testdata/gdal_algorithm_tests.yaml b/python/plugins/processing/tests/testdata/gdal_algorithm_tests.yaml index 148994d5ac57..3f72bd203dbc 100644 --- a/python/plugins/processing/tests/testdata/gdal_algorithm_tests.yaml +++ b/python/plugins/processing/tests/testdata/gdal_algorithm_tests.yaml @@ -121,6 +121,33 @@ tests: name: expected/gdal/contour.gml type: vector + - algorithm: gdal:extractprojection + name: Extract Projection (extractprojection) + params: + INPUT: + name: dem.tif + type: raster + PRJ_FILE_CREATE: True + results: + WORLD_FILE: + name: expected/gdal/dem.wld + type: file + PRJ_FILE: + name: expected/gdal/dem.prj + type: file + + - algorithm: gdal:extractprojection + name: Extract Projection (extractprojection) + params: + INPUT: + name: dem.tif + type: raster + PRJ_FILE_CREATE: False + results: + WORLD_FILE: + name: expected/gdal/dem.wld + type: file + - algorithm: gdal:gdalinfo name: gdalinfo params: