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

 

Pied de page des forums

Powered by FluxBB