【第20回】さらに深く!iDesktopXの3Dデータ処理専門技術

 こんにちは!GIS導入支援コンサルタントのippuku_timeです。

「5分で分かるSuperMap iDesktopX製品・機能紹介シリーズ」、第20回です。前回は、3Dモデルを自在に作成・編集する高度なテクニックについて学びました。今回は、さらに専門的な領域に踏み込み、3D GISで扱う様々なデータタイプ(モデル、地形、地質体、点群など)に特化した「3Dデータ処理」機能について解説します。


【第20回】さらに深く!iDesktopXの3Dデータ処理専門技術


3D GISプロジェクトでは、多種多様なデータソースから得られる3Dデータを扱う必要があります。iDesktopXは、それぞれのデータ形式の特性に合わせた専門的な処理ツールを提供し、高品質な3Dシーンを構築するためのデータ準備を強力にサポートします。

図 多様な3Dデータ(地形、モデル、点群など)を統合処理するイメージ


1. モデルデータの処理

(1) 属性の抽出:

3Dモデルデータセットから、各オブジェクトの体積、表面積、頂点数、頂部・底部の標高といった幾何学的な属性を自動で計算し、属性テーブルに付与します。これにより、例えば建物の容積率の計算や、概算の壁面積の算出などが可能になります。

(2) 地形によるモデル修正:

ビルなどの3Dモデルを起伏のある地形データ上に配置すると、モデルの底部が地面にめり込んだり、逆に浮き上がったりすることがあります。この機能は、地形の標高に合わせてモデルのZ値を自動調整し、地形に正しく接地させることができます。

(3) キャッシュの一括生成:

多数のモデルデータ(BIMやCADモデルなど)を、3Dシーンで高速に表示するための専用形式「3Dタイルキャッシュ」に一括で変換します。


2. 地質体モデルの処理

目に見えない地下空間を可視化・分析するための専門機能です。

(1) 地質体の構築:

ボーリング調査などで得られた地層のポイントデータから、複雑な地層の3次元的な広がりを「地質体モデル」として自動生成します。

(2) 地質断面とボーリング:

構築した地質体モデルに対して、指定したラインで切った「地質断面図」を作成したり、任意の地点での仮想的な「ボーリング柱状図」を生成したりすることができます。土木・建設分野での地盤状況の把握に不可欠な機能です。


3. TIN地形の処理

TIN(不規則三角網)は、地形を表現するための一般的なデータ形式の一つです。iDesktopXは、TIN地形を柔軟に加工するツールを提供します。

(1) TINキャッシュのマージ: 複数のTIN地形データを一つに結合します。

(2) TINへの海洋の重ね合わせ: 海岸線データに基づいて、TIN地形にリアルな海面を表現します。


4. 写真測量モデルの処理

Project PLATEAUなどで提供されるリアルな3D都市モデル(写真測量モデル)を、より使いやすくするための処理機能です。

(1) 設定ファイルの生成: 大量のOSGB形式のタイルデータを、iDesktopXで効率的に読み込むための設定ファイル(*.scp)を生成します。

(2) ラージファイルの生成: 細かく分割された多数のタイルファイルを、単一の巨大なキャッシュファイル(*.cf)にまとめることで、データの管理とアクセス速度を向上させます。

(3) 圧縮と個別オブジェクト化: 巨大な写真測量モデルのテクスチャを圧縮してデータサイズを削減したり、建物ごとにデータを分割(個別オブジェクト化)して属性情報を付与しやすくしたりします。


5. 点群データの処理

LiDAR(レーザースキャナ)などで取得される点群(ポイントクラウド)データは、非常に高精細ですがデータ量が膨大です。iDesktopXは、この点群データを効率的に扱うためのツールを提供します。

(1) 設定ファイルの生成: *.lasや*.txt形式の点群データを、iDesktopXで扱うための設定ファイル(*.list)に変換します。

(2) キャッシュの生成: 設定ファイルに基づき、点群データを3Dシーンで高速に表示するための3Dタイルキャッシュを生成します。


