ラインの頂点の移動をする方法が見つかりません。

89 views
Skip to first unread message

遠藤真

unread,
Sep 22, 2022, 3:40:06 AMSep 22
to QGIS初心者質問グループ
プロセッシングでラインの頂点を移動する方法がありましたら、
ご教授頂けませんでしょうか。
ジオメトリのチェックで離れた場所の抽出はできるのですが、1つずつ
修正していかなければならないため、モデラーで組めないかと考えました。

ジオメトリの$x-at(n)等に数値を直接入れることができればと思いますが、
方法が見当たらなかったため、以下のような方法で確認しました。

1.ラインの$idを新規のlid(integer)に代入する。
2.ラインの特異点の抽出で0、-1で始点終点を求める。
3.移動先の点を用意する。
4.その点の座標をspx,spy,epx,epyとして代入する。
5.平行移動で、終点に以下の処理を行う。
   x軸オフセット:if(  "vertex_pos" = 0,  "spx" - $x,  0.0 )
   y軸オフセット:if(  "vertex_pos" = 0,  "spy" - $y,  0.0 )
6.5の結果に平行移動で、始点に以下の処理を行う。
   x軸オフセット:if(  "vertex_pos" = -1,  "epx" - $x,  0.0 )
   y軸オフセット:if(  "vertex_pos" = -1,  "epy" - $y,  0.0 )
7.点を線に変換で、lidでグループにして線を作成する。

上記の処理を手動で操作した場合は正しく処理されたのですが、
モデラーでは意図した結果になりませんでした。

そこで、実行しているコマンドのログを見たところ、関係する部分が

'DELTA_X' : QgsProperty.fromExpression('if( "vertex_pos" = -1, "spx" - $x, 0.0 )'), 'DELTA_Y' : QgsProperty.fromExpression('if( "vertex_pos" = -1, "spy" - $y, 0.0 )')

となっていました。
モデラーでは、この部分がそのままではエラーで動かなかったため、
'vertex_pos'のようにシングルクォートでくくって見たのですが、
DELTA_X: 0, DELTA_Y: 0,
となって計算されませんでした。
色々試してみたのですが、この項目に計算式を入れても計算されないようでした。
手動の時のような式をモデラーに入れることは可能でしょうか。

よろしくお願い致します。

mooya

unread,
Sep 22, 2022, 9:28:20 PMSep 22
to QGIS初心者質問グループ
make... さま

 こんにちは。
 状況を再現してみようと思ったのですが、3,4あたりからよくわからなくなりました。

 平行移動の挙動が単体の実行とモデルで挙動が違うという趣旨だと思いますので、再現する条件を特定して、詳細な入力と出力、環境(QGIS,OSバージョン等)を提示されると良いと思います。

 試しましたが、QGIS 3.22.9/Win10で、モデルを使ったときに平行移動がエラーになるという状況は再現できませんでした。



2022年9月22日木曜日 16:40:06 UTC+9 make...@gmail.com:

ありた

unread,
Sep 23, 2022, 12:05:40 AMSep 23
to QGIS初心者質問グループ
こんにちは

目的が少しつかみづらかったのですが、ラインに対し、始終点のみを並行移動
させたいということでしょうか。

エラーとありますが、どのようなエラーなのかログを(できれば完全に)
提示していただけないでしょうか。
また「計算されませんでした」というのはエラーにより処理が完了しなかったのか
処理された結果、意図と異なる結果が得られたのか、どちらでしょうか。

可能ならばモデルを保存し、添付していただけないでしょうか。

よろしくおねがいします。

遠藤真

unread,
Sep 25, 2022, 2:21:54 AMSep 25
to QGIS初心者質問グループ
mooya様
ありた様

ご返信有り難うございます。
返事が遅くなってしまい、申し訳ございませんでした。

基本的に全て接続している線軍の集まりに、線を追加した際に、完全に接続されていない
リンクをチェックして接続しようとしました。
ジオメトリの確認でできることは分かっていたのですが、全リンクを確認して自動的に
接続ることを目的としています。

ラインの頂点を個々に移動できる方法があれば(というか、見つけられなかったので)
一端線の頂点をポイントにして平行移動を使用すればできるのではと、あれやこれや
思考錯誤しておりました。

