Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 25 June 2019 07:59

Feneck91
Juste Inscrit !
Date d'inscription: 24 Jun 2019
Messages: 4

QGIS 3.X: Intégrer le style (symbologie) dans un geopackage

Bonjour à tous et à toutes.

Je suis développeur pour une grande société française.
L'entité dans laquelle je travaille réalise des cartes, l'outils QGIS (3.x) est utilisé.

Nous utilisons une base de données postgresql afin de gérer les donnés vectorielle. Un besoin a été de réaliser un plugin afin de sélectionner les données intéressantes à consulter.
Autre point : la capacité de faire un export afin de mettre tout un projet sur un clef ou disque dur afin de travailler de chez soi.

Ceci fonctionne plutôt bien. On peut même y intégrer les rasters mais ce n'est pas très rapide et je pense que les pyramides ne sont pas calculées.
La chose que je voudrais faire, c'est que, pour le format GeoPackage, je puis intégrer toutes les layers mais aussi la symbologie.
Actuellement j'exporte le fichier projet QGS et je le patch pour que ça fonctionne.

Mais, on peut intégrer la symbologie dans le géopackage, hélas rien ne semble fonctionner et mes multiples recherches sur internet n'ont rien données.
Je vous livre une partie du programme python.
Ça pourrait même vous servir...

Le code "options.symbologyExport = QgsVectorFileWriter.FeatureSymbology" semble ne rien faire.
Normalement, lorsque la symbologie est présente, un table nommée "layer_styles" doit être présente.

