def testImportIntoGpkg(self): # init target file test_gpkg = tempfile.mktemp(suffix='.gpkg', dir=self.testDataDir) gdal.GetDriverByName('GPKG').Create(test_gpkg, 1, 1, 1) source = QgsRasterLayer(os.path.join(self.testDataDir, 'raster', 'band3_byte_noct_epsg4326.tif'), 'my', 'gdal') self.assertTrue(source.isValid()) provider = source.dataProvider() fw = QgsRasterFileWriter(test_gpkg) fw.setOutputFormat('gpkg') fw.setCreateOptions(['RASTER_TABLE=imported_table', 'APPEND_SUBDATASET=YES']) 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) # Check that the test geopackage contains the raster layer and compare rlayer = QgsRasterLayer('GPKG:%s:imported_table' % test_gpkg) self.assertTrue(rlayer.isValid()) out_provider = rlayer.dataProvider() self.assertEqual(provider.block(1, provider.extent(), source.width(), source.height()).data(), out_provider.block(1, out_provider.extent(), rlayer.width(), rlayer.height()).data()) # remove result file os.unlink(test_gpkg)
def testImportIntoGpkg(self): # init target file test_gpkg = tempfile.mktemp(suffix='.gpkg', dir=self.testDataDir) gdal.GetDriverByName('GPKG').Create(test_gpkg, 1, 1, 1) source = QgsRasterLayer(os.path.join(self.testDataDir, 'raster', 'band3_byte_noct_epsg4326.tif'), 'my', 'gdal') self.assertTrue(source.isValid()) provider = source.dataProvider() fw = QgsRasterFileWriter(test_gpkg) fw.setOutputFormat('gpkg') fw.setCreateOptions(['RASTER_TABLE=imported_table', 'APPEND_SUBDATASET=YES']) 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) # Check that the test geopackage contains the raster layer and compare rlayer = QgsRasterLayer('GPKG:%s:imported_table' % test_gpkg) self.assertTrue(rlayer.isValid()) out_provider = rlayer.dataProvider() self.assertEqual(provider.block(1, provider.extent(), source.width(), source.height()).data(), out_provider.block(1, out_provider.extent(), rlayer.width(), rlayer.height()).data()) # remove result file os.unlink(test_gpkg)
def save_raster_to_geopackage(raster_layer, project_dir): """Save a GeoPackage raster to GeoPackage table in the project directory.""" layer_filename = get_unique_filename( os.path.join(project_dir, raster_layer.name() + ".gpkg")) raster_writer = QgsRasterFileWriter(layer_filename) raster_writer.setOutputFormat("gpkg") raster_writer.setCreateOptions( [f"RASTER_TABLE={raster_layer.name()}", "APPEND_SUBDATASET=YES"]) write_raster(raster_layer, raster_writer, layer_filename)
def exportRasterLayer(self, layer, destinationFile, options=None): outputFormat = self.settings['rasterFormat'] if 'rasterFormat' in self.settings else 'GTiff' if os.path.splitext(destinationFile)[1] == '': formats = QgsRasterFileWriter.extensionsForFormat(outputFormat) if len(formats) > 0: destinationFile = '{}.{}'.format(destinationFile, formats[0]) provider = layer.dataProvider() cols = provider.xSize() rows = provider.ySize() if not provider.capabilities() & QgsRasterDataProvider.Size: k = float(provider.extent().width()) / float(provider.extent().height()) cols = RASTER_SIZE * k rows = RASTER_SIZE pipe = QgsRasterPipe() if not pipe.set(provider.clone()): QgsMessageLog.logMessage(self.tr('Failed to export layer "{layer}": Cannot set pipe provider.'.format(layer=layer.name())), 'QConsolidate', Qgis.Warning) return False, None nodata = {} for i in range(1, provider.bandCount() + 1): if provider.sourceHasNoDataValue(i): value = provider.sourceNoDataValue(i) nodata[i] = QgsRasterRange(value, value) nuller = QgsRasterNuller() for band, value in nodata.items(): nuller.setNoData(band, [value]) if not pipe.insert(1, nuller): QgsMessageLog.logMessage(self.tr('Failed to export layer "{layer}": Cannot set pipe nuller.'.format(layer=layer.name())), 'QConsolidate', Qgis.Warning) return False, None writer = QgsRasterFileWriter(destinationFile) writer.setOutputFormat(outputFormat) if options is not None: writer.setCreateOptions(options) success = True error = writer.writeRaster(pipe, cols, rows, provider.extent(), provider.crs()) if error != QgsRasterFileWriter.NoError: QgsMessageLog.logMessage(self.tr('Failed to export layer "{layer}": {message}.'.format(layer=layer.name(), message=error)), 'QConsolidate', Qgis.Warning) success = False return success, destinationFile
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)
def exportRasterLayer(self, layer, destinationFile, options=None): outputFormat = self.settings[ 'rasterFormat'] if 'rasterFormat' in self.settings else 'GTiff' if os.path.splitext(destinationFile)[1] == '': formats = QgsRasterFileWriter.extensionsForFormat(outputFormat) if len(formats) > 0: destinationFile = '{}.{}'.format(destinationFile, formats[0]) provider = layer.dataProvider() cols = provider.xSize() rows = provider.ySize() if not provider.capabilities() & QgsRasterDataProvider.Size: k = float(provider.extent().width()) / float( provider.extent().height()) cols = RASTER_SIZE * k rows = RASTER_SIZE pipe = QgsRasterPipe() if not pipe.set(provider.clone()): QgsMessageLog.logMessage( self. tr('Failed to export layer "{layer}": Cannot set pipe provider.' ).format(layer=layer.name()), 'QConsolidate', Qgis.Warning) return False, None nodata = {} for i in range(1, provider.bandCount() + 1): if provider.sourceHasNoDataValue(i): value = provider.sourceNoDataValue(i) nodata[i] = QgsRasterRange(value, value) nuller = QgsRasterNuller() for band, value in nodata.items(): nuller.setNoData(band, [value]) if not pipe.insert(1, nuller): QgsMessageLog.logMessage( self.tr( 'Failed to export layer "{layer}": Cannot set pipe nuller.' ).format(layer=layer.name()), 'QConsolidate', Qgis.Warning) return False, None writer = QgsRasterFileWriter(destinationFile) writer.setOutputFormat(outputFormat) if options is not None: writer.setCreateOptions(options) success = True error = writer.writeRaster(pipe, cols, rows, provider.extent(), provider.crs()) if error != QgsRasterFileWriter.NoError: QgsMessageLog.logMessage( self.tr('Failed to export layer "{layer}": {message}.').format( layer=layer.name(), message=error), 'QConsolidate', Qgis.Warning) success = False return success, destinationFile