[Qgis-user] Pyqgis how to append existing gpkg layer
Germán Carrillo
carrillo.german at gmail.com
Wed Apr 26 07:52:21 PDT 2023
Hi all,
that's right Andrea. It actually depends on whether you want to append
features to an existing layer, or to "append" (one could also say "create")
a layer (in)to an existing GPKG database. The latter case is well covered
by Anne's answer.
See prior messages in this thread:
https://lists.osgeo.org/pipermail/qgis-user/2023-April/052855.html
Regards,
Germán
El mié, 26 abr 2023 a las 9:11, andrea antonello via QGIS-User (<
qgis-user at lists.osgeo.org>) escribió:
> Hi, from what I saw in the docs, you should be able to append to layers
> with the filewriter option AppendToLayerNoNewFields?
> The CreateOrOverwriteLayer overwrites the layer completely.
>
> Cheers,
> Andrea
>
>
> On Wed, Apr 26, 2023 at 2:58 PM Anne B. Nilsen via QGIS-User <
> qgis-user at lists.osgeo.org> wrote:
>
>> 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
>>
>>
>>
>>
>> _______________________________________________
>> QGIS-User mailing list
>> QGIS-User at lists.osgeo.org
>> List info: https://lists.osgeo.org/mailman/listinfo/qgis-user
>> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-user
>>
> _______________________________________________
> QGIS-User mailing list
> QGIS-User at lists.osgeo.org
> List info: https://lists.osgeo.org/mailman/listinfo/qgis-user
> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-user
>
--
-----------
|\__
(:>__)(
|/
Soluciones Geoinformáticas Libres
http://geotux.tuxfamily.org/
https://twitter.com/GeoTux2 <http://twitter.com/GeoTux2>
<http://gis.stackexchange.com/users/4972/germ%c3%a1n-carrillo>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-user/attachments/20230426/cd7377b8/attachment.htm>
More information about the QGIS-User
mailing list