ラインを等距離で分割するときに

3,481 views
Skip to first unread message

sakuya

unread,
Mar 13, 2019, 2:48:33 AM3/13/19
to QGIS初心者質問グループ
こちらsakuyaです。お世話になります。
QGIS3.4以上を主に使用しております。

ラインレイヤから等距離の点群を出力してほしい時になのですが、今は
ラインにID番号を設定しておき、
「プロセッシングツール」→「ジオメトリに沿った点群」
で等距離のラインを抽出しております。そうすることで、ラインからIDを引き継ぎ、distance、angleといった属性が付いてきます。

等距離ごとに点群を作成することができたため、この点群に対して
「プロセッシングツール」→「ドレープ」
で標高ラスタからZ値を入手したのちに
「プロセッシングツール」→「点をつないで線に」
機能を使い、「つなぐ順序のフィールド」は[distance]にし、「グループを示すフィールド」は[ラインID]と設定し標高を持ったラインジオメトリを入手しております。

これで、大体はよいのですが、解決でする方法があればなと思う点が、2つあります。線分の終端座標が付いてこないという事と、変曲点部分の座標が入手できていないことです。

1つめ。ラインの終端部の点が「ジオメトリに沿った点群」で例えば5mピッチに設定していた場合、きっかり5mの倍数になっていなかったら出力されてこない。
(下図の青丸部分)


2つ目。同じように線の変曲点(傾きが変わる場所、角部)の点が出力されてこない。

これらの部分も出力されつつ、累積距離も欲しいというような都合のよい方法はありませんでしょうか?これらが入手できると、もっと制度の高いラインが作れそうです。

サンプルのラインジオメトリと国土地理院より配布されている5mDEMデータを切り出したものを添付いたします。
よいアイデアがあったら是非とも教えてください。
sendto.zip

adachi

unread,
Mar 13, 2019, 3:35:43 AM3/13/19
to QGIS初心者質問グループ
sakuya様

全体的な要望として、「ラインの形そのままでDEMからZ値をもたせたい」ということでよろしいでしょうか?
以下の手順では、ラスタのセルに合わせるため「等距離」というのは失われてしまいます。


1. ラスタ計算機で標高値を100倍にします
 →これは次の「ポリゴン化」で強制的に整数になってしまうためです。現在のラスタ値が小数点以下2桁なので100倍としてますが、もとの標高値が整数であればこの操作はいりません。

2. 100倍にしたラスタを 変換 → ラスタのベクタ化 でポリゴンにします

3. ベクタ → 調査ツール → 場所による選択 で
 1つめのレイヤ:手順2で作ったポリゴン
 2つめのレイヤ:ライン
 で設定します。「交わる」だけチェックしておけば大丈夫そうです

4. 選択後のポリゴンを 右クリック→エクスポート で選択されたポリゴンだけを新しいレイヤとして保存します

(上の3、4は処理の高速化のためです。手順2の全体ポリゴンのままやってもいいですが以降の操作でえらく時間がかかります)

5. 4で作ったポリゴンのフィールド計算機で、標高値を1/100にしてもとに戻します

6. ベクタ → 空間演算ツール → 交差(intersect)で
 入力レイヤ:ライン
 オーバーレイレイヤ:手順5までで作ったポリゴン

 として操作を実行します。ポリゴンの境目で切断され、かつポリゴンの属性をすべて引き継いたラインが生成します。

7. あとはできたラインに対して プロセッシングツール →「Z値の設定」で
 Z値に設定する値:右側のプルダウンメニューから「フィールドの型」で標高値を設定


以上で、ラスタのセルの切れ目で分断され、かつ重なったセルの標高値をZ値としてもつラインが生成します。

sakuya様はすでに玄人ということで画像など省略してしまいましたが…
わかりにくい箇所ありましたらご指摘ください。

sakuya

unread,
Mar 13, 2019, 4:33:03 AM3/13/19
to QGIS初心者質問グループ
adachiさま
お答えありがとうございます。

場所による選択ってそういう時に使うんだ。この方法は結構望んでいた結果に近いことができています。

玄人と認識していただいてありがとうございます。QGISに関しては結構慣れては来ていますがizayoiにはまだ及ばないので精進中。

最初にポイントに分割したのちに「点をつないで線に」を使っていた理由ですが、この方法なら線と線の間に段差ができないからいいなと思って使っていたんです。
GISで平面的に見るならば線に段差ができていてもあまり目立たないのですが、QGISの3次元機能で図面を見ると段差ができているのがちょっとなという感じで
この機能を使っていました。(1mの標高の部分から2mの標高の部分に行ったら、線分がZ方向に1m分の空間ができてしまっている)

ちょっとひらめきました。というより、adachiさまの方法をなぞっているときになんですが、
「ジオメトリツール」→「頂点の抽出」をマウスクリックミスによって見つけることができ、
実行して頂点を抽出してみたら、なんとこれにも距離が「distance」という名称で距離が入っている。
「頂点の抽出」と「ジオメトリに沿った点群」のレイヤを和集合すればできるかも、と思ったのですが、そうはうまくいかなかった。
IDはIDとID_2に分かれてしまい、distanceはdistanceとdistance_2に分かれてしまいました。なんとかIDとdistanceのところに統合できないものか・・・。ちょっと惜しい感じになってきたんですけど、まだいろいろと難しいなぁ。


