目的
3D表示のための高さ情報を持った建物の形状ポリゴンのデータをQGISを使って作ります。
元にするデータは、12/1のところでダウンロードしてきた国土地理院の基盤地図情報と、JAXAの公開している全球数値地表モデルです。
背景
日本全国のデータとしての建物高さを3D表示するために使える生データで、さらに個人が無料で使えるものは、私が知る限り存在しません。
(もし日本全国を同条件でカバーしているGISなどで自分で操作可能な無料の建物高さデータを知っている人がいたら教えてください。お願いします。)
Open Street Mapなどでは、”一部”の建物の高さ情報が記載されていますし、Google Mapでは3Dで表示できるので、それデータあるよねと言われればあります。また、ゼンリンさんなどが各種有料地図データを販売しています。
つまり、データとしてはあるが、個人では無料で自由に使えないというのはそういうことです。
そこで、公開されているデータを組み合わせて、それなりの根拠のある形での欲しいデータを作ってしまおうというのが、本稿の本題です。
早速やってみる
QGISは、3.8.2を使っています。が、基本的なことばかりなので前後の近いバージョンであればそんなに問題はないかと思います。最近のQGISはバージョンアップが速くて、ちょっと追いつけてない感があります。
QGISに読み込み
前回作ったShapeファイルをQGISに読み込みます。
メニューの「プロジェクト」-「新規作成」などでプロジェクトを作成し、「プロジェクト」-「保存」で任意の場所に保存しておきます。
メニューの「レイヤ」-「レイヤの追加」-「ベクタレイヤの追加」で開くダイアログで、前回「基盤地図ビューア」で変換したShapeファイルを読み込みます。建物外郭線データと標高データを読み込みます。
同様に、メニューの「レイヤ」-「レイヤの追加」-「ラスタレイヤの追加」で開くダイアログから、全球数値地表モデルのTiffを読み込みます。
QGIS画面上に次のような地図表示がされました。
標高データ事前加工
標高データに全球数値地表モデルの高さ情報を格納するカラムを追加します。
標準のレイアウトでは左下にあるレイヤパネルで、読み込んだ標高データのレイヤを選択し、右クリックメニューから、「プロパティ」を選択します。
表示されたダイアログ上の「ソースフィールド」タブから、鉛筆マークの編集モード切替をクリックし、新規フィールドアイコンをクリックして、高さ情報格納のためのフィールドを作成します。
名前はDSMなどとして、タイプにDoubleを選択、長さと精度は6,2あたりを入れておきましょう。
保存してダイアログを閉じます。
標高データに全球数値地表モデルデータを結合
次に、メニューの「プロセッシング」-「ツールボックス」でツールボックスを表示して、検索ボックスに「v.what.rast」と入力して出てきた、「v.what.rast」という項目をダブルクリックしてツールを起動します。
パラメータとして点ベクタに標高データ、入力ラスタに全球数値地表モデル、入力ベクタはpoint、更新する属性名に先ほど作ったDSMを指定して、実行します。
これで、DSMフィールドに、ポイント直下の全球数値地表モデルの高さデータが格納されました。
高さの計算
フィールド計算機を使います。
アイコンバーの中のそろばんのアイコンをクリックします。でてきたダイアログで、DSM-DEM の計算を実行します。
「新しいフィールドを作る」にチェックを入れ、出力フィールド名に「height」、出力フィールドタイプを「小数点付き数値」にします。出力フィールド長は、6、精度を 4 くらいにしておきましょう。「フィールドと値」の DSM をダブルクリックし、式テキストフォーム
に入れます。演算子ボタンの「-」をクリックし、標高をダブルクリックして式「"dem" - "標高"」を作ります。最後に、「OK」ボタンを押して実行します。これで、全球数値地表モデルから標高を引いた値が計算され新規フィールドに保存されます。
標高データは、地表面の標高のデータです。数値地表モデルは、地表、つまり、建物や植生などを含んだ高さのデータです。そのため、引き算すると地表にあるものの高さ=建物の高さなどになります。
ただ、今回使ったデータは、数値地表モデルが30m精度なので、かなり荒いデータです。そのため、かなりざっくりとした高さデータになっています。
建物外郭線データに結合
次に、建物外周線ポリゴンのデータに、地物の高さの値のポリゴン内での最大値を取り込んでみましょう。
ツールボックスペインで、「v.vect.stats」を検索します。見つかったらダブルクリックしてツールを起動します。設定する項目は、「Name of existing vector map with points」に、地物の高さまで計算した標高レイヤ、「Name of existing vector map with areas」に、建物の外周線データのレイヤを、「Method for aggregate statistics」には、領域内に複数の点が含まれる際に集約する時の計算を指定しますが、maximum を設定します。
「Column name of points map to use for statistics」には、地物の高さが入っているフィールドの名前を指定します。「Column name to upload points count」には、領域に含まれる点数を格納するフィールド名、「Column name to upload statistics」には、集約した結果の値(この場合は、領域に含まれる点の height の最大値)を格納するフィールド名を指定します。最後に、「Updated」の入力フィールドに、「...」ボタンから、「Saveto File...」を選んで、保存するファイル名を指定し、「実行」ボタンを押してください。
これで、二次元の平面だった建物データに、一応の裏付けのある高さデータを取り込むことができました。
さいごに
仕事でやるなら、お金を出してデータを買うのが妥当ですが、個人でやる場合どうしてもお金が大きな制約になりがちです。特に地図データはかなり高価なので、このように様々な工夫で乗り越えていくことになります。
とはいえ、生のデータを自分で加工して、欲しい情報を取り出せるというのは、逆にできることの可能性が広がるのではないかとも思います。
次は、このデータをUnityに取り込んで3Dで表示してみたいと思います。
※ちなみに、ここまでのお話のもっと詳細が、こちらで配布している、KLab Tech Book Vol.2に載っています。よろしければそちらもご覧ください。