QGISの標準ツールでTINメッシュを作成すると、色情報は作成されません。オルソや道路図などの画像をマッピングした色情報つきのTINメッシュが作成できれば、QGISを起点とした3Dデータ利用の幅が広がります。別稿で作成したdemのTINメッシュに地図を貼り付けてみます。
QGISはフリーでオープンソースの地理情報システムです。
MeshLabはオープンソースのメッシュ変換、処理、可視化ソフトです。
色付きのTINメッシュを作成する考え方
SKラボが理解する限り、QGIS 3.22には色情報を持ったTINメッシュ(plyファイル)を作成するツールが備わっていません。そのため、色情報のないplyファイルの一部を色情報つきのデータで置き換えることにします。
下図左は、「TINメッシュを作成」ツールで作成したplyファイルの例です。(別稿で指摘したバグは修正ずみの状態です。)色情報は、①の位置にred, green, blueのプロパティを加え、②のvertex座標をRGBデータを付け加えたもので置き換えれば良いのです。③のface情報はそのまま残します。
貼り付ける画像ラスタを作成する
まず、RGBデータを持つ画像ラスタを作成します。本稿では、OpenStreetMapを画像ラスタにしてみます。別稿で「ラスタのベクタ化」ツールを使ってDEMをポイントデータに変換したpt_demレイヤを出発点にします。
まずpt_demの範囲をカバーするOpenStreetMapレイヤを表示します。次に「地図のラスタ化」ツールで、地図をカラー画像に変換します。「書き出す範囲」はpt_demから取得します。画像解像度は「ピクセルの地図単位」で設定します。下図では1ピクセル10mにしました。「タイルサイズ」が1024だと10m/ピクセル×1024ピクセルで約10km四方のタイル単位で画像が作成されます。あまり気にする必要はないのですが、生成される画像ファイルの大きさが気になるなら、書き出す範囲をできるだけ無駄なくカバーできるタイルサイズを選べば良いです。あとは、出力レイヤにtifファイルを設定すればOKです。ここではStreetMap.tifファイルを作成しています。
ここではOpenStreetMapを使っていますが、その他の主題図や航空写真、衛星写真など、QGISに表示できる地図ならなんでも画像にできますよ。
ポイントデータの属性テーブルにRGB値を付加する
「ベクタレイヤにラスタ値を付加」ツールを使って、pt_dem.shpにRGBフィールドを付加したpt_dem_color.shpを作成します。
ポイントデータの属性テーブルにX,Y座標を付加する
pt_dem.shpにはまだX,Y座標フィールドがありませんので、①のpt_dem_colorレイヤを選択し、②のフィールド計算機を起動して、③Xフィールドを作成します。式ボックスの$xは、中央の関数リストの「ジオメトリ」関数の中にありますので、選んでダブルクリックすれば設定されます。
同じようにして、Yフィールドも作成しましょう。作成が終わると、属性テーブルは下図のようになっているはずです。「VALUE」カラムはDEMからpt_dem.shpを作成した時に作成された標高値です。
これでvertex座標と置き換えるデータは出揃ったのですが、データの順番がZ, R, G, B, X, Yとなっていることには注意してください。使用する時にはデータの順番をX, Y, Z, R, G, Bに並べ替える必要があります。
属性テーブルをCSVファイルとして出力する
pt_dem_colorレイヤを右ボタンクリックし、「エクスポート」ー「新規ファイルに地物を保存」を選んでCSVファイル(ここではpt_dem_color.csv)に出力します。ファイル名以外はデフォルト値です。
データの形を整える
前々節でも書いたように、pt_dem_color.csvに必要なデータは揃っていますが、カラムの順番を並べ替えた上で、dem.plyに組み込む必要があります。カラムの並べ替えはExcelでできますし、dem.plyへの組み込みはテキストエディタでできるのですが、GISデータの問題は、往々にしてデータの行数が大きくなりすぎ、Excelやテキストエディタで全部を読めなかったり、我慢できないほど動作が遅くなったりすることです。
ここでは、Windowsに組み込まれたLinux環境であるWSL2にインストールしたUbuntuを使って、Linuxコマンドで整形することにします。ただし、WindowsとLinuxは行末コードが違いますので、混ぜてしまわないように注意してくださいね。
カラムの並べ替え
UbuntuからはWindowsのCドライブは/mnt/c/でアクセスできますので、データがある場所までcdコマンドで移動しておきましょう。以下のターミナル画面では、あらかじめ cd /mnt/c/GISdata/dumy で作業対象フォルダを移動してあります。
まず下図では、headコマンドでpt_dem_color.csvファイルの先頭数行を確認しています。既に述べた通り、Z, R, G, B, X, Yの順になっている上に、RGBの値がダブルクオーテーションで囲われていますね。
下図のように、nkf, sed, awkを使ったパイプラインでカラムを並べ替えました。(nkfは標準でインストールされていませんでしたが、nkfとタイプするとインストール方法が表示されますので、それに従えば簡単にインストールできます。)
コマンドパイプラインは以下のようになっています。縦棒 “|”はパイプラインで、コマンドのテキスト出力が次のコマンドの入力になることを示します。不等号 “>”はリダイレクションで、テキスト出力を新しいファイルに保存することを示します。詳しくはLinuxの基礎を学んでくださいね。
nkf -d pt_dem_color.csv | sed -e '1d' | sed -e 's/\"//g' | awk -F '[,]' '{print $5 " " $6 " " $1 " " $2 " " $3 " " $4}' | nkf -c > pt_dem_color.txt
「nkf -d pt_dem_color.csv」 でpt_dem_color.csvの行末コードをlinuxのものに置き換えます。「sed -e ‘1d’」 で1行目にあるカラム名を削除し、「sed -e ‘s/\”//g’」 でダブルクオーテーション記号をすべて除去します。次の「awk -F ‘[,]’ ‘{print $5 ” ” $6 ” ” $1 ” ” $2 ” ” $3 ” ” $4}’」で、カラムの区切りがコンマであることをawkに指示した上で、カラムの出力順序を変えてスペースで区切って出力します。最後に「nkf -c > pt_dem_color.txt」 でWindowsの行末コードに戻し、pt_dem_color.txtに保存しています。
plyファイルの作成
作業を簡単にするために、plyファイルのヘッダー部分(plyからend headerまで)はあらかじめWindowsのメモ帳などで作成し、header.txtとして保存しておきます。dem.plyから9行コピペして3行書き加えれば良いですね。
すると、以下のコマンドでdem_color.plyが作成できます。
cat header.txt pt_dem_color.txt > dem_color.ply tail -n 12673715 dem.ply >> dem_color.ply
一行目は、header.txt と pt_dem_color.txt を順番にdem_color.plyにリダイレクトして保存します。二行目は、dem.plyの末尾12673715行をdem_color.plyに追加します。二重不等号 “>>” はファイルへの追加です。「12673715」という数字はheaderに記載されているelement faceの数です。
下図の実行画面ではheater.txtとpt_dem_color.txtを別々にdem_color.plyに出力していますが、結果は同じです。
これで色情報つきのplyファイルができました。
header.txtとdem.plyはWindows上で作成し、pt_dem_color.txt は nkf -c でWindowsの行末コードに変更することで、それらを組み合わせたdem_color.plyが確実にWindowsの行末コードを持つよう注意して作業しているよ。あと、空白行ができないよう注意してね。混ぜるな危険!
MeshLabで表示してみる
dem_color.plyをMeshLabにインポートし、海面上昇5mの水面メッシュを重ねてみました。
地図を重ねることでグッと現実感が増しますね。はじめてだと工数が多くて難しく感じると思いますが、慣れてしまえば大丈夫。いろいろ工夫してください。 Have fun!
コメント