使用PyQGIS将矢量与栅格图层导出至同一GeoPackage(gpkg)
如何将Shapefile和GTiff格式图层导出到同一个GeoPackage文件?
单独导出矢量或栅格图层到GeoPackage(GPKG)文件是可行的,但无法将两种类型的图层保存到同一个GPKG文件中。我发现写入栅格图层时无法直接更新已有的GPKG,于是尝试先创建临时GPKG,再将内容合并到目标输出文件中,相关代码如下:
def save_as_gpkg(self, layers: List[QgsVectorLayer]): for layer in layers: layer_name = layer.name() context = QgsProject.instance().transformContext() if layer.type() == QgsMapLayer.VectorLayer: options = QgsVectorFileWriter.SaveVectorOptions() options.layerName = layer_name options.fileEncoding = layer.dataProvider().encoding() options.driverName = "GPKG" if os.path.exists(self.output): options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer else: options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteFile options.EditionCapability = 0 res = QgsVectorFileWriter.writeAsVectorFormatV3(layer, self.output, context, options) elif layer.type() == QgsMapLayer.RasterLayer: if layer.isValid(): overwrite = [f"RASTER_TABLE={layer_name}", "OVERWRITE=YES", "APPEND_SUBDATASET=YES"] if os.path.exists(self.output): temp_gpkg = tempfile.NamedTemporaryFile(suffix='.gpkg', delete=False) writer = QgsRasterFileWriter(temp_gpkg.name) writer.setCreateOptions(overwrite) pipe = QgsRasterPipe() pipe.set(layer.dataProvider().clone()) res = writer.writeRaster(pipe, layer.width(), layer.height(),layer.extent(), layer.crs(), context) temp_gpkg.close() raster_ds = gdal.Open(temp_gpkg.name) raster_driver = gdal.GetDriverByName('GPKG') new_raster_ds = raster_driver.Create(self.output, raster_ds.RasterXSize, raster_ds.RasterYSize, raster_ds.RasterCount, gdal.GDT_Float32) geotransform = raster_ds.GetGeoTransform() new_raster_ds.SetGeoTransform(geotransform) for i in range(1, raster_ds.RasterCount + 1): band = raster_ds.GetRasterBand(i) data = band.ReadAsArray() new_raster_ds.GetRasterBand(i).WriteArray(data) new_raster_ds.FlushCache() else: writer = QgsRasterFileWriter(self.output) writer.setCreateOptions(overwrite) pipe = QgsRasterPipe() pipe.set(layer.dataProvider().clone()) res = writer.writeRaster(pipe, layer.width(), layer.height(), layer.extent(), layer.crs(), context)
有趣的是,QgsProject.instance().write(f"geopackage:{self.output}")这段代码可以正常实现混合类型图层导出到同一个GPKG的需求。
内容的提问来源于stack exchange,提问作者Vera PL
相关产品推荐
相关产品推荐

