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 Sun 21 October 2012 21:23

Sylvain PIERRE
Participant assidu
Lieu: Strasbourg
Date d'inscription: 6 Sep 2005
Messages: 170

QGIS : code fonctionne dans QGIS, plante en dehors

Bonjour,

Dans une application développée en python le code suivant (ajout d'un nouvel enregistrement dans une table Spatialite) ne fonctionne pas :

uri = QgsDataSourceURI()
uri.setDatabase( "C:/APPLI_PDT/CANAL_DEV/bd_canal.sqlite")
uri.setDataSource( "", "AOT_POINT", "GEOMETRY" )

layer = QgsVectorLayer( uri.uri(), "AOT", "spatialite" )
provider = layer.dataProvider()
feat = QgsFeature()
geometry = QgsGeometry()
feat.setAttributeMap({1:QtCore.QVariant(5)})
feat.setGeometry(geometry.fromPoint(QgsPoint(990650,110807)))
(res, outFeats) = provider.addFeatures( [ feat ] )
print str(res)
False

A contrario, la même séquence fonctionne dans Qgis (1.7.2) à partir de la console python.

J'ai beau chercher depuis un moment, ça coince...
Quel est la différence entre les deux environnements (l'environnement de développement est celui de QGis 1.7.2...) ?
Un petit coup de main serait le bienvenu. Merci !

Hors ligne

 

#2 Mon 22 October 2012 12:17

jcr83
Participant actif
Date d'inscription: 17 Mar 2008
Messages: 147

Re: QGIS : code fonctionne dans QGIS, plante en dehors

Un message d'erreur est affiché ?

Hors ligne

 

#3 Mon 22 October 2012 13:55

VianneyD
Participant assidu
Date d'inscription: 30 May 2011
Messages: 153

Re: QGIS : code fonctionne dans QGIS, plante en dehors

Bonjour,

Je ne connais pas le python mais j'avance tout de même une hypothèse :

Le code ne fait-il pas appel à une librairie QGis, qui ne serait pas présente dans l'autre environnement ?
Je pense aux objets de type QgsVectorLayer et QgsFeature par exemple...

Il vous faut peut-être simplement récupérer la librairie en question.

À creuser... à moins que je ne sois à côté de la plaque !


Vianney Dugrain

Hors ligne

 

#4 Tue 23 October 2012 08:43

Sylvain PIERRE
Participant assidu
Lieu: Strasbourg
Date d'inscription: 6 Sep 2005
Messages: 170

Re: QGIS : code fonctionne dans QGIS, plante en dehors

Non, juste la valeur de retour FALSE pour le "addFeatures"

(res, outFeats) = provider.addFeatures( [ feat ] ).

La cela devient un énervant, j'essayer toute les pistes sans succès...

Mon application est bien plus vaste que le bot de code que j'ai posté donc il y a pas mal de possibilités d'interférences, mais quand même.
J'ai essayé de voir autour du provider: RAS (en tout cas pas de piste sérieuse)
J'ai pensé un temps que compte-tenu fait que j'accède en parralèle à ma base Spatialite avec Qt pour afficher des données alpha dans différents widget il pouvait y avoir interférence mais en ajoutant au début de mon script la connexion avec Qt, cela fonctionne toujours (et toujours pas dans mon appli!)

A noter que j'ai essayé en passant non plus par le provider, mais par la layer, le résultat est le même:

Code:

        layer.startEditing()
        feat = QgsFeature()
        geometry = QgsGeometry()
        feat.setAttributeMap({1:QtCore.QVariant(5)})
        feat.setGeometry(geometry.fromPoint(QgsPoint(990650,110807))) #(990650,110807) self.qgsPoint
        res = layer.addFeatures([ feat ])
        layer.commitChanges()
res = False, et toujours pas d'insertion dans ma table...

Hors ligne

 

#5 Tue 23 October 2012 20:24

gene
Participant actif
Lieu: Louvain-la-Neuve
Date d'inscription: 14 Dec 2006
Messages: 104
Site web

Re: QGIS : code fonctionne dans QGIS, plante en dehors

En fait, lorsque vous travaillez dans la console Python, un certains nombre  de modules Python sont "préimportés" ce qui n'est pas le cas si vous travaillez en dehors de QGIS en voulant l'utiliser.

Par exemple, il faut importer les modules de QGIS:

Code:

import sys
from qgis.core import *
from qgis.gui import *

et autres....(pyspatialite etc.)

Pour examiner une application qui utilise QGIS depuis l'extérieur avec PostGIS, voir http://geotux.tuxfamily.org/index.php/e … ython-y-qt en Espagnol. C'est une application qui permet d'afficher les couches PostGIS et  les codes sont disponibles.

Dernière modification par gene (Tue 23 October 2012 21:55)

Hors ligne

 

#6 Wed 24 October 2012 07:56

jcr83
Participant actif
Date d'inscription: 17 Mar 2008
Messages: 147

Re: QGIS : code fonctionne dans QGIS, plante en dehors

En dehors de la console Python Qgis, j'obtiens un message d'erreur :

Code:

$ python test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    uri = QgsDataSourceURI()
NameError: name 'QgsDataSourceURI' is not defined

Donc je pense que Sylvain a effectué les imports nécessaires.

Dernière modification par jcr83 (Wed 24 October 2012 07:57)

Hors ligne

 

#7 Thu 25 October 2012 10:04

Sylvain PIERRE
Participant assidu
Lieu: Strasbourg
Date d'inscription: 6 Sep 2005
Messages: 170

Re: QGIS : code fonctionne dans QGIS, plante en dehors

Tout est en ordre de marche de ce côté-là.

J'ai un peu progressé dans l'identification de la source du problème mais pas encore dans la solution.

En fait le problème provient d'un accès simultané à la base spatialite:

Je me connecte deux fois à la base, une fois avec PyQgis pour aller chercher les couches géographiques,

Code:

            uri = QgsDataSourceURI()
            uri.setDatabase( self.dirDBcanal )
            uri.setDataSource( "", layername, "GEOMETRY" )

une autre fois avec Qt pour aller chercher les données alpha affichées dans les widgets de l'interface

Code:

        self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName(self.dirDBcanal)
        self.db.open()
        self.mdlAOT = QtSql.QSqlRelationalTableModel(self.aotGui, self.db)

.

Si je by-pass la dernière ligne, je peux insérer des objets dans mes layers,

Code:

(res, outFeats) = provider.addFeatures( [ feat ] )

(renvoie True)
sinon renvoie False.

Il y a une possibilité côté Qt de mettre la base en mode "partagé" par:

Code:

              self.db.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE=1")

Mai cela ne suffit pas, il faudrait pouvoir faire la même chose avec QgsDataSourceURI, mais là ca coince...

Il y a bien une fonction setParam de la classe QgsDataSourceURI mais à priori très récemment implémenté et donc absente des version 1.7.2 et 1.8 de QGis sur lesquelles je travaille...

Hors ligne

 

Pied de page des forums

Powered by FluxBB