Message posté par : guidou (edouard.berthelin(a)laposte.net)
----------------------------------------
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 {}
-----------------
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=340226#p340226
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net