Code:

    #===========================================================================================================================
    # Sauve le document.
    #
    # Exemple : self.saveDocument(documentQLR, "D:\Dev\GeoMaps\QGisPlugins\DMDatabaseVector\Datas\Template\VN2SHP_Template_cpy.qgs")
    #===========================================================================================================================
    def saveDocument(self, documentQLR, strPath):
        fileSave = QFile(strPath)
        if fileSave.open(QIODevice.WriteOnly | QIODevice.Text):
            ouStream = QTextStream(fileSave)
            ouStream.setCodec("UTF-8")
            ouStream  0:
            try:
                QSettings().setValue(f"DMDatabaseVector/Settings/ExportFilePath", strFileName)
                bAlwaysCopyRasterFiles = QSettings().value(f"DMDatabaseVector/Settings/AlwaysCopyRasterFiles", True, type=bool)
                self.CreateSplashScreen(self.CONST_SPLASH_SCREEN_EXPORT, self.tr('Exporting project file...'))
                pInstance = QgsProject.instance()
                strCurrentFilePath = pInstance.absoluteFilePath()
                isDirty = pInstance.isDirty()
                # Suppression si déjà existant
                if os.path.isfile(strFileName):
                    os.remove(strFileName)
                pInstance.write(strFileName)
                pInstance.setFileName(strCurrentFilePath)
                pInstance.setDirty(isDirty)

                if os.path.isfile(strFileName):
                    fileQLR = QFile(strFileName)
                    self.SetSplashScreeMessageAndValue(9.99, self.tr('Reloading exported project file, please wait...'))
                    if fileQLR.open(QIODevice.ReadOnly | QIODevice.Text):
                        if self.__CancelLoading:
                            raise UserWarning(self.tr('Operation canceled by user!'))
                        documentQLR = QDomDocument()
                        bLoadOK = documentQLR.setContent(fileQLR)
                        fileQLR.close()
                        if bLoadOK:
                            layers = QgsProject.instance().mapLayers() # dictionary
                            strFolderPath = os.path.dirname(strFileName)
                            strFileNameWithoutExtension = os.path.splitext(os.path.basename(strFileName))[0]
                            iNumLayerSaved = 0
                            iNbLayers = len(layers.values())
                            iNumLayerSaved, isUniqueFileCreated = self.RecursiveExportQGS(documentQLR, bAlwaysCopyRasterFiles, lambdaFormatLayerName, strFolderPath, strFileNameWithoutExtension, strFormat, strExtension, bOnlyOneFile, [], iNbLayers, 0, False, {}, None)
                            self.SetSplashScreeMessageAndValue(94.0, self.tr('Saving exported project file...'))
                            self.saveDocument(documentQLR, strFileName)
                            self.SetSplashScreeMessageAndValue(100.0, self.tr('Done.'))
                            self.ManagesplashEvents(1.5)
                            bExportOK = True
                        else:
                            raise Exception(self.tr("Bad format for the exported project file '{}'!").format(strFileName))
                    else:
                        raise Exception(self.tr("The exported project file '{}' cannot be read!").format(strFileName))
                else:
                    raise Exception(self.tr("The exported project file '{}' cannot be found!").format(strFileName))
            except UserWarning as ex:
                self.CloseSplashScreen()
                QMessageBox.warning(self, self.tr("Plugin"), "{}".format(ex), QMessageBox.Ok)
            except Exception as ex:
                self.CloseSplashScreen()
                QMessageBox.critical(self, self.tr("Exception"), self.tr("Exception raised: {}").format(ex), QMessageBox.Ok)
            finally:
                self.CloseSplashScreen()
        if bExportOK:
            if QMessageBox.Yes == QMessageBox.question(self, self.tr("Loading exported project ?"), self.tr("Would you like to load the exported project now ?nnBe careful, you will lose all actual project content!"), QMessageBox.Yes, QMessageBox.No):
                QgsProject.instance().clear()
                QgsProject.instance().read(strFileName)
        self.close()

    #===========================================================================================================================
    # Export chaque layer dans un fichier.
    #
    # documentQLR : document contenant le fichier qgs, permet de patcher les sources (fichiers au lieu de BDD)
    # bAlwaysCopyRasterFiles : indique si les rasters doivent toujours être copiés ou pas
    # lambdaFormatLayerName : permet de formatter le nom de la layer à mettre dans "source" et "datasource"
    # strFolderPath : chemin racine où sauver la donnée
    # strFileName :nom du fichier sans l'extension, non utilisé si sauvegarde en multi fichier
    # strFormat : format d'exportation
    # strExtension : extension (sans le '.')
    # bOnlyOneFile : sauvegarde dans un seul fichier ou en multi-fichier (un par layer)
    # lstArboFolders : liste de l'arborescence des répertoires
    # iNbLayersToSave : Nombre de layers à sauver (pour calculer le % d'avancement)
    # iNumLayerSaved :  Nombre de layers déjà sauvées (pour calculer le % d'avancement)
    # isUniqueFileCreated : Ne vaut true QUE lorsque le fichier unique a été créé. En effet si la première couche a créer est un raster que l'option bAlwaysCopyRasterFiles est true, à la deuxième layer à créer le iNumLayerSaved sera = 1 et les
    #                       options de création ne seront pas corrects.
    # dicLayersName : Nom des layers déjà sauvées, utilisé lorsque bOnlyOneFile est True pour ne pas réutiliser le même nom deux fois dans un fichier unique
    # layerRoot : Noeud racine (appel récursif)
    #===========================================================================================================================
    def RecursiveExportQGS(self, documentQLR, bAlwaysCopyRasterFiles, lambdaFormatLayerName, strFolderPath, strFileName, strFormat, strExtension, bOnlyOneFile, lstArboFolders, iNbLayersToSave, iNumLayerSaved, isUniqueFileCreated, dicLayersName, layerRoot = None):
        layerRoot = layerRoot if not (layerRoot is None) else QgsProject.instance().layerTreeRoot()
        for layerTreeNode in layerRoot.children():
            if self.__CancelLoading:
                raise UserWarning(self.tr('Operation canceled by user!'))
            if QgsLayerTree.isLayer(layerTreeNode):
                layer = None
                try:
                    layer = layerTreeNode.layer()
                except Exception as ex:
                    try:
                        for layerNodeBlc in QgsProject.instance().layerTreeRoot().findLayers():
                            if layerNodeBlc.name() == layerTreeNode.name() and layerNodeBlc.parent().name() == layerTreeNode.parent().name():
                                layer = layerNodeBlc.layer()
                                break
                    except Exception as ex:
                        # La layer est vide, n'existe pas, il faut l'ignorer
                        pass

                # Initialiser les options
                options = QgsVectorFileWriter.SaveVectorOptions()
                options.driverName = strFormat
                options.fileEncoding = "utf-8"

                if not(layer is None) and layer.isValid() and (isinstance(layer, QgsVectorLayer) or isinstance(layer, QgsRasterLayer)):
                    # Mettre à jour la splash screen
                    self.SetSplashScreeMessageAndValue(10.0 + iNumLayerSaved * (80.0 / iNbLayersToSave), self.tr('Exporting layer {}...').format(layer.name()))

                    # Calcul layer name
                    strLayerNameIntoDic = ""
                    if bOnlyOneFile :
                        # Calculer le nom de la layer
                        options.layerName = ".".join(lstArboFolders) + ("" if len(lstArboFolders) == 0 else ".") + "_".join(layer.name().split(' '))
                        iIndexLayerNameSame = 2
                        # Faire en sorte qu'elle soit unique
                        while options.layerName in dicLayersName:
                            strLayerName = (".".join(lstArboFolders) + ("" if len(lstArboFolders) == 0 else ".") + "_".join(layer.name().split(' '))) + f"~{iIndexLayerNameSame}"
                            iIndexLayerNameSame += 1

                        strLayerNameIntoDic = options.layerName
                    else:
                        options.layerName = "_".join(layer.name().split(' '))
                        iIndexLayerNameSame = 2
                        # Faire en sorte qu'elle soit unique
                        while os.path.join(*lstArboFolders, options.layerName) in dicLayersName:
                            strLayerName = "_".join(layer.name().split(' ')) + f"~{iIndexLayerNameSame}"
                            iIndexLayerNameSame += 1
                        strLayerNameIntoDic = os.path.join(*lstArboFolders, options.layerName)

                    # Récupération des informations dans le fichier qgs
                    strInfoLayerDatas = None
                    qDomNodeCurrent = documentQLR.documentElement().firstChildElement("projectlayers")
                    if not qDomNodeCurrent.isNull():
                        qDomNodeCurrent = qDomNodeCurrent.firstChildElement("maplayer")
                        if not qDomNodeCurrent.isNull() :
                            qDomNodeCurrent = self.findChildNodeFromAttributeOrNode(qDomNodeCurrent, "id", layer.id(), False)
                            if not qDomNodeCurrent.isNull():
                                qDomElementDataSource = qDomNodeCurrent.firstChildElement("datasource")
                                qDomElementProvider   = qDomNodeCurrent.firstChildElement("provider")
                                if not (qDomElementDataSource.isNull()) :
                                    if not (qDomElementProvider.isNull()):
                                        strInfoLayerDatas = qDomElementProvider.firstChild().nodeValue() + "¤" + qDomElementDataSource.firstChild().nodeValue()
                                    else:
                                        raise Exception(self.tr("Dom node '{}' not found for layer = '{}' / id = '{}'!").format("provider", layer.name(), layer.id()))
                                else:
                                    raise Exception(self.tr("Dom node '{}' not found for layer = '{}' / id = '{}'!").format("datasource", layer.name(), layer.id()))
                            else:
                                raise Exception(self.tr("Dom node '{}' not found for layer = '{}' / id = '{}'!").format("id", layer.name(), layer.id()))
                        else:
                            raise Exception(self.tr("Dom node '{}' not found for layer = '{}' / id = '{}'!").format("maplayer", layer.name(), layer.id()))
                    else:
                        raise Exception(self.tr("Dom node '{}' not found for layer = '{}' / id = '{}'!").format("projectlayers", layer.name(), layer.id()))

                    for key, val in dicLayersName.items():
                        if val[0] == strInfoLayerDatas:
                            strLayerNameIntoDic = None # On réutilise la même layer que celle qui existe déjà avec les mêmes attributs
                            strDomElementSource = val[1]
                            break

                    if not(strLayerNameIntoDic is None):
                        # Vérifier l'arborescence et créer les répertoires
                        if not(bOnlyOneFile):
                            for iIndex, folderName in enumerate(lstArboFolders):
                                path = os.path.join(strFolderPath, *[lstArboFolders[i] for i in range(0, iIndex)])
                                if os.path.isfile(path):
                                    os.remove(path)
                            path =  os.path.join(strFolderPath, *lstArboFolders)
                            if not(os.path.isdir(path)):
                                os.makedirs(path)

                        if isinstance(layer, QgsVectorLayer):
                            # Calcul des fichiers / répertoires relatifs
                            strFileNameOnly = strFileName + "." + strExtension if bOnlyOneFile else options.layerName + "." + strExtension
                            strFileNameRelativePathOnly = strFileNameOnly if bOnlyOneFile else os.path.join(*lstArboFolders, strFileNameOnly)
                            strFilePath = os.path.join(strFolderPath, strFileNameRelativePathOnly)
                        elif isinstance(layer, QgsRasterLayer):
                            if bOnlyOneFile and not bAlwaysCopyRasterFiles:
                                # Copier dans le fichier unique
                                strFileNameOnly = strFileName + "." + strExtension if bOnlyOneFile else options.layerName + "." + strExtension
                                strFileNameRelativePathOnly = strFileNameOnly if bOnlyOneFile else os.path.join(*lstArboFolders, strFileNameOnly)
                                strFilePath = os.path.join(strFolderPath, strFileNameRelativePathOnly)
                            else:
                                # Copier le fichier source vers la destination
                                strFileNameOnly = os.path.basename(layer.source())
                                strFileNameRelativePathOnly = os.path.join(*lstArboFolders, strFileNameOnly)
                                strFilePath = os.path.join(strFolderPath, strFileNameRelativePathOnly)
                                path = os.path.join(strFolderPath, *lstArboFolders)
                                if not(os.path.isdir(path)):
                                    os.makedirs(path)

                        if not(bOnlyOneFile) or iNumLayerSaved == 0:
                            if os.path.isfile(strFilePath):
                                os.remove(strFilePath)

                        if bOnlyOneFile and isUniqueFileCreated:
                            options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer

                        # Exportation
                        if isinstance(layer, QgsVectorLayer):
                            strDomElementSource = "./" + strFileNameRelativePathOnly + lambdaFormatLayerName(layer, options.layerName)
                            # QgsVectorFileWriter.SymbologyExport = QgsVectorFileWriter.NoSymbology ----------------> https://qgis.org/pyqgis/master/core/QgsVectorFileWriter.html#qgis.core.QgsVectorFileWriter.writeAsVectorFormat
                            options.symbologyExport = QgsVectorFileWriter.NoSymbology
                            writeResult, errorMessage = QgsVectorFileWriter.writeAsVectorFormat(layer, strFilePath, options)
                            isUniqueFileCreated = True # Une fois passé ici, vaut toujours TRUE
                            if writeResult != 0:
                                raise Exception(self.tr("Error while writing vector layer '{}' / id = '{}': '{}'").format(layer.name(), layer.id(), errorMessage))
                            strProvider = "ogr"
                        elif isinstance(layer, QgsRasterLayer):
                            strProvider = "gdal"
                            if bOnlyOneFile and not bAlwaysCopyRasterFiles:
                                strDomElementSource = strFormat + ":./" + strFileNameRelativePathOnly + lambdaFormatLayerName(layer, options.layerName)
                                pipe = QgsRasterPipe()
                                provider = layer.dataProvider()
                                projector = QgsRasterProjector()
                                projector.setCrs(provider.crs(), provider.crs())
                                if pipe.set(provider.clone()) and pipe.insert(2, projector):
                                    fw = QgsRasterFileWriter(strFilePath)
                                    fw.setOutputFormat(strFormat)
                                    fw.setCreateOptions(["RASTER_TABLE=" + options.layerName, 'APPEND_SUBDATASET=' + ('YES' if OnlyOneFile and isUniqueFileCreated else 'NO'), 'TILE_FORMAT=PNG']) # 'TILING_SCHEME=GoogleMapsCompatible'
                                    if fw.writeRaster(pipe, provider.xSize(),provider.ySize(),provider.extent(),provider.crs()) !=  QgsRasterFileWriter.NoError:
                                        raise Exception(self.tr("Error while writing raster layer '{}' / id = '{}'!").format(layer.name(), layer.id()))
                                    isUniqueFileCreated = True # Une fois passé ici, vaut toujours TRUE
                                else:
                                    raise Exception(self.tr("Error while preparing writing raster layer '{}' / id = '{}'!").format(layer.name(), layer.id()))
                            else:
                                # Copie du raster source au même endroit que la destination
                                source = QFileInfo(layer.source())
                                strDomElementSource = "./" + strFileNameRelativePathOnly
                                if source.exists():
                                    QFile.copy(source.absoluteFilePath(),strFilePath)
                                else:
                                    raise Exception(self.tr("Error while writing raster layer '{}' / id = '{}': file '{}' doesn't exists!").format(layer.name(), layer.id(), source.absoluteFilePath()))

                        dicLayersName[strLayerNameIntoDic] = [strInfoLayerDatas, strDomElementSource]

                    # Patch du fichier qgs
                    # Patch 1 : projectlayers
                    qDomElementDataSource.firstChild().setNodeValue(strDomElementSource)
                    qDomElementProvider.firstChild().setNodeValue(strProvider)

                    # Patch 2 : layer-tree-group
                    qDomNodeCurrent = documentQLR.documentElement().firstChildElement("layer-tree-group")
                    if not qDomNodeCurrent.isNull():
                        qDomNodeCurrent = self.findInLayerTreeGroup(qDomNodeCurrent, "id", layer.id())
                        if not qDomNodeCurrent.isNull():
                            qDomAttributeSource      = self.getNodeAttribute(qDomNodeCurrent, "source")
                            qDomAttributeProviderKey = self.getNodeAttribute(qDomNodeCurrent, "providerKey")
                            if not (qDomAttributeSource.isNull()) :
                                if not (qDomAttributeProviderKey.isNull()):
                                    qDomAttributeSource.setNodeValue(strDomElementSource)
                                    qDomAttributeProviderKey.setNodeValue(strProvider)
                                else:
                                    raise Exception(self.tr("Dom attribute '{}' not found for layer = '{}' / id = '{}'!").format("providerKey", layer.name(), layer.id()))
                            else:
                                raise Exception(self.tr("Dom attribute '{}' not found for layer = '{}' / id = '{}'!").format("source", layer.name(), layer.id()))
                        else:
                            raise Exception(self.tr("Dom node '{}' not found for layer = '{}' / id = '{}'!").format("layer-tree-group", layer.name(), layer.id()))
                    else:
                        raise Exception(self.tr("Dom node '{}' not found for layer = '{}' / id = '{}'!").format("layer-tree-group", layer.name(), layer.id()))

                iNumLayerSaved += 1
            elif QgsLayerTree.isGroup(layerTreeNode):
                lstArboFoldersCopy = copy.deepcopy(lstArboFolders)
                lstArboFoldersCopy.append(layerTreeNode.name())
                iNumLayerSaved, isUniqueFileCreated = self.RecursiveExportQGS(documentQLR, bAlwaysCopyRasterFiles, lambdaFormatLayerName, strFolderPath, strFileName, strFormat, strExtension, bOnlyOneFile, lstArboFoldersCopy, iNbLayersToSave, iNumLayerSaved, isUniqueFileCreated, dicLayersName, layerTreeNode)

        return iNumLayerSaved, isUniqueFileCreated

    #===========================================================================================================================
    # Retrouver le noeud dont sont attribue dont le nom est passé en paramètre est égla à la valeur recherchée.
    #
    # qDomNode : de type QDomNode, est le noeud parent contenant les sous-noeuds.
    # strAttributeName : nom du sous-noeud a rechercher.
    # Retourne la valeur du sous-noeud, None si non trouvé.
    #===========================================================================================================================
    def findInLayerTreeGroup(self, qDomNode, strAttributeName, strAttributeValue):
        while not qDomNode.isNull():
            nodeAttribute = self.findChildNodeFromAttributeOrNode(qDomNode.firstChildElement("layer-tree-layer"), strAttributeName, strAttributeValue, True)
            if nodeAttribute.isNull():
                # Look in children
                nodeAttribute = self.findInLayerTreeGroup(qDomNode.firstChildElement(qDomNode.nodeName()), strAttributeName, strAttributeValue)
            if not(nodeAttribute.isNull()):
                qDomNode = nodeAttribute
                break
            qDomNode = qDomNode.nextSiblingElement(qDomNode.nodeName())
        return qDomNode

