#1 Sun 02 August 2020 02:36
- Camille23
- Juste Inscrit !
- Date d'inscription: 1 Aug 2020
- Messages: 5
QGIS: Automatisation remplissage table attributaire
Bonjour,
Je suis nouveau sur le forum GeoRezo, je fais souvent des recherches pour mes problèmes avec celui-ci mais là je bloque.
Je vous parle du contexte d'abord.
J'ai 2 couches Points (BPE et Chambre) et 2 couches Lignes (Infra_Parcourues et Cable), la base en Fibre optique ^^
Récemment j'ai découvert qu'avec de nouvelles fonctions issues de l'extension "RefFunctions" je pouvais faire des choses assez cool de manière native. Par exemple la fonctions "geomequals" me permet de récupérer (dans n'importe qu'elles couches) l'information d'un champ pour pouvoir l’associer à la couche actuel (si tantôt qu'on est fait correspondre le x et le y des 2 couches au formats Points évidemment).
L'astuce encore plus cool c'est de l'insérer dans le formulaire d'attributs de la couche là où on peut mettre une valeur par défaut et l'appliquer à chaque mis a jours de l'entité. Dans mon cas ça donne geomequals('Chambre','ID_CH'), je récupére l'ID de mes chambres et je l’insère directement dans le champs de la couche que je veux.
Là c'était juste une chose assez simple on va pas se mentir.
Maintenant ce que j'aimerai c'est faire la même chose mais en plus complexe.
Dans ma couche point, j'ai un champ ID_cable_in et ID_cable_out, mon but serait de créer une automatisation pour remplir automatiquement ces champs avec l'ID de la la couche Ligne qui entre et qui sorte du Point.
Il est évident qu'avant cela je dois donner un sens uniforme à ma ligne et que chaque nœuds de celle-ci soit bien accroché à la couche Point.
Si vous avez besoin que je précise certaines choses n’hésitez pas à me demander, dans ma tête c'est clair mais c'est pas toujours évident d'exprimer un concept seulement à l'écrit surtout quand on parle d'un SIG comme Qgis.
Merci pour votre aide.
Hors ligne
#2 Sun 02 August 2020 19:18
- Julien81
- Participant assidu
- Lieu: Giroussens
- Date d'inscription: 14 Jan 2019
- Messages: 171
Re: QGIS: Automatisation remplissage table attributaire
Bonjour,
En gros vous voulez extraire d'une couche de ligne le start point et comparer avec votre geom point pour renseigner id_out
et extraire de cette même couche de ligne le end point pour renseigner id_in dans votre couche de point (chambre)?
Il n'est pas nécessaire/suffisant de passer par RefFunctions, il y a nativement les fonctions requises pour récupérer vos attribut d'une couche à une autre notamment en manipulant les geom et via la fonction aggregate!
A priori quelque chose comme
Code:
coalesce(to_int(aggregate('Cables','concatenate', to_string("id_cable"),intersects(end_point($geometry),geometry(@parent)))),'')
'Cables' votre couche de lignes orientées. On récupère les id de cables lorsque le dernier noeud intersecte le point de la chambre.
Dans l'hypothèse ou l'on a bien une relation 1-1 entre chambre et cables entrants idem avec chambre et cable sortants (sur mon test je récupère un id en integer pour le sortant et l'entrant, si plusieurs cables de l'un ou l'autre envisager de stocker un liste de valeur/tableau)
Hors ligne
#3 Sun 02 August 2020 21:12
- Camille23
- Juste Inscrit !
- Date d'inscription: 1 Aug 2020
- Messages: 5
Re: QGIS: Automatisation remplissage table attributaire
Bonjour,
Merci pour votre réponse dans un premier temps
Alors j'ai juste un problème c'est que mes ID de couches ne sont pas des entier,s ils ont par exemple la forme "C_97_1", "C_97_2".
"C" étant l'acronyme pour Cable, "97" le numéro de mon projet et "1" le numéro de mon ID.
On m'impose une dénomination des ID de mes couches comme cela (avec un acronyme différent en fonction du nom de base de la couche), ce qui m'exaspère un peu mais je n'ai pas le choix.
Est ce possible de modifier la formule (grand merci pour celle-ci au passage) pour que ce soit possible avec du texte ?
Merci par avance pour votre aide.
Hors ligne
#4 Sun 02 August 2020 21:32
- Camille23
- Juste Inscrit !
- Date d'inscription: 1 Aug 2020
- Messages: 5
Re: QGIS: Automatisation remplissage table attributaire
Ok je viens de comprendre qu'il suffit juste de remplacer le premier "to_int" par "to_string" ^^
Je ne suis pas du tout quelqu'un qui fait de la prog mais je peux comprendre en analysant ce qu'on me montre ^^
En tout cas merci beaucoup pour cette fonction qui va me permettre de gagner bc de temps dans mon travail !
Merci.
Hors ligne
#5 Sun 02 August 2020 22:28
- Camille23
- Juste Inscrit !
- Date d'inscription: 1 Aug 2020
- Messages: 5
Re: QGIS: Automatisation remplissage table attributaire
Par contre j'aurai encore besoin de ton aide stp.
Ta formule est super pour des lignes qui termine par des points mais pas pour des points qui seraient compris dans des lignes, je vais essayer de contextualiser pour que ce soit peut être plus simple.
Comme expliqué plus haut, j'ai 2 couches Points (BPE et Chambre) et 2 couches Lignes (Infra_Parcourues et Cable).
Ma couche "Infra_Parcourues" passe par des "Chambre" à chaque nouvelles entités alors que ma couche "Cable" passe par des "BPE" à chaque nouvelles entités.
La différence réside dans le fait que ma couche "Cable" passe par plusieurs chambres et par plusieurs "Infras".
On me demande de rentrer aussi l'ID Cable_In et l'ID_Cable_Out à chaque chambres, évidemment, entre chaque BPE les chambres auront le même ID Cable_In et ID Cable_out.
Comment arriver à une formule qui puissent aussi faire cela de manière automatique stp ?
Merci pour ton aide si tu repasse par là
Hors ligne
#6 Mon 03 August 2020 13:24
- Julien81
- Participant assidu
- Lieu: Giroussens
- Date d'inscription: 14 Jan 2019
- Messages: 171
Re: QGIS: Automatisation remplissage table attributaire
Un petit schéma conceptuel ou capture eût été bienvenu, mais si je comprends bien, le cable qui est le regroupement de vos segments infra passe par plusieurs chambres, pour récupérer au niveau des chambres l'id du cable entrant (=id cable sortant) en ajustant le critère de filtre de la fonction d'aggrégat vous devriez arriver à vos fins.
Code:
aggregate('Cables','concatenate', "id_cable", intersects($geometry,geometry(@parent)))
Dans la mesure ou un seul câble traverse (et donc intersecte) chaque chambre, le concatenate devrait vous sortir un seul identifiant en retour, vous exécutez la mise à jour sur le champ id_entrant par ex. et vous pouvez ensuite mettre à jour id sortant (=id_entrant)
cdlt
Hors ligne