Basierend auf der Antwort von @ kazuhito habe ich im QGIS-Feldrechner einen einzelnen, hackigen Ausdruck zusammengestellt, der in einem Schritt dasselbe tun sollte.
Ich kann mir jedoch vorstellen, dass dies bei größeren Datensätzen sehr ressourcenintensiv sein wird. Ich denke, das Problem eignet sich am besten für eine Python-Implementierung, die Referenzierung und Iteration offensichtlich weitaus besser handhabt als der Feldrechner.
array_last(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1))
- array_first(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1))
Dadurch wird zunächst ein 'Array' von Knotennummern erstellt generate_series()
, wobei das Maximum als Anzahl der Knoten in jedem Polygon angegeben wird. Dies ist num_points($geometry)
minus 1, um den wiederholten ersten / letzten Knoten zu überspringen.
Sie können dann die Werte dieses Arrays durch eine Funktion übergeben, um mit ein anderes Array zu generieren array_foreach()
. Hier übergeben wir die Polygonknotennummer (dargestellt als @element
) an point_n()
, die die tatsächliche Geometrie dieses Knotens zurückgibt, und geben diese ein line_locate_point()
, um seine Länge entlang der angegebenen Linie zu bestimmen (siehe Wichtiger Hinweis unten).
Das resultierende Array wird dann in aufsteigender Reihenfolge sortiert mit array_sort()
der dann läßt uns die „ganz links“ und „ganz rechts“ Abstände entlang der Linie erhalten mit array_last()
und array_first()
. Subtrahieren Sie die beiden und das Ergebnis ist die "Länge" des Polygons entlang der Linie.
Unten finden Sie ein Beispiel für den obigen Ausdruck, der in den Polygonen als Beschriftung angezeigt wird (plus Linienabstände "ganz links" und "ganz rechts", die vom obigen Ausdruck getrennt sind). Zum Vergleich habe ich auch extrahierte Eckpunkte und relevante Linienabstandswerte aufgenommen. Grüne Scheitelpunkte sind die Scheitelpunkte "ganz links" und "ganz rechts" entlang der Linie. Beachten Sie das Polygon oben links, bei dem der grüne Punkt aufgrund des Winkels der Linie tatsächlich weiter entlang der Linie liegt als der Punkt rechts darunter ...
Wichtiger Hinweis :
Auf die Linienebenengeometrie wird hier mit verwiesen aggregate()
. Sie müssen den Ebenennamen ( 'lines'
) nach Bedarf ändern. Wenn Sie mehrere Zeilen haben, sollten Sie einen Filter hinzufügen, um anzugeben, mit welcher Zeile Sie ihn vergleichen möchten, z aggregate('lines','collect',$geometry,"name"='TrainLine1')
. Damit dies automatisch in der nächsten Zeile funktioniert, empfehle ich SQL oder Python gegenüber Field Calc.
Außerdem wird die "Länge" des Polygons entlang der Linie berechnet, einschließlich der Frage, ob die Linie gemäß meinem Beispiel geknickt ist. Wenn Sie den geradlinigen Abstand wollen ... berechnen Sie vielleicht den Abstand distance()
zwischen den relevanten Knoten?