ラインを特定の数のパーツに分割する方法は?


10

ポイントレイヤーを使用して線を分割することに関する多くの質問を見てきました。

行をその長さの分数に分割したい。

たとえば、1 400メートルの長さのラインがある場合、100メートルずつの4つのラインに分割したいとします。

grassモジュールがありますが、v.splitqgisツールボックスから起動するとエラーメッセージが表示されます。

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

したがって、これが解決策になるかどうか、私がそれを機能させるかどうかはわかりません。


明確にしてください:長さで分割しますか?つまり、100メートルまたは特定の数のパーツに分割しますか?
アンダーダーク

特定の数の部品に。以下のジョセフは良い回避策を提供しています。
Gilles

回答:


9

GRASS のv.split.length関数は、ポイントレイヤーを必要とせずに、ユーザーが定義した等しいセグメントにラインを分割することで、望みどおりの動作をします。以下は、直線の簡単な例です(直線ではない複数の線でも機能します)。

シンプルなライン

列を追加し$lengthて、式で長さを計算します。

ライン属性

GRASS のv.split.length関数を処理ツールボックス経由で使用して、ラインを25mのセグメントに分割することを選択しました。

v.split.length関数

次に、出力レイヤーの「長さ」列を更新し、上記と同じコマンドを使用して長さを再計算しました。

属性結果

エラーが発生する理由がわからない場合は、ラインレイヤーを共有して、テストできるようにしますか?


こんにちは、あなたの答えをありがとう。動いています。ただし、測定された長さからセグメントの数を計算する必要があるため、長さの何分の1かでラインを分割するわけではありませんが、適切な回避策です。ありがとうございました。
Gilles

2
「最大セグメント長」が25に設定されている場合、5セグメントではなく4セグメントが25(25.465)より長くなったのはなぜですか(ツールの出力が同じ長さの場合、25の4と1.86または5の20,372のうちの1つ)?
JR

1
@JR-それは5年前に尋ねるのに良い質問です:)。私はそれに対する答えはありません、おそらくそれが古いQGISバージョンであったことを考えれば、ツールのバグでした。また、GISを習得した初期の頃のように、メートル単位で正確な距離を測定する場合は、別のCRSを使用する必要がありました。
ジョセフ

1
@ジョセフ、今日はPyQGISを選ぶと思いますよね?=)
Taras

1
@Taras-私はもっと傾くでしょう、はい:)
ジョセフ

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.