Hors ligne

 

#2 Tue 25 June 2019 09:58

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3936

Re: QGIS 3.X: Intégrer le style (symbologie) dans un geopackage

Bonjour,
l'algorithme "Empaquetage de couches" dans la version 3.8 intègre l'export de styles. Peut-être que l'algo seul répond déjà à toute votre problématique d'empaquetage, ou y a-t-il moyen de s'inspirer de son code ou de l'appeler dans votre traitement pour les points qui restent.

Hors ligne

 

#3 Tue 25 June 2019 10:09

Feneck91
Juste Inscrit !
Date d'inscription: 24 Jun 2019
Messages: 4

Re: QGIS 3.X: Intégrer le style (symbologie) dans un geopackage

Merci SANTANA mais c'est quoi l'algorithme "Empaquetage de couches" ?

Hors ligne

 

#4 Tue 25 June 2019 10:26

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3936

Re: QGIS 3.X: Intégrer le style (symbologie) dans un geopackage

Dans QGIS, menu Traitement --> Boite à outils, rechercher empaquetage, le tester.
L'ajout de la fonctionnalité dans le code source: https://github.com/qgis/QGIS/pull/9995 (désolé, c++)

Hors ligne

 

#5 Tue 25 June 2019 11:21

Feneck91
Juste Inscrit !
Date d'inscription: 24 Jun 2019
Messages: 4

