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 Fri 12 February 2021 14:42

guidou
Juste Inscrit !
Date d'inscription: 22 Dec 2014
Messages: 3

QGIS: ajout couche depuis requete sur SQL Server

Bonjour à tous,

Je cherche à ajouter dans un projet QGIS une couche générée depuis une requête sur un SQL Server.
Le script suivant fonctionne bien lorsque le projet est vide, mais tombe en erreur dès lors que la couche est déjà présente ; 'NoneType' object has no attribute 'CreateLayer'.

La suppression initiale de la couche semble pourtant fonctionner car après l'erreur je constate que la couche a bien été supprimée et si je relance le script la couche est alors bien ajoutée de nouveau.

Pouvez-vous m'éclairer ?

Code:

    def processAlgorithm(self, parameters, context, feedback):
        
        DossierDestination="C:/Users/..."
        CheminParcelles = str(DossierDestination)+'/Parcelles_2021.shp'

        # suppression de la couche
        for layer in QgsProject.instance().mapLayers().values():
            if layer.name() == 'Parcelles suivies' :
                id=layer.id()
                source=layer.publicSource()
                QgsProject.instance().removeMapLayer(id)

        # requête
        conn_str = (
        r'DRIVER={SQL Server};'
        r'SERVER=###;'
        r'DATABASE=###;'
        r'UID=###;'
        r'PWD=###')
        conn = pyodbc.connect(conn_str)
        cursor = conn.cursor()
        

        parcelles = cursor.execute("""
        select
        ParcelleId
        FormeGeom.STAsText() 'Forme'
        from 
        """,[760,1, 12]).fetchall()
        
        def createLayer(text,output) :
            
            driver = ogr.GetDriverByName('Esri Shapefile')
            ds = driver.CreateDataSource(output)
            dest_srs = osr.SpatialReference()
            dest_srs.ImportFromEPSG(2154)
            layer = ds.CreateLayer('', dest_srs, ogr.wkbPolygon)

            layer.CreateField(ogr.FieldDefn('ParcelleId', ogr.OFTString))
                
            defn = layer.GetLayerDefn()

            id = 0
            for feat in text :
                feat = ogr.Feature(defn)
                feat.SetField('ParcelleId', text[id][0])

                geom = ogr.CreateGeometryFromWkt(str(text[id][1]))
                feat.SetGeometry(geom)
                layer.CreateFeature(feat)
                feat = geom = None 
                id += 1

            return output

        if parcelles != [] :    
            createLayer(parcelles,CheminParcelles)
            parcellesLayer = QgsVectorLayer(CheminParcelles,'Parcelles suivies','ogr')
            QgsProject.instance().addMapLayer(parcellesLayer,True)
            
        else :
            print('pas de retour requete parcelle')

        return {}

Hors ligne

 

#2 Sat 13 February 2021 15:06

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS: ajout couche depuis requete sur SQL Server

Bonjour, essayer de supprimer le fichier avant de le créer, il est possible qu'il y ait une erreur au moment de la création si la couche existe.

Code:

import os
....



driver = ogr.GetDriverByName('Esri Shapefile')
if os.path.exists(output):
 os.remove(output)
ds = driver.CreateDataSource(output)

Hors ligne

 

#3 Mon 15 February 2021 08:22

guidou
Juste Inscrit !
Date d'inscription: 22 Dec 2014
Messages: 3

Re: QGIS: ajout couche depuis requete sur SQL Server

Bonjour,

Merci, mais la suppression n'est pas permise.

Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus

Hors ligne

 

#4 Mon 15 February 2021 10:17

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS: ajout couche depuis requete sur SQL Server

Bonjour,

le layer qui est supprimé plus haut est bien le shapefile en question (CheminParcelles) ?
Est-il ouvert plusieurs fois dans votre projet ?

Bonne journée,

Hors ligne

 

#5 Mon 15 February 2021 11:25

guidou
Juste Inscrit !
Date d'inscription: 22 Dec 2014
Messages: 3

Re: QGIS: ajout couche depuis requete sur SQL Server

Merci pour votre aide

oui le layer supprimé ('Parcelles suivies') en 1ère partie du script est bien celui créé ensuite pas CreateLayer (CheminParcelles).
Il est bien ouvert une seule fois dans le projet.
En fait, je cherche par ce script à pouvoir proposer une mise à jour de cette couche, chargée par défaut par le projet.

Hors ligne

 

#6 Thu 18 February 2021 08:11

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS: ajout couche depuis requete sur SQL Server

Bonjour, postez votre script en entier. Et quelle est votre version de QGis ?

Hors ligne

 

Pied de page des forums

Powered by FluxBB