Zusammenführen mehrerer Zeilen nach Wertefeld
Wie kann ich diese Zeilen abhängig vom Triggerfeld verbinden? Die Bedingung ist wie folgt: Die Felder müssen in aufsteigender Reihenfolge nach dem FID-Feld von 1
bis geordnet werden 68
. Daher möchte ich alle meine Zeilen verbinden, beginnend mit der ersten, die Trigger 1 hat, und den nächsten, die den Wert haben 0
und beim ersten Wert mit anhalten 1
und erneut beginnen.
Edit: Ich verstehe. Aber wie kann ich dieses Problem lösen? Wie verbinde ich diese Linien? Trigger bezieht sich auf den Winkel. Wenn es 0 ist, ist der Winkel zwischen 2 Segmenten kleiner als x Grad, und wenn es 1 ist, ist der Winkel größer als x Grad. Wenn die erste Zeile kein Trigger ist, möchte ich sie mit der ersten Zeile verbinden, die der Trigger ist.
Antworten
Um Ihnen eine Vorstellung davon zu geben, wie dies getan werden kann, finden Sie in Python eine Lösung zum Hinzufügen eines neuen Gruppen-ID-Felds, mit dem Sie Ihre Zeilen auflösen können:
# 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
Ergebnis:

Es gibt eine Möglichkeit, einen Feldwert mithilfe eines QGIS-Ausdrucks im Feldrechner direkt zu erstellen, um alle Features zu gruppieren, denen Sie beitreten möchten. Basierend auf dem Wert dieses Felds können Sie die Funktion verwenden Aggregate
, um Features mit demselben Wert zu verknüpfen (siehe zweiten Screenshot unten). Bots-Schritte sollten mit einem Modell einfach zu automatisieren sein.
Unter Berücksichtigung Ihrer Datenstruktur und Feldnamen sieht der Ausdruck folgendermaßen aus (Erläuterungen zur Funktionsweise des Ausdrucks finden Sie unten):
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
)
)
)
)
)

Dann können Sie dieses Feld zusammen mit der Funktion verwenden, Menu Processing / Toolbox / Aggregate
um diese Merkmale miteinander zu verbinden.

Um die Idee hinter dem Ausdruck zu erklären: Nennen wir zum besseren Verständnis das "Startsegment" der verbundenen Linie, für die Sie schließlich den " Kopf " erhalten möchten - und die nachfolgenden Segmente, die damit verbunden sind, die " Schwänze ".
Holen Sie sich die FID-Werte der Köpfe , nennen wir es " Gruppen-IDs ". Das endgültige Ziel besteht darin, jedes Schwanzsegment einem Kopf zuzuweisen (oder: jedem Schwanz sollte der Gruppen-ID- Wert des nächst kleineren Kopfes zugewiesen werden: 2 und 3 sollten 1, 5 und 6 bis 4 usw. zugewiesen werden) a) Wenn der Trigger 1 ( Kopf ) ist, erhalten Sie den Wert der ID: Dies ist die Gruppen-ID . Andernfalls (für Schwänze ) setzen Sie einen Wert von 0. b) Aggregieren Sie diese Werte, um ein Array zu erstellen. c) Entfernen Sie alle 0-Werte aus dem Array. Wir erhalten also eine Reihe von Gruppen-IDs (= Fid of Heads ): [1,4,7,9,12]. Schließlich möchten wir jedes Feature einem dieser Werte aus dem Array zuweisen.
Iterieren Sie nun alle Features der Ebene mit jeder dieser Gruppen-IDs aus dem Array mit dem Ausdruck
array_foreach
: a) Für die Features mit Trigger = 1 ( Köpfe ) haben wir kein Problem, diese haben bereits die richtige Gruppen-ID (entsprechend ihre fid) b) In den anderen Fällen ( Schwänze , Trigger = 0) müssen wir neue Werte zuweisen. Wir vergleichen daher jeden Eingabewert aus dem Array (Liste aller Gruppen-IDs ) mit der fid und behalten die Gruppen-ID bei, wenn sie kleiner als die fid ist (da wir dem nächst kleineren Wert zuweisen möchten). Andernfalls setzen wir es auf 0. In keinem Fall ergibt sich aus dem Array ein Wert, der größer als die fid ist.Sortieren Sie das Array, um sicherzustellen, dass die Werte in der richtigen Reihenfolge (kleinste bis größte) vorliegen, um die letzten Nullen aus der letzten Position zu entfernen (siehe Abbildung unten). Ohne eine Sortierreihenfolge festzulegen, erhalten wir den Standardwert
ascending=true
.Holen Sie sich den letzten Wert aus dem sortierten Array, also ist die letzte (größte) Gruppen-ID , die (denken Sie an Schritt 2b) in keinem Fall größer als das fid AND (falls Trigger = 1), gleich dem fid (Schritt 2a) AND ist ist immer eine Zahl aus dem Array, das wir in 1 erstellt haben.
In einem Screenshot sehen Sie die Zwischenergebnisse von Schritt 1 und 2:

Jetzt ist es einfach, die Aggregatfunktion mit dem wie oben beschrieben erstellten Feld zu verwenden.