途中で作成される「pp2」が未接続頂点があるポイントになります。
それを、接続する点群の重心に移動してから線に戻すように考えました。
その次にある平行移動×2で始点、終点を移動しています。
そこに書かれているコマンドを手動で実行した場合は、意図したように
重心点で接続されました。

モデラーと実行時のログ、元のシェープファイルを添付します。
スミマセン。試行錯誤の結果、無駄な処理も入っていて見づらいと思いますが、
作成したモデラーをお送り致します。
ギャップは約1mにしてますので、バッファは2m以上にすればいいはずです。
実際に動作させる際には、[フィールド計算機 ppid]までで、それ以降を無効化し、
「pp2」を作成して手動で実行して確認しました。

ご教授の程、どうかよろしくお願い致します。

動作は以下の環境でおこなっています。
Windows11  Pro
QGIS 3.26.2

2022年9月23日金曜日 13:05:40 UTC+9 ありた:
20220915-1.zip

遠藤真

unread,
Sep 25, 2022, 2:44:07 AMSep 25
to QGIS初心者質問グループ
先程お送りしたファイルに、手動で実行した際のログを添付し損ねました。
改めてお送りします。

2022年9月25日日曜日 15:21:54 UTC+9 遠藤真:
20220925-2.txt

mooya

unread,
Sep 26, 2022, 10:11:27 AMSep 26
to QGIS初心者質問グループ
make...さま、ありたさま

 こんばんは、
 平行移動のオフセット距離XYの左端の種別が「事前計算済値」を選択されています。
 これを「値」に変更して、右端のアイコンから編集を選んで式を入れると、エラーが出ず処理が通りました。

 値と事前計算済値の使い分けは、私も十分理解していませんが、地物を対象とした計算は基本的に値を使うと思います。
 事前計算済値は、例えば、gdal(例えば 再投影(warp)など)の追加コマンドラインパラメータ などパラメータとして文字列などを入力する際に使うものと思います。


2022年9月25日日曜日 15:44:07 UTC+9 make...@gmail.com:

遠藤真

unread,
Sep 26, 2022, 8:50:06 PMSep 26
to QGIS初心者質問グループ
mooya様

ご助言、ありがとうございました。
お教え頂いた方法で、意図する処理を完了することができました。
モデラーは、必要な処理のみに整理して使用したいと思います。

値と事前計算値の使い方は、そのようになっていたのですね。
選択がいろいろあり、奥が深いとつくずく感じました。
たしかに、手動で処理を行っていた時には、何の選択もせずに
編集をクリックして、計算式を入れていました。

そもそも、このような回りくどい方法になってしまったのは、
ジオメトリの$xや$yに直接値を代入する手段が分からなかった性で、
それができる方法はあるのでしょうか。
Pysonについては学習しだしたばかりで、QGISからの呼び出しなど
頂上ははるか遠く、精進しなければと思っています。

ありた様からもご指導ご鞭撻頂きまして、まことにありがとうございました。
今後ともよろしくお願い致します。
2022年9月26日月曜日 23:11:27 UTC+9 mooya:

mooya

unread,
Sep 28, 2022, 9:47:40 AMSep 28
to QGIS初心者質問グループ
こんばんは、

 プロセッシング 式によるジオメトリで、make_point関数を使うと座標を直接指定できます。
 その他、ラインやポリゴンの作成関数もあります。

 処理が複雑で理解できていないので、適切な回答かわかりませんが。。


2022年9月27日火曜日 9:50:06 UTC+9 make...@gmail.com:

遠藤真

unread,
Sep 29, 2022, 2:14:41 AMSep 29
to QGIS初心者質問グループ
mooya様

アドバイスをありがとうございます。
「式によるジオメトリ」に以下の式を入れて無事に移動したラインを生成することができました。
 make_line( make_point("spx", "spy" ),make_point( "epx", "epy" ))
「式によるジオメトリ」というもの自体、分かっていませんでした。
アドバイスを頂いたことで、できなかったことができるようになりました。
作成したモデルをスリム化て、これから使用していきたいと思います。

本当にありがとうございました。
Reply all
Reply to author
Forward
0 new messages