5 votos

Sobrescribir capa raster existente utilizando PyQGIS

QgsVectorFileWriter le permite sobrescribir una capa existente con su salida, pero no he encontrado una opción similar con QgsRasterFileWriter. Aqui esta mi codigo que esta escribiendo una capa raster a 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

2voto

Dror Bogin Puntos 118

Intenté buscar el overwrite opción de creación en el GPKG Raster detalles del proveedor en GDAL.
Parece que no existe, a diferencia de GPKG Vector .

No obstante, puede eliminar la capa ráster del GeoPaquete y escribir una con el mismo nombre.
Esta parte eliminará el ráster del GeoPaquete por su nombre:

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()

Y esta parte utilizará GDAL CLI para guardar su entrada en el GeoPackage. Nunca he utilizado el QgsRasterFileWriter pero tu código parece que será válido si el GeoPackage permite escribir (lo que debería ser posible si se borran todos los valores anteriores).
Esta declaración GDAL hace exactamente lo mismo si se utiliza la fuente correcta.

# 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)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X