라인을 특정 부품 수로 나누는 방법?


11

포인트 레이어를 사용하여 선을 나누는 것과 관련된 많은 질문을 보았습니다.

줄을 길이의 분수로 나누고 싶습니다.

예를 들어, 나는 줄 400길이가 있는데, 각각 100 미터 길이의 네 줄로 나누고 싶습니다.

grass 모듈 v.split이 있지만 qgis 도구 상자에서 시작할 때 오류 메시지가 나타납니다.

*"TypeError: object of type 'NoneType' has no len()"*

그래서 이것이 해결책이라면 작동하는지 확실하지 않습니다.


명확하게 설명하십시오. 길이를 기준으로 100 미터 또는 특정 개수의 부품으로 분할 하시겠습니까?
underdark

특정 개수의 부품으로. 아래의 요셉은 좋은 해결책을 제시했습니다.
Gilles

답변:


10

GRASS 의 v.split.length 함수는 포인트 레이어가 없어도 사용자가 정의한 동일한 세그먼트로 선을 분할하여 원하는 것을 정확하게 수행해야합니다. 다음은 직선의 간단한 예입니다 (직선이 아닌 여러 행에서도 작동 함).

간단한 라인

$length표현식에서 사용하여 길이를 계산하기 위해 열을 추가했습니다 .

선 속성

Processing Toolbox 를 통해 GRASS 의 v.split.length 함수를 사용하여 선을 25m 세그먼트로 분할하여 총 4 개의 파트를 만들어야했습니다.

v. 분할 길이 기능

그런 다음 출력 레이어의 길이 열을 업데이트하고 위와 동일한 명령을 사용하여 길이를 다시 계산했습니다.

속성 결과

왜 오류가 발생하는지 잘 모르는 경우 사람들이 테스트 할 수 있도록 회선 계층을 공유 할 수 있습니까?


안녕하세요, 답변 주셔서 감사합니다. 작동 중입니다. 그래도 측정 길이에서 세그먼트 수를 계산해야하기 때문에 선을 길이의 일부로 분할하지는 않지만 좋은 해결 방법입니다. 감사합니다.
Gilles

2
"최대 세그먼트 길이"가 25로 설정된 경우 5 세그먼트 (도구 출력이 동일한 길이 인 경우 25 개 중 4 개, 1.86 개 중 하나 또는 20,372 개 중 5 개)가 아닌 25 개보다 긴 4 개 세그먼트 (25.465)를 얻은 이유는 무엇입니까?
JR

1
@JR-5 년 전에 물어 보면 좋은 질문입니다. :). 나는 그것에 대한 답을 얻지 못했을 것입니다. 구식 QGIS 버전이었던 것으로 생각하면 도구의 버그 일 것입니다. 또한 GIS를 배우는 초기 시절처럼 정확한 거리를 미터 단위로 측정 할 때 다른 CRS를 사용해야했습니다!
Joseph

1
@Joseph, 오늘 PyQGIS를 선택하겠습니까? =)
Taras

1
@Taras-더 기울어 질 것입니다. 예 :)
Joseph

2

QGIS 2.18 및 QGIS 3.4에서 테스트

이라는 폴리 라인 레이어가 있다고 가정 해 봅시다 "lines".

입력

나는 "가상 계층"을 통해 제안 할 수 있습니다 Layer > Add Layer > Add/Edit Virtual Layer...


몇 가지 경우가 있습니다.


사례 1. 선을 동일한 세그먼트, 기본적으로 사용자가 정의한 동일한 길이로 분할

다음 쿼리를 사용하면 결과를 얻을 수 있습니다. 증가 / 세그먼트 길이를 줄이려면 조정하십시오 1000 AS step_length에서를 -- 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

출력 가상 레이어는 다음과 같습니다.

output_1

주의 : 만약 '델타' (마지막 짧은 세그먼트 등)가 포함되지 않으며, 다음 삽입WHERE sec_length >= step_length에서-- query, 아래 참조

-- 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

사례 2. 선을 특정 수의 세그먼트로 나누기

다음 쿼리를 사용하면 결과를 얻을 수 있습니다. 세그먼트의 수를 증가 / 감소하려면 조정하십시오 8 AS sections에서를 -- 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

출력 가상 레이어는 다음과 같습니다.

output_2

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.