如何在 PyQGIS 中向地理包附加/添加图层
How to append / add layers to geopackages in PyQGIS
对于一个项目,我正在创建不同的图层,这些图层应该全部写入一个地理包中。
我正在使用 QGIS 3.16.1 和运行在 Python 3.7
上的 QGIS 中的 Python 控制台
我尝试了很多东西,但不知道该怎么做。这是我目前使用的。
vl = QgsVectorLayer("Point", "points1", "memory")
vl2 = QgsVectorLayer("Point", "points2", "memory")
pr = vl.dataProvider()
pr.addAttributes([QgsField("DayID", QVariant.Int), QgsField("distance", QVariant.Double)])
vl.updateFields()
f = QgsFeature()
for x in range(len(tag_temp)):
f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(lon[x],lat[x])))
f.setAttributes([dayID[x], distance[x]])
pr.addFeature(f)
vl.updateExtents()
# I'll do the same for vl2 but with other data
uri ="D:/Documents/QGIS/test.gpkg"
options = QgsVectorFileWriter.SaveVectorOptions()
context = QgsProject.instance().transformContext()
QgsVectorFileWriter.writeAsVectorFormatV2(vl1,uri,context,options)
QgsVectorFileWriter.writeAsVectorFormatV2(vl2,uri,context,options)
问题是在 'test.gpkg' 中创建了一个名为 'test' 的层,而不是 'points1' 或 'points2'。
第二个 QgsVectorFileWriter.writeAsVectorFormatV2() 也覆盖了第一个的输出,而不是将图层附加到现有的地理包中。
我还尝试创建单个 .geopackages 然后使用 'Package Layers' 处理工具 (processing.run("native:package") 将所有层合并到一个地理包中,但是属性类型是不幸的是,都转换成了字符串。
非常感谢任何帮助。非常感谢。
您需要更改 SaveVectorOptions
,特别是在创建 gpkg 文件后 actionOnExistingFile
的模式:
options = QgsVectorFileWriter.SaveVectorOptions()
#options.driverName = "GPKG"
options.layerName = v1.name()
QgsVectorFileWriter.writeAsVectorFormatV2(v1,uri,context,options)
#switch mode to append layer instead of overwriting the file
options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer
options.layerName = v2.name()
QgsVectorFileWriter.writeAsVectorFormatV2(v2,uri,context,options)
文档在这里:SaveVectorOptions
I also tried to create single .geopackages and then use 'Package Layers' processing tool (processing.run("native:package") to merge all layers into one geopackage, but then the attributes types are all converted into strings unfortunately.
这绝对是推荐的方式,请考虑报告错误
对于一个项目,我正在创建不同的图层,这些图层应该全部写入一个地理包中。 我正在使用 QGIS 3.16.1 和运行在 Python 3.7
上的 QGIS 中的 Python 控制台我尝试了很多东西,但不知道该怎么做。这是我目前使用的。
vl = QgsVectorLayer("Point", "points1", "memory")
vl2 = QgsVectorLayer("Point", "points2", "memory")
pr = vl.dataProvider()
pr.addAttributes([QgsField("DayID", QVariant.Int), QgsField("distance", QVariant.Double)])
vl.updateFields()
f = QgsFeature()
for x in range(len(tag_temp)):
f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(lon[x],lat[x])))
f.setAttributes([dayID[x], distance[x]])
pr.addFeature(f)
vl.updateExtents()
# I'll do the same for vl2 but with other data
uri ="D:/Documents/QGIS/test.gpkg"
options = QgsVectorFileWriter.SaveVectorOptions()
context = QgsProject.instance().transformContext()
QgsVectorFileWriter.writeAsVectorFormatV2(vl1,uri,context,options)
QgsVectorFileWriter.writeAsVectorFormatV2(vl2,uri,context,options)
问题是在 'test.gpkg' 中创建了一个名为 'test' 的层,而不是 'points1' 或 'points2'。 第二个 QgsVectorFileWriter.writeAsVectorFormatV2() 也覆盖了第一个的输出,而不是将图层附加到现有的地理包中。
我还尝试创建单个 .geopackages 然后使用 'Package Layers' 处理工具 (processing.run("native:package") 将所有层合并到一个地理包中,但是属性类型是不幸的是,都转换成了字符串。
非常感谢任何帮助。非常感谢。
您需要更改 SaveVectorOptions
,特别是在创建 gpkg 文件后 actionOnExistingFile
的模式:
options = QgsVectorFileWriter.SaveVectorOptions()
#options.driverName = "GPKG"
options.layerName = v1.name()
QgsVectorFileWriter.writeAsVectorFormatV2(v1,uri,context,options)
#switch mode to append layer instead of overwriting the file
options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer
options.layerName = v2.name()
QgsVectorFileWriter.writeAsVectorFormatV2(v2,uri,context,options)
文档在这里:SaveVectorOptions
I also tried to create single .geopackages and then use 'Package Layers' processing tool (processing.run("native:package") to merge all layers into one geopackage, but then the attributes types are all converted into strings unfortunately.
这绝对是推荐的方式,请考虑报告错误