Skip to main content
edited body
Source Link
Taras
  • 34k
  • 4
  • 73
  • 148
from qgis.utils import iface
from qgis.core import QgsRasterFileWriter

layer = iface.activeLayer()
provider = layer.dataProvider()

out_file = provider.dataSourceUri().replace('.tif', '.img')
file_writer = QgsRasterFileWriter(out_file)
result = file_writer.writeRaster(provider.xSize(), provider.xSizeySize(), provider.extent(), provider.crs())
from qgis.utils import iface
from qgis.core import QgsRasterFileWriter

layer = iface.activeLayer()
provider = layer.dataProvider()

out_file = provider.dataSourceUri().replace('.tif', '.img')
file_writer = QgsRasterFileWriter(out_file)
result = file_writer.writeRaster(provider.xSize(), provider.xSize(), provider.extent(), provider.crs())
from qgis.utils import iface
from qgis.core import QgsRasterFileWriter

layer = iface.activeLayer()
provider = layer.dataProvider()

out_file = provider.dataSourceUri().replace('.tif', '.img')
file_writer = QgsRasterFileWriter(out_file)
result = file_writer.writeRaster(provider.xSize(), provider.ySize(), provider.extent(), provider.crs())
added 3 characters in body
Source Link
Taras
  • 34k
  • 4
  • 73
  • 148

⚠️ As was mentioned in @user30184's comment it is vital to include the pipe-parameter of the QgsRasterPipe class type:

As was mentioned in @user30184's comment it is vital to include the pipe-parameter of the QgsRasterPipe class type:

⚠️ As was mentioned in @user30184's comment it is vital to include the pipe-parameter of the QgsRasterPipe class type:

Source Link
Taras
  • 34k
  • 4
  • 73
  • 148

I could get the same TypeError:

File "C:\OSGeo4W\apps\Python312\Lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "<string>", line 8, in <module>
TypeError: QgsRasterFileWriter.writeRaster(): arguments did not match any overloaded call:
  overload 1: argument 1 has unexpected type 'int'
  overload 2: argument 1 has unexpected type 'int'

when I proceeded with this script:

from qgis.utils import iface
from qgis.core import QgsRasterFileWriter

layer = iface.activeLayer()
provider = layer.dataProvider()

out_file = provider.dataSourceUri().replace('.tif', '.img')
file_writer = QgsRasterFileWriter(out_file)
result = file_writer.writeRaster(provider.xSize(), provider.xSize(), provider.extent(), provider.crs())

As was mentioned in @user30184's comment it is vital to include the pipe-parameter of the QgsRasterPipe class type:

Contains a pipeline of raster interfaces for sequential raster processing.

There are also several suggestions regarding your code:

  • check firstly details about the writeRaster()-method with help(QgsRasterFileWriter.writeRaster):

     Help on built-in function writeRaster:
    
     writeRaster(...)
         writeRaster(self, pipe: Optional[QgsRasterPipe], nCols: int, nRows: int, outputExtent: QgsRectangle, crs: QgsCoordinateReferenceSystem, feedback: Optional[QgsRasterBlockFeedback] = None) -> Qgis.RasterFileWriterResult
         Write raster file
    
         :param pipe: raster pipe
         :param nCols: number of output columns
         :param nRows: number of output rows (or -1 to automatically calculate row number to have square pixels)
         :param outputExtent: extent to output
         :param crs: crs to reproject to
         :param feedback: optional feedback object for progress reports
    
         .. deprecated:: QGIS 3.8
           use version with transformContext instead
    
  • treat file export results properly using the Qgis.RasterFileWriterResult

  • make use of the QgsRasterBlockFeedback class and its errors()-method to get more details about errors while retrieving the raster block

  • apply the Python Try Except blocks to handle errors and exceptions

  • check if your input QgsRasterLayer is solid with the isValid()-method

  • imports can be useful to make your code reusable in the future in standalone applications

  • delete the writer object with del statement

In the end, your code may look as follows:

from qgis.utils import iface
from qgis.core import Qgis, QgsRasterPipe, QgsRasterFileWriter, QgsRasterBlockFeedback

layer = iface.activeLayer()

if layer.isValid():
    provider = layer.dataProvider()

    pipe = QgsRasterPipe()
    pipe.set(provider.clone())

    out_file = provider.dataSourceUri().replace('.tif', '.img')
    file_writer = QgsRasterFileWriter(out_file)

    try:
        feedback = QgsRasterBlockFeedback()
        result = file_writer.writeRaster(pipe, provider.xSize(), provider.xSize(), provider.extent(), provider.crs(), feedback)
        if result != Qgis.RasterFileWriterResult.Success:
            print(feedback.errors())
    except Exception as e:
        print(e)
        
    del file_writer

References: