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é ?

#1 Wed 24 June 2020 10:10

ntouati
Juste Inscrit !
Date d'inscription: 14 Nov 2016
Messages: 6

QGIS 3.x/PyQGIS: Remplacer le"processing.getObject" de QGIS 2.x

Bonjour à toutes et à tous,

Je travaille actuellement sur une conversion d'un plugin Qgis réalisé pour la version 2.18, vers une version pour la version LTR QQGIS 3.10.
Après avoir utiliser les scripts de conversion "2to3" et quelques modifications, mon plugin s'affiche correctement.

Le problème que je rencontre se situe dans le fonctionnement du script pour les géotraitements demandés et notamment dans la partie suivante où je ne trouve pas de subsitut au "processing.getObject" de la précédente version de PyQGIS.
Dans la version 2.18, le code est le suivant :

Code:

emprise=processing.runalg("qgis:extractbylocation", stations, vlayer, ['within'],0, None) #extract stations within vlayer
stations = emprise['OUTPUT'] 
addStations = iface.addVectorLayer(stations, "STATIONS", 'ogr') 
objEmp = processing.getObject(emprise['OUTPUT'])

Après plusieurs recherches sur les forums et le cookbook, il semble que l'on peut utiliser à la place "QgsProcessingUtils.mapLayerFromString" ce qui donnerait le code suivant :

Code:

emprise=processing.run("native:extractbylocation", {'INPUT':stations,'PREDICATE':[0],'INTERSECT':vlayer,'OUTPUT':'memory:'})
stations = emprise['OUTPUT']
addStations = QgsProject.instance().addMapLayer(emprise)
context = QgsProcessingContext()
objEmp= QgsProcessingUtils.mapLayerFromString(emprise, context)

Mais le code me renvoie cette erreur que je n'arrive pas à corriger :

Code:

TypeError: QgsProcessingUtils.mapLayerFromString(): argument 1 has unexpected type 'QgsVectorLayer'

Il semble qu'il ne considère pas objEmp comme un objet de type couche...

Rien n'est clair sur le remplacement du getObject dans la version 3. Dans la version 2.18, nous l'avions utilisé car elle permettait, comme le dit la doc Qgis https://docs.qgis.org/2.8/fr/docs/user_ … nsole.html de renvoyer un objet QGIS (une couche ou une table) à partir d'un objet transmis.

Avez-vou déjà rencontrer ce type de problème ou avez-vous une idée ? Je sèche un peu...

En vous remerciant par avance pour votre aide, N.

Hors ligne

 

#2 Wed 24 June 2020 12:29

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

Re: QGIS 3.x/PyQGIS: Remplacer le"processing.getObject" de QGIS 2.x

Bonjour,

Code:

TypeError: QgsProcessingUtils.mapLayerFromString(): argument 1 has unexpected type 'QgsVectorLayer'

D'après l'erreur l'objet emprise est un vectorlayer, ce qui est étonnant car processing.run renvoie normalement un dictionnaire.

QgsProcessingUtils.mapLayerFromString est une fonction qui sert à récupérer un maplayer depuis le nom ou un id. Ici ce n'est pas la peine.

Remplacer objEmp = processing.getObject(emprise['OUTPUT']) par objEmp = emprise['OUTPUT'] et ca devrait fonctionner.

Cordialement,

Hors ligne

 

#3 Fri 26 June 2020 09:16

ntouati
Juste Inscrit !
Date d'inscription: 14 Nov 2016
Messages: 6

Re: QGIS 3.x/PyQGIS: Remplacer le"processing.getObject" de QGIS 2.x

Bonjour JD,

Merci beaucoup. ça fonctionne ! smile
Bonne journée

Hors ligne

 

#4 Wed 06 January 2021 17:06

guillaume
Participant actif
Date d'inscription: 5 Sep 2005
Messages: 64

Re: QGIS 3.x/PyQGIS: Remplacer le"processing.getObject" de QGIS 2.x

Bonjour,

vous faites allusion à des scripts de conversion "2to3".
Cela m'intéresserait beaucoup de les trouver et de les employer.
Si vous pouviez m'aider...
Je vous remercie.
Cordialement
Guillaume

Hors ligne

 

Pied de page des forums

Powered by FluxBB