Hi Germán,

options.actionOnExistingFile = QgsVectorFileWriter.AppendToLayerNoNewFields

Was the key. Thanks !



[cid:image001.jpg@01D97369.4FF99FA0]
Sylvain PIERRE
Chef de projet système d’information
Direction des Systèmes d’Information et du Développement Numérique
Service Projets et Ingénierie Numérique
Collectivité européenne d’Alsace
Tél : 03 88 76 68 88
sylvain.pie...@alsace.eu<mailto:sylvain.pie...@alsace.eu>
www.alsace.eu<http://www.alsace.eu>
[facebook]<http://www.facebook.com/toutelalsace> [twitter] 
<http://www.twitter.com/toutelalsace>  [insta] 
<http://www.instagram.com/toutelalsace>

De : Germán Carrillo <carrillo.ger...@gmail.com>
Envoyé : mercredi 19 avril 2023 17:16
À : PIERRE Sylvain <sylvain.pie...@alsace.eu>
Cc : qgis-user@lists.osgeo.org; qgis-develo...@lists.osgeo.org
Objet : Re: [QGIS-Developer] Pyqgis how to append existing gpkg layer

Soyez vigilant : ce courriel provient d'une organisation externe à la CeA.
• Assurez-vous d’abord qu’il ne s’agit pas d’un email malveillant avant de 
cliquer sur tout lien ou pièce jointe.
Apprendre à reconnaître un email de 
phishing.<https://intranet.alsace.eu/actualites/apprenez-a-reconnaitre-un-email-phishing/>
Bonjour Sylvain,

J'espère que vous allez bien.


If you want to append features from a source layer to another layer that 
already exists in a GPKG file, you can do this:

-----------------------------------------------------------------------------------------------------
options = QgsVectorFileWriter.SaveVectorOptions()
options.driverName = "GPKG"
options.layerName = "my_existing_layer_name"  # Write here the existing layer 
name in the GPKG
options.actionOnExistingFile = QgsVectorFileWriter.AppendToLayerNoNewFields
options.onlySelectedFeatures = True

path = "/tmp/existing_gpkg_file_path.gpkg"
layer = QgsVectorLayer("/tmp/my_source_layer.shp", "my source layer name", 
"ogr")

result = QgsVectorFileWriter.writeAsVectorFormatV3(
    layer,
    path,  # Existing GPKG file path
    layer.transformContext(),
    options)
-----------------------------------------------------------------------------------------------------


If on the contrary, you want to append a whole layer (with its own field 
structure, crs, etc.) to an existing GPKG database, you can follow this 
solution:

https://gis.stackexchange.com/a/417950


As you can see, the key is to define the options.actionOnExistingFile property, 
whose possible values are well documented here:

https://api.qgis.org/api/3.28/classQgsVectorFileWriter.html#afda86eff21ac1da7dc42cbdde424acb1


Note: SInce we're using writeAsVectorFormatV3(), you need at least QGIS v3.20 
for this solution to work.


Regards,

Germán



El mié, 19 abr 2023 a las 3:55, PIERRE Sylvain via QGIS-Developer 
(<qgis-develo...@lists.osgeo.org<mailto:qgis-develo...@lists.osgeo.org>>) 
escribió:
Hi dev and users

I don’t understand how to append an existing gpkg layer with pyqgis.
I’ve tried many QgsVectorFileWriter options

self.options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer

reset final layer

And
self.options.EditionCapability = QgsVectorFileWriter.CanAppendToExistingLayer

does not change anything

So what’s the good way to do this ?

This is my code (I’m iterating over several other data sources)
        self.options = QgsVectorFileWriter.SaveVectorOptions()
        self.options.driverName = 'GPKG'
        self.options.onlySelectedFeatures = True
        self.options.layerName = 'parcelles'

        for dir in dirs:
            print(dir)

            if os.path.isdir(dir):
                db_GPKG = os.path.join(dir, 'MAEC2023.gpkg')
                if os.path.exists(db_GPKG):
                    gpkg_layer = db_GPKG + "|layername=parcelles"
                    RPG_layer = QgsVectorLayer(gpkg_layer, "RPG", "ogr")

                    expr = (' "fk_mesure" is not null ')
                    #expr = ('"fk_mesure" = \'{}\'').format('MAEC Papillons')

                    RPG_layer.selectByExpression(expr)
                    selected_feature = RPG_layer.selectedFeatures()
                    print(len(selected_feature))
                    if os.path.exists(self.db_GPKG): # if the ouput file 
already exist
                        self.options.actionOnExistingFile = 
QgsVectorFileWriter.CreateOrOverwriteLayer
                        #self.options.actionOnExistingFile = 
QgsVectorFileWriter.AppendToLayerNoNewFields
                        #self.options.actionOnExistingFile = 
QgsVectorFileWriter.AppendToLayerAddFields
                        self.options.EditionCapability = 
QgsVectorFileWriter.CanAppendToExistingLayer
                    else:
                        self.options.actionOnExistingFile = 
QgsVectorFileWriter.CreateOrOverwriteFile

                    write_result, error_message = 
QgsVectorFileWriter.writeAsVectorFormatV2(RPG_layer, self.db_GPKG , 
self.context, self.options)



Thanks


[cid:image005.jpg@01D97369.4FF99FA0]
Sylvain PIERRE
Chef de projet système d’information
Direction des Systèmes d’Information et du Développement Numérique
Service Projets et Ingénierie Numérique
Collectivité européenne d’Alsace
Tél : 03 88 76 68 88
sylvain.pie...@alsace.eu<mailto:sylvain.pie...@alsace.eu>
www.alsace.eu<http://www.alsace.eu>
[facebook]<http://www.facebook.com/toutelalsace> [twitter] 
<http://www.twitter.com/toutelalsace>  [insta] 
<http://www.instagram.com/toutelalsace>

_______________________________________________
QGIS-Developer mailing list
qgis-develo...@lists.osgeo.org<mailto:qgis-develo...@lists.osgeo.org>
List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer


--
-----------
   |\__
(:>__)(
   |/
Soluciones Geoinformáticas Libres
http://geotux.tuxfamily.org/
https://twitter.com/GeoTux2<http://twitter.com/GeoTux2>

[Image supprimée par 
l'expéditeur.]<http://gis.stackexchange.com/users/4972/germ%c3%a1n-carrillo>
_______________________________________________
QGIS-User mailing list
QGIS-User@lists.osgeo.org
List info: https://lists.osgeo.org/mailman/listinfo/qgis-user
Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-user

Reply via email to