Đã thử nghiệm trên QGIS 2.18 và QGIS 3.4
Giả sử có một lớp polyline được gọi là "lines"
.
Tôi có thể đề xuất sử dụng "Lớp ảo" thông qua Layer > Add Layer > Add/Edit Virtual Layer...
Có thể có một số trường hợp:
Trường hợp 1. Chia dòng thành các đoạn bằng nhau, về cơ bản là độ dài bằng nhau được xác định bởi người dùng.
Với Truy vấn sau, có thể đạt được kết quả. Để tăng / giảm độ dài đoạn, vui lòng điều chỉnh 1000 AS step_length
trong -- 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
Lớp ảo đầu ra sẽ trông như sau
Lưu ý: Nếukhông bao gồm 'delta' (ví dụ: đoạn ngắn nhất cuối cùng), sau đó chènWHERE sec_length >= step_length
vào-- query
, xem bên dưới
-- 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
Trường hợp 2. Chia dòng thành một số phân đoạn nhất định
Với Truy vấn sau, có thể đạt được kết quả. Để tăng / giảm số lượng phân khúc, vui lòng điều chỉnh 8 AS sections
trong -- 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
Lớp ảo đầu ra sẽ trông như sau