#1 Thu 03 September 2015 09:36
- xvitry
- Participant occasionnel
- Date d'inscription: 9 Mar 2007
- Messages: 18
QGIS 2.10 : formulaire QGIS / QT ?
Bonjour,
J'ai pu faire un formulaire de saisie de données dans QGIS sans problème.
Je cherche à filtrer la liste des villes en fonction du département saisi dans le champ précédent. Sinon, j'ai la liste complète des communes, ce qui est ingérable.
Je suis sous QGIS 2.10
Merci, Xavier
Hors ligne
#2 Thu 03 September 2015 11:39
- hichamfstgm
- Participant occasionnel
- Lieu: Goulmima
- Date d'inscription: 11 May 2010
- Messages: 48
Re: QGIS 2.10 : formulaire QGIS / QT ?
Bonjour
Merci de bien clarifier ton probleme
Qu'il est le cadre de ton travail
les input, les traitements que tu veut faire et les output que tu veut en sortir
CDT
Hors ligne
#3 Thu 03 September 2015 11:46
- xvitry
- Participant occasionnel
- Date d'inscription: 9 Mar 2007
- Messages: 18
Re: QGIS 2.10 : formulaire QGIS / QT ?
Le but est d'utiliser QGIS comme interface de saisie dans une base postGIS.
Le formulaire permet la saisie de données dans lequel on doit sélectionner le département, puis une ville (parmi d'autres informations n° anonymat, infos diverses).
La personne édite la couche de points, ajoute un point et le formulaire apparaît.
Une solution satisfaisante pourrait consister à ajouter au projet QGIS le contours des communes et à récupérer le nom de la commune (ou le code INSEE) au moment du clic pour créer le point (ce qui éviterait d'avoir le menu déroulant). J'ai besoin de cette info dans la table de points et je ne souhaite pas que ce soit un champ texte libre.
est-ce plus clair ?
Merci
Hors ligne
#4 Fri 04 September 2015 11:02
- gustavecoste
- Participant actif
- Lieu: Montpellier
- Date d'inscription: 24 Apr 2013
- Messages: 118
Re: QGIS 2.10 : formulaire QGIS / QT ?
Bonjour,
As-tu besoin que l'information de la commune s'affiche dans ton formulaire? Si non, le plus simple est peut-être de faire cette opération coté BDD en ajoutant la table des communes dans ta base puis en créant un trigger BEFORE INSERT qui va chercher la commune avec une jointure spatiale pour l'intégrer dans la nouvelle donnée.
Gustave Coste
Hors ligne
#5 Fri 04 September 2015 11:07
- xvitry
- Participant occasionnel
- Date d'inscription: 9 Mar 2007
- Messages: 18
Re: QGIS 2.10 : formulaire QGIS / QT ?
Bonjour,
Effectivement ça m'intéresse comme idée. De fait, je n'ai plus à sélectionner la commune, voire même le département. Si je comprends bien, je récupèrerai l'info dans le champ commune par la position du point.
La table des communes est effectivement dans ma base de données puisqu'elle alimente la liste déroulante de mon formulaire.
Je n'ai jamais fait cette opération (trigger), comment ça se passe concrètement ?
Xavier
Hors ligne
#6 Fri 04 September 2015 14:23
- gustavecoste
- Participant actif
- Lieu: Montpellier
- Date d'inscription: 24 Apr 2013
- Messages: 118
Re: QGIS 2.10 : formulaire QGIS / QT ?
En effet, cela te permettrait de récupérer directement ta commune avec la position du point.
Voici une proposition de création de trigger que je te laisse adapter selon le nom de tes champs et tables:
Code:
-- Création de la fonction CREATE FUNCTION get_commune() RETURNS trigger LANGUAGE plpgsql IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER COST 100 AS $$ BEGIN NEW.fk_commune = (SELECT pk_commune FROM commune JOIN matable ON ST_Contains(matable.the_geom, commune.the_geom)); RETURN NEW; END; $$; -- On ajoute un commentaire à la fonction COMMENT ON FUNCTION get_commune() IS 'Fonction trigger permettant renvoyant la donnée saisie et la commune obtenue par jointure spatiale'; -- Création du trigger sur la table CREATE TRIGGER get_commune BEFORE INSERT OR UPDATE ON matable FOR EACH ROW EXECUTE PROCEDURE get_commune(); -- On ajoute un commentaire au trigger COMMENT ON TRIGGER get_commune ON matable IS 'Trigger permettant de renseigner la commune à l''insertion et la modification dans la table matable';
Plus d'information sur le fonctionnement des triggers ici et ici. Et sur les jointures spatiales: ici.
Gustave Coste
Hors ligne
#7 Tue 15 December 2015 09:41
- sapeur04
- Participant occasionnel
- Date d'inscription: 11 Dec 2007
- Messages: 11
Re: QGIS 2.10 : formulaire QGIS / QT ?
Bonjour Gustave
Merci pour cette réponse que je recherchais moi aussi depuis un moment !
J'utilise pour ma part la version 2.12 Lyon de qgis. Je suis chargé de mission risques en DDT 04. Je suis en train d'élaborer une couche répertoriant les digues et ouvrages de protection de mon département.
Serait-il possible d'avoir plus de détails sur la façon d'intégrer un trigger à un formulaire de saisie .ui ? Je cherche, mais "un qui sait vaut 10 qui cherchent" et ces précieuses informations me permettront de gagner en efficacité.
Je profite du message pour demander aussi si il est possible de récupérer automatiquement toujours dans un formulaire .ui les informations données par la fenêtre "gps information" (comme par exemple l'altitude, la précision, le nombre de satellites).
Actuellement, je recopie "à la main" lors d'une capture ces données mais cela est un peu trop archaïque à mon goût :-)
Un grand merci d'avance.
Hors ligne
#8 Tue 15 December 2015 12:37
- gustavecoste
- Participant actif
- Lieu: Montpellier
- Date d'inscription: 24 Apr 2013
- Messages: 118
Re: QGIS 2.10 : formulaire QGIS / QT ?
Bonjour Sapeur04,
À vrai dire, je pense qu'il y a un malentendu, un trigger s'utilise dans une base de données, pas dans un formulaire Qt.
Le plus simple serait peut-être de détailler votre problème: données de départ, résultat souhaité, utilisateur visé...
Si votre problème ne concernant pas strictement les formulaires, il vaudrait peut-être mieux ouvrir un nouveau sujet.
Gustave Coste
Hors ligne
#9 Wed 16 December 2015 08:59
- sapeur04
- Participant occasionnel
- Date d'inscription: 11 Dec 2007
- Messages: 11
Re: QGIS 2.10 : formulaire QGIS / QT ?
Bonjour
Ma question concerne bien les formulaires.
Pour faire simple, dans mon projet, sont ouverts les tables au format shp des communes (polygones vectoriels) et des digues et ouvrages de protection (linéaires vectoriels).
Une numérisation des digues et ouvrages est faite dans ces tables par divers opérateurs, de tout niveau d'utilisateur Qgis.
Ce que je voudrais faire, c'est qu'à l'issue d'une numérisation, à l'ouverture du formulaire de saisie des données attributaires, dans les cases prévues pour, figurent le nom et le numero INSEE de la commune sur laquelle se trouve l'objet numérisé, informations attributaires récupérées si c'est possible, dans les données attributaires de la table des communes.
Ce pour faciliter la tache d'un opérateur néophyte dans l'utilisation de Qgis, pour lui éviter d'avoir à utiliser le bouton actions ou une procédure de remontée de données par intersection.
Pour la partie concernant la fenêtre information GPS, je vais ouvrir un nouveau sujet, c'est un peu plus compliqué :-)
Merci pour cette rapide réponse, en tout cas
Hors ligne
#10 Thu 31 December 2015 13:53
- sapeur04
- Participant occasionnel
- Date d'inscription: 11 Dec 2007
- Messages: 11
Re: QGIS 2.10 : formulaire QGIS / QT ?
Bonjour à tous
Voici comment, sous QGIS 2.12.2 je fais remonter dans un formulaire le nom et le code insee de la commune sur laquelle je cree un point ou une ligne.
Je me suis inspiré du code de l'extention RefFunction - geomintersect() et ai pas mal consulté la doc QGIS API !
Partons du principe que ce qui suit est intégré dans le code python d'initialisation du formulaire et que qgis est configuré pour ouvrir un formulaire ui personnalisé créé avec QT designer et lancer le module python à l'ouverture dudit formulaire (moncode.formOpen)
Dans votre code python, récupérer la table d'intersection par la fonction
def getVectorLayerByName(myName):
layermap = QgsMapLayerRegistry.instance().mapLayers()
for name, layer in layermap.iteritems():
if layer.type() == QgsMapLayer.VectorLayer and layer.name() == myName:
if layer.isValid():
return layer
else:
return None
Puis insérer le module suivant :
def formOpen(dialog,layerid,featureid):
couche = getVectorLayerByName('nomdelacouchedescommunessansextention')
iter = couche.getFeatures()
for feature in iter:
if feature.geometry().intersects(featureid.geometry()):
Insee = feature.attribute('CODE_INSEE')
featureid.setAttribute(6*(index de la colonne qui va contenir le code insee)*, Insee)
Commune = feature.attribute('NOM_COM')
featureid.setAttribute(7*(index de la colonne qui va contenir le nom de la commune)*, Commune)
layerid.updateFeature(featureid)
myDialog.resetValues()
Ne pas oublier les importations :
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtSql import *
from qgis.core import *
from qgis.utils import iface,qgsfunction
from osgeo.ogr import Layer
from qgis.analysis import *
import sys
En espérant vous économiser le temps que j'ai passé à trouver ;-) !
Hors ligne