Fusion de plusieurs lignes par champ de valeur
Comment puis-je joindre ces lignes en fonction du champ Déclencheur. La condition est la suivante, les champs doivent être classés par ordre croissant après le champ fid de 1
à 68
. Ainsi, je veux joindre toutes mes lignes en commençant par la première qui a le déclencheur 1 et les suivantes qui ont la valeur 0
et arrêter à la première valeur avec 1
et recommencer.
Edit: Je comprends. Mais comment puis-je résoudre ce problème? Comment rejoindre ces lignes? Le déclencheur fait référence à l'angle. S'il est égal à 0, l'angle entre 2 segments est inférieur à x degrés, et s'il est égal à 1, l'angle est supérieur à x degrés. Donc, je veux que si la première ligne n'est pas un déclencheur, je veux la joindre à la première ligne qui est le déclencheur.
Réponses
Pour vous donner une idée de la façon dont cela pourrait être fait, voici une solution en Python pour ajouter un nouveau champ groupid, que vous pouvez utiliser pour dissoudre vos lignes:
# Change your settings here:
layername = 'line'
triggerfield = 'Trigger' # field must already exist
groupfieldname = 'mygroup' # will be added if does not exist
newlineindicator = 1
#####
# no changes needed below #
#####
layer = QgsProject.instance().mapLayersByName(layername)[0] # get the layer
layer.startEditing() # start editing the layer
layer.dataProvider().addAttributes([QgsField(groupfieldname,QVariant.Int)]) # add a group field
layer.commitChanges() # save new added field to prevent crash when searching for it later
layer.startEditing() # start editing the layer again
groupid = 0 # initialize groupid
fieldindex = layer.fields().indexFromName(groupfieldname) # get fieldindex of groupfield
for feat in layer.getFeatures(): # itereate over layer
if feat[triggerfield] == newlineindicator: # if a new trigger appears, increase groupcounter
groupid += 1
attrs = { fieldindex : groupid } # prepare attributes
layer.dataProvider().changeAttributeValues({ feat.id() : attrs }) # assign current groupid to current feature
layer.commitChanges() # save changes
Résultat:

Il existe un moyen de créer directement une valeur de champ à l'aide d'une expression QGIS dans le calculateur de champ pour regrouper toutes les entités que vous souhaitez joindre. En fonction de la valeur de ce champ, vous pouvez ensuite utiliser la fonction Aggregate
pour joindre des entités avec la même valeur (voir la deuxième capture d'écran ci-dessous). Les étapes des robots devraient être faciles à automatiser avec un modèle.
En prenant votre structure de données et les noms de champ, l'expression ressemble à ceci (voir ci-dessous pour l'explication du fonctionnement de l'expression):
array_last (
array_sort (
array_foreach (
array_remove_all (
array_agg (
if (
"trigger" = 1,
"fid" ,
0
)
) ,
0) ,
if (
if (
"trigger" = 1,
"fid" ,
0
) = @element,
@element,
if (
"fid" > @element ,
@element,0
)
)
)
)
)

Ensuite, vous pouvez utiliser ce champ avec la fonction Menu Processing / Toolbox / Aggregate
pour joindre ces entités.

Pour expliquer l'idée derrière l'expression: pour une meilleure compréhension, appelons le "segment de départ" de la ligne jointe dont vous voulez enfin obtenir la " tête " - et les segments suivants qui y sont joints les " queues ".
Obtenez les valeurs fid-values des têtes , appelons cela " group-ids ". Le but final est d'assigner chaque segment de queue à une tête (ou: chaque queue doit se voir attribuer la valeur d' identifiant de groupe de la prochaine tête plus petite : 2 et 3 doivent être attribuées à 1, 5 et 6 à 4, etc.) a) Si le déclencheur est 1 ( head ), récupérez la valeur de l'id: c'est l' id de groupe . Sinon (pour les queues ) définissez une valeur de 0. b) Regroupez ces valeurs en créant un tableau. c) Supprimez toutes les valeurs 0 du tableau. On obtient ainsi un tableau de group-ids (= fid of heads ): [1,4,7,9,12]. Nous voulons enfin attribuer chaque fonctionnalité à l'une de ces valeurs du tableau.
Maintenant, parcourez toutes les entités de la couche avec chacun de ces identifiants de groupe à partir du tableau avec l'expression
array_foreach
: a) Pour les entités avec déclencheur = 1 ( têtes ), nous n'avons aucun problème, elles ont déjà le bon identifiant de groupe (correspondant leur fid) b) Dans les autres cas ( queues , trigger = 0), il faut attribuer de nouvelles valeurs. Nous comparons donc chaque valeur d'entrée du tableau (liste de tous les identifiants de groupe ) avec le fid et conservons l' identifiant du groupe s'il est plus petit que le fid (comme nous voulons l'assigner à la valeur suivante plus petite). Sinon, nous le mettons à 0. Donc, en aucun cas, il ne résultera une valeur du tableau plus grande que la fid.Triez le tableau pour être sûr que nous avons les valeurs dans le bon ordre (du plus petit au plus grand) - pour supprimer les zéros finaux de la dernière position (voir capture d'écran ci-dessous). Sans définir d'ordre de tri, nous obtenons la valeur par défaut
ascending=true
.Obtenez la dernière valeur du tableau trié, donc le dernier (plus grand) identifiant de groupe qui est (rappelez-vous l'étape 2b) en aucun cas plus grand que le fid ET (dans le cas où trigger = 1) est égal au fid (étape 2a) ET est toujours un nombre du tableau que nous avons créé en 1.
Voir une capture d'écran pour les résultats intermédiaires des étapes 1 et 2:

Il est maintenant facile d'utiliser la fonction d'agrégation avec le champ créé comme décrit ci-dessus.