[Qgis-user] Pyqgis how to append existing gpkg layer
Anne B. Nilsen
anne.b.nilsen at nibio.no
Wed Apr 26 05:58:40 PDT 2023
I'm not a pyQGIS-expert, but with help from gis.stackechange.com I have managed to create an empty geopackage file and then adding several layers to it with this code:
...
gpkg_reg = "karplanteregistrering.gpkg" # the NEW gpkg to be created
if os.path.exists(gpkg_reg): # If gpkg-file already exists, delete it
os.remove(gpkg_reg)
...
# https://gis.stackexchange.com/questions/417916/creating-empty-layers-in-a-geopackage-using-pyqgis?noredirect=1&lq=1
def create_blank_gpkg_layer(gpkg_path: str, layer_name: str, geometry: int,
crs: str, fields: QgsFields, append: bool = False
) -> bool:
# To add a layer to an existing GPKG file, pass 'append' as True
options = QgsVectorFileWriter.SaveVectorOptions()
options.driverName = "GPKG"
options.layerName = layer_name
if append:
options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer
writer = QgsVectorFileWriter.create(
gpkg_path,
fields,
geometry,
QgsCoordinateReferenceSystem(crs),
QgsCoordinateTransformContext(),
options)
del writer
return True
...
# Layer 1 oversikt - creating an empty layer with attributes read from a csv-file
f = open("./egenskaper/egenskaper_oversikt.csv",'r') # open file
f.readline() # read the first line of the file (the "metadata"/heading)
layer_name = "oversikt" # set layer name
print('creates layer', layer_name) # print layer name
geom = QgsWkbTypes.PointZ # geometrytype
crs = 'epsg:25832' # coordinate system
fields = QgsFields()
for line in f: # Read attrubutes from csv-file
r = {}
r = line.split(';') # 0 navn, 1 QVariant-type, 2 lengde og 3 presisjon
fname = r[0]
l = int(r[2])
p = int(r[3])
try:
fields.append(QgsField(fname,set_variant(r[1]),'',l,p)) # add field to layer
except:
print("Noe gikk galt - får ikke laget egenskaper fra " +str(f))
f.close() # close file
create_blank_gpkg_layer(gpkg_reg, layer_name, geom, crs, fields) # Do NOT include True when the FIRST layer is created
# Layer 2 arter (to be added to the same new gpkg-file just created above)
f = open("./egenskaper/egenskaper_arter.csv",'r') # open file
f.readline()
layer_name = "arter"
print('creates layer', layer_name) # print layer name
geom = QgsWkbTypes.PointZ # geometrytype
crs = 'epsg:25832' # coordinate system
fields = QgsFields()
for line in f: # Read attrubutes from csv-file
r = {}
r = line.split(';') # 0 navn, 1 QVariant-type, 2 lengde og 3 presisjon
fname = r[0]
l = int(r[2])
p = int(r[3])
try:
fields.append(QgsField(fname,set_variant(r[1]),'',l,p)) # add field to layer
except:
print("Noe gikk galt - får ikke laget egenskaper fra " +str(f))
f.close() # close file
create_blank_gpkg_layer(gpkg_reg, layer_name, geom, crs, fields, True) # Include True to add a new layer to the SAME gpkg-file
...
Note the difference in the use of True and not when calling create_blank_gpk_layer().
Perhaps something similar may be the solution to your problem.
Kind regards
Anne
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-user/attachments/20230426/c8403219/attachment.htm>
More information about the QGIS-User
mailing list