QGIS,GRASSGIS v.sampleで作る断面図

#はじめに
はじめまして、Qiita初投稿です。mooyaと申します。
ここ3年ほどQGISにはまってまして、仕事でも使ってますし、[QGIS初心者質問グループ](https://groups.google.com/g/qgisshitumon01)に出没しています。
この投稿ではQGISのラスターとポリラインから作る断面図作成プロセッシングの出力を確認した後、グラフィカルモデラー、ポイントのラスター値を取得するv.sampleを使って断面図を作ります。

#断面図に品質？
ラスターとポリラインから作る断面図なんて何を使っても同じだろうと漠然と思っていたのですが、QGISに含まれているsagaのProfile from linesで作った断面図がなんかおかしい、単調な勾配の斜面でがたつきがある。
そこで、ほかのソフト（arcgis、surfer）と比較していみるとarcgis≒surfer≠sagaで、同じラスタとポリラインから作る断面図でも実装によって出力が異なること、sagaがやっぱり何かおかしいことがわかりました。

#サンプルラスタと測線の作成
　まず、断面図の元になるラスターデータの作ります。最初は富士山のデータをダウンロードしようと思ったのですが案外データが大きかったのと、趣旨からいって解像度の荒い単調なデータが良いので、「IDW内挿（逆距離加重法）」で作ることにしました。
　断面を作る測線は、ラスタに対し斜交しnodataを通るA測線と、ラスタのピクセルの中央を通るB測線を作成しました。
IDWの元データ
![01-idw-line.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/184e8630-88d5-b053-0b15-1394c54a7a6e.png)
IDWで作成したラスターと測線　-10以下はnodataを設定
![02-idw-raster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/632179e7-1048-18ad-687d-1a7cb2e6e922.png)

#断面図作成プロセッシングの出力
##saga Profile from lines
 sagaのprofile from lineを使ってA測線の断面を作成します。ポイントは断面上にセルサイズで等間隔に作成され、ラスタのピクセル値とポイント値は異なるので、何等か内挿補完がされているようです。
![03-saga-heimen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/8c16c8b3-9efb-d5cb-a5d2-3a10fcb888c3.png)
　断面図は、IDWでラスタを作成したにしては、歪みがあります。
![04-saga-profile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/63c1e20d-6822-cea5-f9af-32a2c327d84c.png)
##grass r.profile
　もうひとつ、grassのr.profileを使ってA測線の断面を作成します。入力のラインが数値指定で出力もテキストですが、変換して同様に平面、断面を作ります。
　ポイントはsaga同様等間隔でラスタのピクセル値とポイント値は同じなので、近傍値を取得しているようです。
![05-grass-r-profile-heimen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/54660afe-d79a-417e-b9d3-0eaef64b4178.png)
　同じピクセルに複数のポイントが入ると水平になります。
![06-grass-r-profile-profile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/a4c1ed05-73c7-5cd2-cf66-1034c9b3e460.png)

#grass v.sampleで作る断面図
　ここから本題のラスター値を内挿補完で取得できるv.sampleを使って断面を作ります。
##v.sampleメソッド比較
　最初に、ピクセル中央を通るB測線でv.sampleの3つのメソッドの出力を確認します。B測線に1m間隔で点を作り、3つのメソッドで値を取得すると、
![07-grass-v-sample-heimen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/ce0e9ea8-b8c6-064e-07f5-9cdd47a6d4a1.png)
　nearestは階段状、bilinearはピクセル間は直線的に内挿補完、bicubicは曲線で内挿補完されます。bicubicが滑らかな曲線が得られていますがこのラスターの場合、bilinerもあまり変わりません。
![08-grass-v-sample-profile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/a2dc0bf5-65dc-3969-4525-8467938c9eae.png)
 
##ライン上のポイント作成と値の取得、選択
　ラスターの値を反映するため、ライン上のポイントはピクセル中心を通るラインと交差するところに作ります。ポイントにv.sampleでラスター値をつけると、ラスターのnodata近傍はbicubic,bilinearのポイントが欠けました。そのため値の優先順位をbicubic→bilinear→nearestとして、値を設定しました。
![09-grass-v-sample-method.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/e48a72ba-da41-fb43-b981-8befdfdeddd6.png)
　断面図は比較的自然な曲線が得られています。水平距離200m付近にnearestの点が２つ連続しており、水平になっています。これはこの方法では改善できないですね。
![10-grass-v-sample-profile2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/93d500fe-a1a6-b92d-978f-dde734886b4f.png)
　起点側の形状が他の断面と違い凹地になっていたので確認してみると、これはこれで合っているようです。
![11-grass-v-sample-heimen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/6edc39c6-76b5-efec-19a9-3626fff83235.png)
#グラフィカルモデラ
　というようなことを、手作業でやっていたら大変なのでグラフィカルモデラを作りました。
![12-modeler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/7518d04c-384f-e31b-76cf-426bbd1be1f9.png)
入力画面
![13-input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/01c8cbee-d007-84ee-89b2-36f5462fb72f.png)
「ベクタレイヤの散布図」で簡易的に断面も出ます。
![14-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/5083ab24-1de3-935e-4466-bc0f16c1c26f.png)
#QGISモデルファイル
　QGISモデルをアップロードしました。

https://github.com/motohirooya/profile_grass_v_sample

　QGIS 3.16.14 Windows10,64bit,exe版で作成しています。MSI版ではv.sample実行時にエラーが発生します。
　解決方法をご存じの方コメントをお願いします。

<details><summary>エラーメッセージ</summary>
Traceback (most recent call last):
File "C:\PROGRA~1/QGIS32~1.1/apps/qgis/./python/plugins\grassprovider\Grass7Algorithm.py", line 433, in processAlgorithm
Grass7Utils.executeGrass(self.commands, feedback, self.outputCommands)
File "C:\PROGRA~1/QGIS32~1.1/apps/qgis/./python/plugins\grassprovider\Grass7Utils.py", line 397, in executeGrass
for line in iter(proc.stdout.readline, ''):
UnicodeDecodeError: 'cp932' codec can't decode byte 0x84 in position 35: illegal multibyte sequence
v.sample nearestの実行中にエラーが発生しました
Execution failed after 8.55 秒（seconds）
</details>