まとめ

今回は、多種多様な3Dデータに特化した、iDesktopXの専門的な「3Dデータ処理」機能についてご紹介しました。モデルの属性抽出や地形との整合、地質体の構築、そして写真測量モデルや点群といった大容量データの最適化まで、これらの機能は、あらゆるソースからの3Dデータを統合し、価値あるデジタルツインを構築するための強力な基盤となります。

次回は、**第21回「3D空間で解き明かす!高度な3D空間解析」**です。構築した3Dシーンを使って、日照分析や可視領域分析など、3次元ならではの高度な解析手法について解説します。お楽しみに!


付録:サンプルコード(Python)

iDesktopXのPython IDEを使い、モデルデータセット内の各オブジェクトの体積と表面積を計算し、新しい属性フィールドに書き出すサンプルコードです。

Python

# -*- coding: utf-8 -*-

from PySuperMap import *
from PySuperMap.Data import *
from PySuperMap.Realspace import *

def calculate_model_attributes():
    """
    モデルデータセットの体積と表面積を計算し、属性テーブルに書き出すサンプル
    """
    try:
        # ワークスペースとデータソースを取得
        workspace = Workspace()
        datasource = workspace.get_datasource("Minato_Data_3D")
        if datasource is None: return

        # モデルデータセットを取得
        model_dataset = datasource.get_dataset("Buildings_3D")
        if model_dataset is None or model_dataset.get_type() != DatasetType.MODEL:
            print("モデルデータセット 'Buildings_3D' が見つかりません。")
            return

        print(f"データセット '{model_dataset.name}' の属性計算を開始します...")

        # 1. 結果を格納するための新しいフィールドを追加
        field_infos = model_dataset.get_field_infos()
       
        # 体積フィールド
        volume_field = "Volume_m3"
        if field_infos.get_index(volume_field) < 0:
            field_info_vol = FieldInfo(volume_field, FieldType.DOUBLE)
            model_dataset.add_field(field_info_vol, True)
            print(f"フィールド '{volume_field}' を追加しました。")

        # 表面積フィールド
        area_field = "SurfaceArea_m2"
        if field_infos.get_index(area_field) < 0:
            field_info_area = FieldInfo(area_field, FieldType.DOUBLE)
            model_dataset.add_field(field_info_area, True)
            print(f"フィールド '{area_field}' を追加しました。")

        # 2. レコードセットを取得して各モデルを処理
        recordset = model_dataset.get_recordset(False, CursorType.DYNAMIC)
        if recordset is None:
            print("レコードセットの取得に失敗しました。")
            return

        recordset.move_first()
        while not recordset.is_eof():
            # 編集モードを開始
            recordset.edit()

            # ジオメトリ(GeoModel)を取得
            geometry = recordset.get_geometry()
           
            if geometry is not None and isinstance(geometry, GeoModel):
                # 3. 体積と表面積を計算
                volume = geometry.get_volume()
                surface_area = geometry.get_surface_area()
               
                # 4. 計算結果をフィールドに設定
                recordset.set_value(volume_field, volume)
                recordset.set_value(area_field, surface_area)
               
                # 編集内容を更新
                recordset.update()
           
            # 次のレコードへ移動
            recordset.move_next()
       
        print("すべてのモデルの属性計算が完了しました。")

    except Exception as e:
        print(f"エラーが発生しました: {e}")

    finally:
        # 5. リソースを解放
        if 'recordset' in locals() and recordset is not None:
            recordset.dispose()
        print("処理を終了します。")

if __name__ == '__main__':
    calculate_model_attributes()

コメント

このブログの人気の投稿

【11月リリース予定】SuperMap iServer 2025 プレビュー:WebGIS体験を刷新する新機能とは?

「GIS」っていまだに「地理情報システム」の略?時代の変化と共に、その本当の意味を再定義してみた

「国土数値情報」を考える:それは日本のGISを支える“共通の土台”である