Getestet mit QGIS 2.18 und QGIS 3.4
Nehmen wir an, es gibt eine Polylinienebene namens "lines"
.
Ich kann vorschlagen, eine "virtuelle Schicht" durch zu verwenden Layer > Add Layer > Add/Edit Virtual Layer...
Es gibt mehrere mögliche Fälle:
Fall 1. Aufteilen der Linie in gleiche Segmente, im Grunde gleiche Länge, die vom Benutzer definiert wird.
Mit der folgenden Abfrage ist es möglich, das Ergebnis zu erzielen. Um die Segmentlänge zu erhöhen / zu verringern, stellen Sie bitte den Eingang 1000 AS step_length
ein -- configurations
.
-- generate series
WITH RECURSIVE generate_sections(id, sec) AS (
SELECT conf.start + 1, conf.start
FROM conf
UNION ALL
SELECT id + conf.step, sec + conf.step_length/conf.length_line
FROM generate_sections, conf
WHERE sec + conf.step_length/conf.length_line <= 1
),
-- configurations
conf AS (
SELECT
0.0 AS start,
1.0 AS step,
1000 AS step_length,
ST_Length(l.geometry) AS length_line
FROM lines AS l
)
-- query
SELECT gs.id AS id,
ROUND(ST_Length(ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line)),0) AS seg_length,
ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line) AS geom
FROM generate_sections AS gs, lines AS l, conf
GROUP BY gs.id
Die virtuelle Ausgabeebene sieht wie folgt aus
Hinweis: Wenn 'Delta' (z. B. das letzte kürzeste Segment) nicht enthalten sein soll, fügen Sie esWHERE sec_length >= step_length
ein-- query
, siehe unten
-- query
SELECT gs.id AS id,
ROUND(ST_Length(ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line)),0) AS seg_length,
ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line) AS geom
FROM generate_sections AS gs, lines AS l, conf
WHERE seg_length >= step_length
GROUP BY gs.id
Fall 2. Aufteilen der Linie in eine bestimmte Anzahl von Segmenten
Mit der folgenden Abfrage ist es möglich, das Ergebnis zu erzielen. Um die Anzahl der Segmente zu erhöhen / zu verringern, passen Sie bitte den Eingang 8 AS sections
an -- configurations
.
-- generate series
WITH RECURSIVE generate_sections(id, sec) AS (
SELECT conf.start + 1, conf.start
FROM conf
UNION ALL
SELECT id + conf.step, sec + conf.step
FROM generate_sections, conf
WHERE sec + conf.step < conf.sections
),
-- configurations
conf AS (
SELECT
8 AS sections,
0.0 AS start,
1.0 AS step
)
-- query
SELECT gs.id AS id,
ST_Line_Substring(l.geometry, conf.start + sec/conf.sections, sec/conf.sections + step/conf.sections) AS geom,
ROUND(ST_Length(ST_Line_Substring(l.geometry, conf.start + sec/conf.sections, sec/conf.sections + step/conf.sections)),2) AS seg_length
FROM generate_sections AS gs, lines AS l, conf
WHERE start + step < sections
GROUP BY gs.id
Die virtuelle Ausgabeebene sieht wie folgt aus