sakuya_izayoi

unread,
Mar 13, 2019, 5:12:58 AM3/13/19
to QGIS初心者質問グループ
こちらizayoiです。
sakuyaへ。
フィールド計算機で計算させれば良いだけではないでしょうか?例えばIDに関してならば

case
when "ID"='null' then "ID_2"
else "ID"
end

でどうでしょうか?ほかの部分もdistanceに置き換えたりangleに置き換えたりで対処できるはずですが。
駄目ならまた教えてください。

sakuya

unread,
Mar 13, 2019, 6:06:27 AM3/13/19
to QGIS初心者質問グループ
こちらsakuyaです。
izayoiへ。言われて気が付きました。計算できるんだって。ついでに式ありがとう。

adachiさま
adachiさまの方法だと、線の間に空間ができるので、3DCGで立体図にしたときに、高さの判別が容易でした。3Dで高さをデジタル的に見たい時はadachiさまの方法が最適だとわかりました。非常に良い方法です。ありがとうございます。


プロセッシングモデラーでモデルを作成しているのですが、レイヤを結合(Union)した結果に対してフィールド計算をかけたいのですが、これって登録しておくことできないのでしょうか?
ID_mergedというフィールドを作りたい時に
case
when "ID"='null' then "ID_2"
else "ID"
end
を登録しておく

Dista_mergというフィールドを作るために
case
when "distance"='null' then "distance_2"
else "distance"
end
をあらかじめ組み込んでおけたらなと思っております。

sakuya_izayoi

unread,
Mar 13, 2019, 6:56:15 AM3/13/19
to QGIS初心者質問グループ
すみません。式の訂正です。
ID_mergedとするならば
case
when "ID" is null then "ID_2"
else "ID"
end

が正しいです。同じく
Dista_mergとするならば
case
when "distance" is null then "distance_2"
else "distance"
end

です。申し訳ない。

sakuya_izayoi

unread,
Mar 13, 2019, 11:01:45 PM3/13/19
to QGIS初心者質問グループ
こちらizayoiです。
みなさま、身内トークっぽくなってしまい申し訳ないです。

sakuyaへ。
上記の式をグラフィカルモデラーに組み込みたいという要望なら、
アルゴリズム→フィールド計算機
の部分に計算式を入れておくではだめですか?それなら、決まった属性テーブルを決まった書式で一気に計算させることもできますよ。
あるいは式の部分に計算式を入れてフィールド計算機に読ませるとか。

こういう意味でなかったらまた教えてください。

sakuya

unread,
Mar 14, 2019, 12:29:34 AM3/14/19
to QGIS初心者質問グループ
こちらsakuyaです。

izayoiへ。うん、これこれ。これ探していたんです。まさか、アルゴリズムの方だったとは。(確かにアルゴリズムの方探してなかったあたしが悪いんだけども)
これがあれば面倒な計算式を一気に実行させることができるし、中間ファイル作らなくていいからすっきりする。

adachiさま
教えて頂いた方法相当良いです。最初は連続線をと考えていたのですが、足立さまの方法で作った場合、この高さからこの高さまでは表示して、範囲外は表示しない
という応用がきいてすごくいい。ラスタ計算機もプロセッシングモデラーにあったのでこれを組み込んだモデル作ってしまえば作業がはかどります。

おかげさまで思っていた事がきれいに実施できそうです。ありがとうございます。

adachi

unread,
Mar 14, 2019, 10:30:17 AM3/14/19
to QGIS初心者質問グループ
sakuya様

何かしらお役に立てたようで幸いです。
たしかに私のやり方だと、3Dにしたときに段々になってしまいますね...
どのようなアウトプットがほしいかで、操作手順も変わるものだなぁ、と再認識しました。

GISとCADとの組合せは私も興味あるので、いつも興味深く読ませていただいています。
フリーの3DCADで良いものが出てこれば(あるいはもうあるんでしょうかね?)、
一昔前のような「高価高機能なソフトを持ってないとできない」ということがどんどんなくなってきますね。
良い流れだと思います。

sakuya_izayoi

unread,
Mar 14, 2019, 12:15:06 PM3/14/19
to QGIS初心者質問グループ
adachiさま
こちらizayoiです。私もadachiさまの実施方法にはいつも驚かされています。
QGISも3シリーズになってからよりdxfやdwgとの連携がしやすくなりずいぶん作業効率が上がっています。
うまく3dにできたか確認するときは2dcadながら3dラインやポリラインを書けるし、図面を傾けられるdraftsightというcadが個人的にはおすすめです。無料版でもかなり書けます。
あとは趣味なら無料の3dcadならAUTODESKのFusion360がありますね。相当ポテンシャル高いですよ。ふだんそれなりに高価なInventorを使っているのですが、複雑な機械書かないかぎりは十分すぎます。もっともライセンスも購入しやすいし価格だったり。
draftsightで書いて、QGISで編集してdxfで出力し、3D CADや3DCGソフトで立体モデルを作る。最近のマイブームです。
他にも手段はありますが取っつきやすいのはこれらかなと個人的には思っています。
Reply all
Reply to author
Forward
0 new messages