QGISで1サーフェス以上の3Dデータを扱いたい時に今できること

アイキャッチ, qgis-tinmesh QGIS

QGISには3Dビューがありますが、DEMなど単一の3Dサーフェス上に2Dデータをマッピングするだけです。どうしても無料で2つ以上の3Dデータを表示したいなら、現状(QGIS Ver 3.22.x)では他のソフトの助けを借りる必要があります。本稿ではMeshLabを使ってできるだけ簡単に3Dデータを表示する例を示します。

QGISはフリーでオープンソースの地理情報システムです。
MeshLabはオープンソースのメッシュ変換、処理、可視化ソフトです。

QGISの3Dデータ表示には限界がある

「3Dビューを使いこなす」で、QGISで3Dデータを表示する方法を説明しました。この方法で目的が達成できることも多いのですが、3Dビューでは標高データのソースとして単一のサーフェスしか設定できないので、異なる高さを持つ複数の3Dレイヤを表示させることができません。例えば、DEMデータに色々な高さの水平面を重ねて、水没する場所を図示する、などです。

すだくん
すだくん

もちろん、水没する範囲を出したいだけなら、ラスタ計算機で水位ー標高を計算して正になる範囲を抽出するなど、いくらでも方法はありますが、簡単に3D画面上で見たい時もありますよね。

商用のArcGISでは、標高サーフェスの他に複数の3Dレイヤや標高値をフィールドに持つ2Dレイヤを同時に表示できます。3D表示はまだQGISがArcGISに追い付いていない部分と言えますね。

それでもなんとかQGISで(というより無料で)複数の3Dレイヤを扱いたいなら、現状では他の無料ソフトの助けが必要です。本稿では、MeshLabを使ってQGISで使っているデータを3D表示する方法を考えます。

その1:DEMをTINメッシュに変換する

1つ目の3Dデータとして、DEMをMeshLabが読めるTINメッシュに変換します。

まず、TINの頂点となるポイントデータを「ラスタのベクタ化」ツールで作成します。DEMの標高値はVALUEフィールドに記録されます。

「ラスタのベクタ化」ツールでDEMをポイントデータに変換する
「ラスタのベクタ化」ツールでDEMをポイントデータに変換する

次に、「TIMメッシュを作成」ツールでply形式のTINメッシュを作成します。下図のように、VALUEフィールドをZ値に割り当てていますよ。

「TINメッシュを作成」ツールでply形式のTINメッシュを作成する
「TINメッシュを作成」ツールでply形式のTINメッシュを作成する
かわのさん
かわのさん

「ラスタのベクタ化」ではDEMの大きさや解像度によってはQGISが重くなるほど大量のポイントが生成される時もあるわ。あらかじめDEMをリサンプリングしてセルサイズを大きくし、ポイント数を少なくすることも考えた方がいいかもね。

plyファイルをMeshLabにインポートする

MeshLabはplyファイルをインポートできるはずなのですが、前節の方法で生成したplyファイルは下図左のようにエラーが出て開くことができません。plyファイルはテキストファイルなので、エディタで開いてヘッダー部分にある大文字のX Y Zを小文字のx y zに書き換えます。これで、MeshLabにインポートすることができるようになります。

「TINメッシュを作成」ツールが出力したplyファイルにはバグがあるようだ
「TINメッシュを作成」ツールが出力したplyファイルにはバグがあるようだ

なお、plyをただインポートしただけではdemが灰色に表示されているので、MeshLab右側のパネルでレイヤをFill表示にし、ColorのUser-Defで茶色にしてあります。

すだくん
すだくん

ここではサラっと書いてありますが、別のソフトで作成した正常なplyと見比べて少しづつ書き換えては試すことを繰り返し、ようやくエラーの原因を見つけたんですよ!これってどっちかのソフトのバグですよね?コミュニティに報告して、直してもらおうと思います。

その2:ポイントデータをTINメッシュに変換する

2つ目の3Dデータとして、水面を模した平面メッシュを作成しましょう。そのために、新たにplaneというポイントシェープファイルを作成し、DEMの四隅にポイントを打って、フィールド計算機でX, Yフィールドに座標値を設定し、Zには0を入れました。このポイントデータを、先ほどと同じように「TINメッシュを作成」ツールでplyファイルに変換します。

水面を表すTINメッシュを作成する
水面を表すTINメッシュを作成する

MeshLab上で水面の位置を動かしてみる

先にdem.plyをインポートしたMeshLabに、plane.plyもインポートしてみます。色はdem.plyと同様の方法で水色にしてみました。下図上がその状態です。DEMの水面も0mなので、demレイヤとplaneレイヤが重なってモアレ状になっていますね。

次に、「Filters」-「Normals, Curvatures and Orientation」ー「Transform: Translate, Center, set Origin」で下図右下のダイアログを出し、Z Axisにplaneを上昇させたい値を入れてやると、下図下のように水面が上昇して水没範囲が3D表示されます。

plane.plyをMeshLabにインポートし、表示高さを変化させる
plane.plyをMeshLabにインポートし、表示高さを変化させる

その3:洪水時の水面高のデータを表示してみる

前項の例では、温暖化で海面が上昇したような状況を図示したわけですが、洪水の場合には水面高は水平ではありません。下図では、洪水時の浸水水位を実測したデータを補間・外挿して作成したポイントデータを使って、WL.plyファイルを作成しています。ポイントデータのWLフィールドに水位が入っているので、それをZ値として割り当てています。

測浸水水位データからTINメッシュを作成する
実測浸水水位データからTINメッシュを作成する

下図上のWL.plyをdem.plyに重ねてみると、それらしい浸水3Dマップ(下図下)が描けました。

浸水水位をDEM上に3D表示してみた
浸水水位をDEM上に3D表示してみた

MeshLabには多くの機能があるようですので、工夫すればいろいろなことができそうですよ。 Have fun!

かわのさん
かわのさん

でも地表に道路も建物も描かれていないとあんまり参考にならないわね。

すだくん
すだくん

そう言うだろうと思って、画像を貼り付ける方法を考えてみたよ。「色付きの3Dメッシュを作成する」を見てね!

コメント

タイトルとURLをコピーしました