LineJoiner in FME


8

Ich habe viele Linienobjekte. Einige von ihnen sind kleiner als einige Kriterien.

Ich möchte alle Linien oder kleineren Liniensegmente, die kleiner als 1 metergrößere Linien sind, verbinden und dabei die Attribute der größeren Linie beibehalten.

Irgendein Rat?

Ich habe versucht, mit dem ersten Tester die Länge der Linienobjekte zu überprüfen (wenn sie kleiner als 1 m ist), und die übergebene Ausgabe geht an LineJoiner. Tatsächlich passiert jedoch nichts, und Zeilen, die vom Ausgabeport von LineJoiner stammen, haben zuvor keine Attribute als Zeilen (wie sie es haben sollten). Vielleicht kompliziere ich zu viel, aber ich dachte, das wird eine leichte Aufgabe.


Könnten Sie bitte klarstellen, ob die größeren Linien die Attribute der kleineren Linien übernehmen sollen, mit denen sie verbunden werden?
GIS-Jonathan

Gegenüber :) Ich brauche kleinere Linien, um größere zu verbinden (1 + 5 = 6).
Z77

Ich weiß, dass Sie die Zeilen zusammenführen möchten, aber was möchten Sie mit den Attributen geschehen? Möchten Sie die Attribute für die größere Zeile so lassen, wie sie ursprünglich waren, oder möchten Sie die Attribute aus den kleineren Zeilen für die neue große Zeile verwenden?
GIS-Jonathan

Halten Sie Attribute von der größeren Zeile fern.
Z77

Antworten:


7

Sie können LineJoinerTransformator mit Parameter verwenden List Name. Sie müssen jedoch einige zusätzliche Datenverarbeitungen durchführen:

  1. Verwenden Sie LengthCalculatordiese Option , um Längen zu berechnen.
  2. Verwenden SorterSie diese Option , um Ihre Zeilen nach Länge zu sortieren (numerische Sortierung, absteigend).
  3. Verwenden Sie LineJoinerdiese Option , um Linien zu verbinden. Die größten zuerst (dank Schritt 2). Geben Sie den Parameter List Namedes LineJoinerNamens für ein neues Listenattribut an.
  4. Mit ListIndexerListenindex 0 verwenden - um die Attribute der ersten verbundenen Funktion (die größte) aus der Liste abzurufen.

So wird es aussehen: Modellbeispiel

EDIT1:

Um nur <1m Features mit größeren Features verbinden zu können, müssen wir zusätzlich Folgendes verwenden:

  1. Tester Transformator nach LengthCalculator mit Test: _length < 1
  2. Verwenden Sie SpatialFilter(Tests, um Parameter durchzuführen :) TOUCHESnach dem Tester, um nur die Merkmale zu filtern, die Merkmale <1 m berühren. Führen Sie dann eine Linienverbindung mit <1 m Merkmalen durch. Funktionen, die <1 m nicht berühren, direkt zur Ausgabe (oder zur weiteren Verarbeitung).

Modell: model2

EDIT2:

Wenn Sie eine Linie von <1 m haben, die zwei große berührt, werden alle miteinander verbunden. Wenn ein solcher Fall (<1 m Funktion berührt zwei oder mehr große) in Ihren Daten möglich ist, sollten Sie eine Verarbeitung solcher Fälle hinzufügen. Schauen Sie sich die Parameter Merge Attributesund den Attribute PrefixTransformator an SpatialFilter. Mit diesen Parametern sollten Sie in der Lage sein, solche Fälle zu erkennen und dann zusätzliche Filterungen durchzuführen.

EDIT3:

Lassen Sie uns den Fall lösen, wenn zwei große Linien eine kleine (<1 m) berühren. Wir müssen nur eine der großen Linien nehmen, um an der Verbindung mit der kleinen teilzunehmen.

Um eine solche Filterung durchführen zu können, müssen wir diese beiden großen Merkmale mit einer ID von der kleinen kennzeichnen, die sie berühren. Wie in EDIT2 angegeben, kann dies im SpatialFilterTransformator unter Verwendung der Parameter Merge Attributesund erfolgen Attribute Prefix.

Verwenden Sie dann den Transformator DuplicateRemover, um solche doppelten Merkmale (zwei große) zu filtern, und nehmen Sie nur eines davon.

Tipp: Versuchen Sie, Inspectorbeim Erstellen Ihres Modells einen Transformator zu verwenden , und zeigen Sie Zwischenergebnisse an, die Ihnen nicht klar sind. Auf diese Weise verstehen Sie besser, wie die einzelnen Transformatoren funktionieren. Experimentieren Sie mit Ihren Daten! :) :)


OK. Vielen Dank für die Antwort. Ich werde das auch versuchen.
Z77

1
Ok, das ist eine kompliziertere Aufgabe. Ich habe meine Antwort aktualisiert. Die Idee ist, SpatialFilter zu verwenden und auf die Funktion TOUCH zu testen. Auf diese Weise können wir LineJoiner nur <1 m Funktionen und Funktionen bereitstellen, die sie berühren.
Alex Markov

1
Erkannte, dass ein noch komplizierterer Fall möglich ist und fügte einige Informationen hinzu. Schau mal.
Alex Markov

1
Weiter aktualisiert meine Antwort. Schau mal.
Alex Markov

1
Indem Sorterwir Features mit größerer Länge erzwingen, werden zuerst LineJoinerdie Attribute mit dem Index "0" in der Liste angezeigt (siehe Parameter List Name), und dann können wir sie in die Hauptattribute des Features verschieben ( ListIndexer). Andernfalls können Sie ein Ergebnis erzielen, bei dem die Attribute kleiner Features "dominieren". Sie können keinen Unterschied sehen, falls große Funktionen an erster Stelle stehen, aber ich werde nicht darauf eingehen.
Alex Markov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.