You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:33:19