QGISで点群データからTifを一括作成したいのでpythonコードを組んでみる
本記事は以下の記事を参考にしています。
・三次元点群データをQGISでひり出してみた
処理の大まかな流れとしてはtxt→las→dtm→tifの順で作成します。
事前準備
- QGIS 3.28.6
- LAStoolsのセットアップ
-
FUSIONのセットアップ
※ LAStoolsとFUSIONの本体DL後のインストール先に関して
こちらの環境だと何故かCドライブ直下に置かないと動きませんでした
もし動かないのであれば参考にされてください。
(理由は分かりません、だれか教えてください)
点群データ(txt)のフォーマット
1 | -14000 | 69712.16 | 59.38 | 2 |
---|---|---|---|---|
2 | -14000 | 69714.98 | 60.93 | 1 |
3 | -14000 | 69715.75 | 61.02 | 1 |
4 | -14000 | 69728.65 | 53.12 | 1 |
5 | -14000 | 69744.88 | 50.03 | 1 |
6 | -14000 | 69706.35 | 54.81 | 2 |
7 | -14000 | 69747.85 | 48 | 2 |
8 | -14000 | 69748.55 | 49.81 | 1 |
9 | -14000 | 69719.77 | 54.95 | 2 |
10 | -14000 | 69741.7 | 51.9 | 1 |
11 | -14000 | 69703.45 | 62.23 | 1 |
12 | -14000 | 69720.27 | 49.39 | 5 |
上記はNo,X,Y,Z,flgのフォーマットとなります。
QGISのpythonコンソールからプログラムの実行
3.以下のコードをエディタに張り付けます
target_pathを作業対象フォルダの絶対パスで書き換えてください
target_pathで指定した作業対象フォルダの中に不要なtxtは格納しないでください
import processing
import os
"""
in: target_path txtが入ったフォルダを指定
※target_pathで指定したフォルダには作業対象の
txt以外入れないでください
out: target_pathにtifとlasとdtmが作成される
"""
target_path = r"C:\Users\user\hogehoge"
for filename in os.listdir(target_path):
if filename.endswith('.txt'):
input_txt_path = os.path.join(target_path, filename)
out_name = os.path.splitext(filename)[0] + ".las"
out_las_path = os.path.join(target_path, out_name)
# lasデータの作成
try:
processing.run("LAStools:Txt2Las", {'VERBOSE':False,
'CPU64':True,
'GUI':False,
'INPUT_GENERIC':input_txt_path,
'PARSE':'sxyz',
# ※1
'SKIP':0,
'SCALE_FACTOR_XY':0.01,
'SCALE_FACTOR_Z':0.01,
'PROJECTION':1,
# ※3
'EPSG_CODE':6670,
'UTM':0,
'SP':0,
'OUTPUT_LASLAZ':out_las_path,
'ADDITIONAL_OPTIONS':''
})
except Exception:
# ※2
print("it's a decoding error, so ignore it.")
# dtmデータの作成
out_name = os.path.splitext(filename)[0] + ".dtm"
out_dtm_path = os.path.join(target_path, out_name)
processing.run("fusion:gridsurfacecreate", {'INPUT':out_las_path,
'CELLSIZE':0.1,
'XYUNITS':0,
'ZUNITS':0,
'VERSION64':True,
'OUTPUT_DTM':out_dtm_path,
'SPIKE':'',
'MEDIAN':'',
'SMOOTH':'',
'MINIMUM':'',
'CLASS':'',
'SLOPE':'',
'ADVANCED_MODIFIERS':''}
)
# tifデータの作成
out_name = os.path.splitext(filename)[0] + ".tif"
out_tif_path = os.path.join(target_path, out_name)
processing.run("fusion:dtm2ascii", {'INPUT':out_dtm_path,
'CSV':False,
'RASTER':False,
'MULTIPLIER':None,
'OUTPUT':out_tif_path
})
print("finish")
※1 txtのフォーマットが変わった場合は'PARSE'のオプション変更が必要
現在のオプションの"sxyz"のsはskip対象列の事、txtが先頭からxyzの順で
並ぶのであればPARSEのオプションはxyzのみで良い
※2 LAStoolsのTxt2Lasでlasを作成する際に何故かUnicodeDecodeErrorになります。
Errorは出てもlasはしっかり吐き出してくれているので問題視はしてないです。
UnicodeDecodeErrorを指定してcatchしようとしても何故か
catch出来ないので無理やりExceptionにしてます。
つよつよエンジニアの方対策教えてください。
※3 座標系は'EPSG_CODE':6670,ここをいじくりまわしてください
4.赤枠の実行ボタン押下
めんどくさかったので終了時のダイアログは用意してないです。
コンソールにfinishと出たらokです。