【実習編】~兵庫県オープンデータを使って建物ポリゴンを立体表示させよう~
I. はじめに
前回のnoteでは、兵庫県が2020年1月に公開した「全県土分の高精度3次元データ」のDSMを用いて、建物等の高さを含んだ地表面の起伏をQGISに表示させました。
しかし、表現方法の1つとして用いた3D景観図では、元のデータが1mメッシュという高解像度であるにもかかわらず、特に建物の表現が呪文を唱えるはぐれメタルのようなうねうねとした立体となってしまい、いまいち格好良くありません。
前回のnoteで作成した3D景観図
きれいな3D景観図を描くことを目的とするならば、CADや3DCGソフトウェアを使った方が確実ですが、もう少しQGISでも頑張ってみようというのが、今回のnoteの内容になります。
II. 方針
DSMやDEMのラスタデータをQGISで3D表示しても、これまで描いたようになだらかな起伏で描かれてしまいます。
そこで、ベクトルデータの3D化に方針を転換します。ベクトルデータの属性に、DSMとDEMから求めた建物高さの値を付与し、その高さの値をもとに3D化します。
III. データの準備
1. DSM
DSMは前回と同様にメッシュID:「05OF89」のデータを使用します。ダウンロードしたテキストファイルをgeotiffに変換したラスタデータを用意しましょう。変換方法はこちら。
--- --- --- --- --- --- --- ---
2. DEM
DSMと同じ場所のDEMを用意します。ラスタ形式で使用したいので、DSMと同様に、ダウンロードしたテキストファイルをgeotiffに変換しておきます。
※このnoteで扱うDSMとDEMのラスタデータを用意しました。
--- --- --- --- --- --- --- ---
3. 建物形状のポリゴンデータ
建物形状のポリゴンデータは、DSMやDEMと同じ範囲のものを基盤地図情報かOSMデータのどちらか好きな方からダウンロードして使用しましょう。全く同じ領域を直接入手することはできないので、重なる範囲をざっくりと入手できれば構いません。
## 基盤地図情報を用いる場合
基盤地図情報のデータをダウンロードする場合は、検索条件指定から「建築物の外周線」にチェックを入れると、使わないデータを除いた最小限のダウンロードサイズで済みます。
## OSMを用いる場合
OSMの場合は、入手する地域によっては建物ポリゴンが十分に整備されていない可能性があります。三宮や東灘区の一部、西宮などは建物ポリゴンが充実していますが、それ以外の地域ではまちまちです。OpenStreetMap.orgからダウンロードする場合、ラスタ1枚分の範囲(兵庫県メッシュの4分の1サイズ)であれば、容量制限にかかることなくダウンロードできます。
広域の建物ポリゴンを取得したい場合は、「overpass turbo」というサービスもあります。これは、Overpass APIと呼ばれるOSMのデータから欲しい情報のみを抜き出す機能を、結果を地図上で確認しながら扱えるようにしたサービスです。
画面左のエリアにコードを記述し、上のメニューの [ 実行 ] をクリックすれば、検索結果が地図上に表示されます。コードの書き方は、OSMwikiの「言語ガイド」や「Overpass QL」などに詳しい説明がありますが、今回のように建物データを取得するだけなら自分でコードを書かなくても利用できます。
まず、データを取得したい領域を地図上に表示しておきます。次に、メニューの [ ウィザード ] ボタンをクリックします。新しく表示されたボックスに「building」と入力して [ クエリを作成して実行 ] を押しましょう。検索数が多いと警告が出ますが、そのまま処理を続行させると、検索結果が地図上に表示されます。メニューの [ エクスポート ] からGeoJSONを形式でダウンロードすれば、QGISで読み込める建物形状データが取得できます。
III. 建物高さの算出
DSMとDEMを用いると、建物の高さの値を計算することができます。DSMは地物の高さを含んだ高さの値、DEMは標高値のデータであるため、
DSM - DEM
と計算をすれば、建物の高さを算出できます。DSMからDEMを引いて算出されたデータのことを、特に森林学の分野では、DCM(Digital Canopy Model)と呼んでいます(※1)。
都市を対象としたときにDCMと呼ぶことが妥当かは微妙なところですが、名前があった方が分かりやすいので、このnoteでも便宜的にDCMと呼ぶことにします。
※1 建物だけでなく、樹木の高さも算出できるので。canopyとは林冠を意味する英単語です。気候・気象学では、ビルが林立した都市部でも都市キャノピーと呼ばれる3次元モデルを考えて、ヒートアイランド現象のような都市特有の気象現象を研究しています。
このように、ラスタの各ピクセルの値を使って計算を行うことをラスタ演算と言います。QGISでは、ラスタ計算機という機能を用いてラスタ演算を行います。QGISにDSMとDEMのラスタデータを読み込んだ状態で、ラスタ計算機を開きましょう。メニューバーの「ラスタ」から「ラスタ計算機」をクリックすると、設定ウィンドウが開きます。
「ラスタバンド」の枠に、DSMとDEMのレイヤ名が表示されています。ここでDSMをダブルクリックすると、ウィンドウ下の「ラスタ計算機の式」にDSMレイヤが入力されます。マイナスの演算子とDEMレイヤも式に入力し、下図のような計算式を完成させましょう。ウィンドウ右上の「出力レイヤ」に保存先と名前を指定したら [ OK ] をクリックし処理を実行します。
処理が完了すると、DCMがレイヤに追加されます。下図は、DCMを疑似カラー+陰影図のオーバーレイで示したものです。もともと低地なこともあり、パッと見た限りではDSMとの違いは分からないですね。DEMやDSMでは画像左上(北西部)でなだらかな斜面が確認できましたが、DCMでは標高の成分がキャンセルされ、低い高度の配色が割り当てられています。
IV. DCMの値をポリゴンデータに付与する
さて、DCMによって建物高さを算出することができました。次は、DCMが持つ情報を建物ポリゴンに付与する作業を行います。まず、建物ポリゴンをQGISに表示させましょう。ここでは、建物ポリゴンに基盤地図情報のデータを使用します。
1. 基盤地図情報の読み込み
ショートカットキー [ Ctrl ] + [ Shift ] + [ V ] でベクトルファイルの読み込みウィンドウを開き、基盤地図情報ウェブサイトからダウンロードしたzipファイルをQGISに追加します。エンコーディングは「SJIS」です。[ 追加 ] ボタンをクリックすると、zipには建物領域の「BldA」と建物外周線の「BldL」がありますが、「BldA」のベクタタイプのものだけ読み込めばOKです。0001、0002のように複数に分かれている場合は、両方読み込みましょう。
--- --- --- --- --- --- --- ---
2. 複数ファイルの結合
複数ファイルを読み込んだ場合は、マージ機能を用いてレイヤの結合を行います。メニューバーの「ベクタ」から「データ管理ツール」→「ベクタレイヤのマージ」をクリックします。マージウィンドウで、入力レイヤに結合するレイヤを指定し、出力先を指定したら [ 実行 ] をクリックします。
--- --- --- --- --- --- --- ---
3. 処理範囲のポリゴンを抽出
ラスタのサイズに対し、基盤地図情報の建物ポリゴンは広域にわたって存在します。ラスタがある範囲でしか高さデータを付与することはできないため、多くは不要なフィーチャです。不要なフィーチャを持ったまま処理を続けると無駄に時間が掛かってしまうため、あらかじめ不要なフィーチャは削除しておきましょう。
実際には、不要な部分を削除するのではなく、必要な範囲のフィーチャを選択して切り出す処理を行います。切り出す範囲を選択する方法は2つあります。
1. 手動で選択する
2. 空間演算を用いて選択する
空間演算を用いると、条件に対して正確に結果を返してくれます。したがって、空間演算を使った方がスマートで良いように思いますが、ラスタのサイズに対し建物ポリゴンが広域にわたって存在することを思い出すと、計算対象となるフィーチャ数が多くそれだけ処理時間が掛かります。
一方、手動で選択する方法は、フィーチャ数に依らず範囲をマウスでドラッグするだけなので短時間で必要な範囲を選ぶことができます。空間演算を用いる場合でも、まず手動で大雑把に切り出した後に空間演算を行う方が良いかもしれません(※2)。
というわけで、ここでは手動で選択します。DCMラスタの上に建物ポリゴンが表示された状態で、カーソルを地物選択ツールに変更します。そして、ラスタの若干内側を範囲選択を使って選択しましょう。建物ポリゴンレイヤを右クリックし、「エクスポート」から選択フィーチャを新規に保存します。
※2 プログラミングで処理を行う場合は手動を挟むわけにはいかないので、空間演算をゴリ押しするか、別の手を考えるしかありません。データを入手する段階で必要な範囲だけを取得するようにするとか、少ない計算量で切り出す手法を考えるとか・・・。
--- --- --- --- --- --- --- ---
4. 高さの値をポリゴンと重なるラスタから抽出する
GISでは、空間的に重なっているデータ同士を関連付けて属性情報を結合したり演算したりすることができます。ここでは、建物ポリゴンと重なるラスタのセル値を計算して、建物ポリゴンの属性テーブルに付与する手法について紹介します。
まず、メニューの「プロセシング」から「ツールボックス」をクリックします。表示されたツールボックスの「ラスタ解析」から「ゾーン統計量」を選択します。
ゾーン統計量ウィンドウでは、設定項目が4か所あります。「計算する統計量」は建物ポリゴンの各フィーチャについて、ラスタと重なる範囲のピクセル値に対して平均や最大値などを算出し、属性テーブルに格納します。今回は平均、中央値、最大値のいずれかがあれば良いでしょう(※3)。項目を設定したら、[ 実行 ] ボタンをクリックします。
・ ラスタレイヤ・・・DCMレイヤを選択
・ 対象バンド・・・バンド1(高さの値が入ったバンド)
・ 分析ゾーンのベクタレイヤ・・・建物ポリゴンレイヤ
・ 計算する統計量・・・平均(中央値、最大値)にチェックを入れる
※3 平均と最大値は、その領域内に異常値や外れ値が多くあると算出される値も異常値に引きずられて実際の値からズレてしまう場合があります。「平均、中央値、最大値のいずれかがあれば」と書きましたが、実際には3つとも算出し、値の傾向を比較すべきかもしれません。データの検証という点では、標準偏差も重要な指標になります。
ゾーン統計量の処理が完了したら、建物ポリゴンの属性テーブルを開いて結果を確認してみましょう。テーブル右端に、統計量が追加されています。
V. 建物ポリゴンを3D表示する
それでは、神戸の街並みを3Dで表示してみましょう。ここまでQGISでいろいろなファイルを開いたり作業したりしたので、再起動して必要なデータだけ読み込み直しましょう。
3D表示に使用するデータは、建物ポリゴンデータ、DEMラスタ、国土地理院空中写真です。この3つを読み込んだとき、キャンバスの座標系が投影座標系(EPSG:2447や6673など)になっていることを確認します(※4)。
建物ポリゴンにはシンボロジを設定しておきましょう。ここでは、高さの値で分類分けし、不透明度を80%に設定しています。
※4 3Dビューでは、距離をメートルを単位として描画します。したがって距離を「角度」で表現する地理座標系を用いていると、針のように細長いナニカが表示され、正しく描画できません。
3D表示にはQgis2threejsを使用します。QGISに備わっている3Dビュー機能にはポリゴンを3Dに立ち上げる機能がありません。
Qgis2threejsは、QGISで描画している範囲を3D化します。このとき、範囲が広いと処理が重かったり描画の途中でエラーが発生したりするので、最初は大縮尺にした状態でQgis2threejsを起動しましょう。
Qgis2threejsを起動したらLayersからDEMとPolygonにチェックを入れます。この状態ではまだポリゴンは3Dになっていません。ポリゴンレイヤを右クリックし、プロパティの設定を行います。設定箇所は以下の通りです。設定が完了したら [ OK ] ボタンをクリックします。
・ Object type・・・「Extruded」に変更する
・ Mode・・・DEMラスタを指定
・ Height・・・下のプルダウンメニューから高さに使うカラムを指定(meanなど)
すると、ポリゴンが属性値の値に応じて立体に描かれます。建物が建物らしく、垂直に林立しましたね。
建物のシンボルは、QGISの設定が反映されます。下図のように、高さの値でグラデーションを設定をすれば、濃い色のフィーチャほど高く立ち上がっており、高さの値が反映されていることを確認できます。
この立体に立ち上がったポリゴンに建物のテクスチャーを貼り付けることができれば、より都市の景観モデルとしてクオリティの高い絵が描けそうです(※5)。しかし、QGISで出来ることはここまで。現状ではテクスチャの貼り付け機能はありません(※6)。
※5 ちなみに、建物形状を立ち上げただけの立体のことを「豆腐モデル」と呼びます。もちろん、オフィシャルな呼称ではなく界隈で発せられる俗称(蔑称)です。いつからこう呼ばれるようになったのかは分かりませんが、Google Earthに家形の3D表示機能が付いたときに、その白く直方体で描かれたモデルを見てよく「豆腐モデル」と呼ばれていました。そういえば、マインクラフトにも似た意味で「豆腐建築」なる言葉がありますね。
※6 誰かがそのような機能を持ったプラグインを開発していない限りは・・・。
VI. おわりに
今回はベクトル形式の建物形状ポリゴンに高さ情報を付与し、その値で3D化しました。
高さの情報を持った建物データは、商用のものではESRI Japanが販売するArcGIS Geo Suite 詳細地図やゼンリンが販売するZmap-TOWNIIなどがありますが、個人で買うには現実的でない価格です。
DSMとDEMを使えば、簡易的ではありますが高さ情報を持った建物データを作ることができ、今回のような3D景観図も描けるようになります。出来上がりは豆腐モデルによる描画でしたが、それでも都市景観っぽい雰囲気のある図が描けたのではないかと思います。
3次元空間を2次元で表現するために考案されたのが地図、それをデジタルシステム化したGISはもともと3次元処理が得意ではありません。
いくつかあるGISソフトの中でも、QGISはこれまで3次元機能が乏しいと言われてきました。最近になってQgis2threejsプラグインの登場や、3Dビューワーの標準搭載によって幾分かマシになってきましたが、それでも3D業界の発展には追い付いていないのが現状です。
QGISのこれからの発展に期待しつつ、今は3DCGソフトフェアとGISをうまく使い分けていきましょう。