Re: QGIS 3.X: Intégrer le style (symbologie) dans un geopackage

Le but est de le faire en python, pas de le faire manuelllement.
d'ailleurs avec la version 3.6 c'était déjà possiblle en sauvant le style dans le geopackage, je n'ai pas réussi à le faire en python.
Le C++ ne me dérange pas, je fais du Python, du C++, du JAVA, du C# et j'en passe....

Dans le QgsVectorFileWriter.writeAsVectorFormat il y a bien l'option options.symbologyExport = QgsVectorFileWriter.FeatureSymbology mais ça n'a aucun effet.

D'ailleur on peut voir que dans la fonction QgsPackageAlgorithm::packageVectorLayer ilfait bien appel à QgsVectorFileWriter::writeAsVectorFormat par contre, il y a du code :

Code:

if ( saveStyles )
    {
      std::unique_ptr< QgsVectorLayer > res = qgis::make_unique< QgsVectorLayer >( QStringLiteral( "%1|layername=%2" ).arg( newFilename, newLayer ) );
      if ( res )
      {
        QString errorMsg;
        QDomDocument doc( QStringLiteral( "qgis" ) );
        QgsReadWriteContext context;
        layer->exportNamedStyle( doc, errorMsg, context );
        if ( !errorMsg.isEmpty() )
        {
          feedback->reportError( QObject::tr( "Could not retrieve existing layer style: %1 " ).arg( errorMsg ) );
        }
        else
        {
          if ( !res->importNamedStyle( doc, errorMsg ) )
          {
            feedback->reportError( QObject::tr( "Could not set existing layer style: %1 " ).arg( errorMsg ) );
          }
          else
          {
            QgsSettings settings;
            // this is not nice -- but needed to avoid an "overwrite" prompt messagebox from the provider! This api needs a rework to avoid this.
            QVariant prevOverwriteStyle = settings.value( QStringLiteral( "qgis/overwriteStyle" ) );
            settings.setValue( QStringLiteral( "qgis/overwriteStyle" ), true );
            res->saveStyleToDatabase( newLayer, QString(), true, QString(), errorMsg );
            settings.setValue( QStringLiteral( "qgis/overwriteStyle" ), prevOverwriteStyle );
            if ( !errorMsg.isEmpty() )
            {
              feedback->reportError( QObject::tr( "Could not save layer style: %1 " ).arg( errorMsg ) );
            }
          }
        }

Je vais tenter de m'en inspirer...
Si vous avez des idées... En tout cas merci.

Hors ligne

 

#6 Tue 25 June 2019 11:55

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1154

Re: QGIS 3.X: Intégrer le style (symbologie) dans un geopackage

Peut être que çà ne réponds pas à votre problème,
mais vous pouvez appeler des algo de Processing
depuis PyQGIS.

Hors ligne

 

#7 Tue 25 June 2019 12:01

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3936

Re: QGIS 3.X: Intégrer le style (symbologie) dans un geopackage

Le but est de le faire en python, pas de le faire manuelllement.


Je sais. Ma réponse consistait à vous montrer ce que fait l'algo en question (et qui, à mon sens, rejoint votre besoin).

vous pouvez appeler des algo de Processing depuis PyQGIS


yep, c'est ce que je suggérais (https://docs.qgis.org/testing/en/docs/u … ripts.html)

Hors ligne

 

#8 Tue 25 June 2019 15:55

Feneck91
Juste Inscrit !
Date d'inscription: 24 Jun 2019
Messages: 4

Re: QGIS 3.X: Intégrer le style (symbologie) dans un geopackage

En fait le résultat est SUPER simple mais vos réponses m'ont permis d'aiguiller mes recherches !!
Un énorme merci.

Un fois la couche exportée, il faut simplement ajouter le code :

Code:

                            if bSaveStyle:
                                layerStyle = QgsVectorLayer(strFilePath + lambdaFormatLayerName(layer, options.layerName))
                                doc = QDomDocument("qgis")
                                layer.exportNamedStyle(doc)
                                if layerStyle.importNamedStyle(doc):
                                    layerStyle.saveStyleToDatabase(options.layerName, '', True, '')
                                else:
                                    raise Exception(self.tr("Error while writing vector layer style '{}' / id = '{}': '{}'!").format(layer.name(), layer.id(), errorMessage))

Ça tient en pas beaucoup de lignes !

Hors ligne

 

#9 Mon 23 March 2020 10:52

lylambda
Participant actif
Date d'inscription: 31 Aug 2016
Messages: 127

Re: QGIS 3.X: Intégrer le style (symbologie) dans un geopackage

Un fois la couche exportée, il faut simplement ajouter le code


Bonjour Feneck91,
Rencontrant une problématique similaire à la tienne, peux-tu expliciter ta solution ?

De mon coté, je dispose de modèles permettant de générer des géopackages en fonction de données d'entrée (photos, trace GPX). J'y applique automatiquement un style, mais je souhaite pouvoir utiliser ton code pour l'enregistrer comme style par défaut dans les gpkg.
Mes essais ne sont pour l'instant pas concluants.

Hors ligne

 

Pied de page des forums

Powered by FluxBB