Sovrascrivi il livello raster esistente utilizzando PyQGIS
QgsVectorFileWriter consente di sovrascrivere un livello esistente con l'output, ma non ho trovato un'opzione simile con QgsRasterFileWriter. Ecco il mio codice che sta scrivendo un layer raster su un geopackage:
ds = ogr.Open(gpkg, True)
pipe = QgsRasterPipe()
provider=layer_in.dataProvider()
file_writer = QgsRasterFileWriter(gpkg)
file_writer.setOutputFormat('gpkg')
file_writer.setCreateOptions([f"RASTER_TABLE={layer_name}", 'APPEND_SUBDATASET=YES'])
if pipe.set(provider.clone()):
projector = QgsRasterProjector()
projector.setCrs(provider.crs(), provider.crs())
if pipe.insert(2, projector) is True:
if file_writer.writeRaster(pipe, provider.xSize(),provider.ySize(),provider.extent(),provider.crs()) == 0:
feedback.pushInfo(f"ok")
else:
feedback.pushInfo(f"error: {file_writer.writeRaster(pipe, provider.xSize(),provider.ySize(),provider.extent(),provider.crs())} {help(file_writer.setCreateOptions)}")
ds = None
Risposte
Ho provato a cercare l' overwriteopzione di creazione nei GPKG Rasterdettagli del provider in GDAL.
Sembra che non esista, al contrario di GPKG Vector.
È comunque possibile eliminare il layer raster dal GeoPackage e quindi scriverne uno con lo stesso nome.
Questa parte eliminerà il raster dal GeoPackage per nome:
import os
import sqlite3
gpkg = 'path/to/your/db.gpkg'
layer_name= 'superawesomeraster'
conn = sqlite3.connect(gpkg)
conn.execute('DROP TABLE IF EXISTS {}'.format(layer_name))
conn.execute('DELETE FROM gpkg_2d_gridded_coverage_ancillary WHERE tile_matrix_set_name = "{}"'.format(layer_name))
conn.execute('DELETE FROM gpkg_2d_gridded_tile_ancillary WHERE tpudt_name="{}"'.format(layer_name));
conn.execute('DELETE FROM gpkg_tile_matrix WHERE table_name="{}"'.format(layer_name));
conn.execute('DELETE FROM gpkg_tile_matrix_set WHERE table_name="{}"'.format(layer_name));
conn.execute('DELETE FROM gpkg_contents WHERE table_name="{}"'.format(layer_name));
conn.execute('DELETE FROM gpkg_extensions WHERE table_name="{}"'.format(layer_name));
conn.commit()
conn.execute('VACUUM')
conn.close()
E questa parte utilizzerà GDAL CLI per salvare l'input nel GeoPackage. Non ho mai usato la QgsRasterFileWriterclasse ma il tuo codice sembra che sarà valido se il GeoPackage consentirà la scrittura (cosa che dovrebbe essere possibile se tutti i valori precedenti vengono cancellati).
Questa istruzione GDAL fa esattamente la stessa cosa se usi l'origine corretta.
# layer_in = iface.activeLayer() # Using the currently active raster as input
inputRas = layer_in.source()
outputRas = gpkg
gdal_string = 'gdal_translate -of GPKG "{}" "{}" -co RASTER_TABLE={} -co APPEND_SUBDATASET=YES'.format(inputRas, outputRas,lyr)
os.system(gdal_string)