Skip to content

Commit

Permalink
Backport of GDAL extractprojection reintroduction to 3.4
Browse files Browse the repository at this point in the history
  • Loading branch information
havatv committed Nov 15, 2018
1 parent 6a74609 commit 576a3fd
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 21 deletions.
4 changes: 2 additions & 2 deletions python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -181,7 +181,7 @@ def loadAlgorithms(self):
tri(),
warp(),
# rasterize(),
# ExtractProjection(),
ExtractProjection(),
# rasterize_over(),
# ----- OGR tools -----
Buffer(),
Expand Down
69 changes: 50 additions & 19 deletions python/plugins/processing/algs/gdal/extractprojection.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,24 +32,37 @@
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]


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'
Expand All @@ -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')
Expand All @@ -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)
Expand All @@ -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
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
0.00010000
0.00000000
0.00000000
-0.00010000
18.66634794
45.81165144
27 changes: 27 additions & 0 deletions python/plugins/processing/tests/testdata/gdal_algorithm_tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down

0 comments on commit 576a3fd

Please sign in to comment.