def _testGeneratePyramids(self, pyramidFormat): tmpName = tempfile.mktemp(suffix='.tif') source = QgsRasterLayer( os.path.join(self.testDataDir, 'raster', 'byte.tif'), 'my', 'gdal') self.assertTrue(source.isValid()) provider = source.dataProvider() fw = QgsRasterFileWriter(tmpName) fw.setBuildPyramidsFlag(QgsRaster.PyramidsFlagYes) fw.setPyramidsFormat(pyramidFormat) fw.setPyramidsList([2]) pipe = QgsRasterPipe() self.assertTrue(pipe.set(provider.clone())) projector = QgsRasterProjector() projector.setCrs(provider.crs(), provider.crs()) self.assertTrue(pipe.insert(2, projector)) self.assertEqual( fw.writeRaster(pipe, provider.xSize(), provider.ySize(), provider.extent(), provider.crs()), 0) del fw ds = gdal.Open(tmpName) self.assertEqual(ds.GetRasterBand(1).GetOverviewCount(), 1) fl = ds.GetFileList() if pyramidFormat == QgsRaster.PyramidsGTiff: self.assertEqual(len(fl), 2, fl) self.assertIn('.ovr', fl[1]) elif pyramidFormat == QgsRaster.PyramidsInternal: self.assertEqual(len(fl), 1, fl) elif pyramidFormat == QgsRaster.PyramidsErdas: self.assertEqual(len(fl), 2, fl) self.assertIn('.aux', fl[1]) os.unlink(tmpName)
def save_raster_as_geotif(raster_layer, project_dir): """Save raster layer as GeoTiff in the project directory.""" new_raster_filename = get_unique_filename(raster_layer.name() + ".tif") layer_filename = os.path.join(project_dir, os.path.basename(new_raster_filename)) # Get data type info to set a proper compression type dp = raster_layer.dataProvider() is_byte_data = [ dp.dataType(i) <= Qgis.Byte for i in range(raster_layer.bandCount()) ] compression = "JPEG" if all(is_byte_data) else "LZW" writer_options = [f"COMPRESS={compression}", "TILED=YES"] raster_writer = QgsRasterFileWriter(layer_filename) raster_writer.setCreateOptions(writer_options) raster_writer.setBuildPyramidsFlag(QgsRaster.PyramidsFlagYes) raster_writer.setPyramidsFormat(QgsRaster.PyramidsInternal) raster_writer.setPyramidsList([2, 4, 8, 16, 32, 64, 128]) write_raster(raster_layer, raster_writer, layer_filename)