#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