【第21回】3D空間で解き明かす!iDesktopXの高度な3D空間解析

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

「5分で分かるSuperMap iDesktopX製品・機能紹介シリーズ」、第21回です。前回は、多様な3Dデータを扱うための専門的な「3Dデータ処理」機能について学びました。今回は、そうして準備されたリッチな3Dシーンを使い、2Dの地図では決して得られない知見を引き出す「3D空間解析」の世界を探求します。


【第21回】3D空間で解き明かす!iDesktopXの高度な3D空間解析


3D GISの真価は、現実世界をより忠実に再現し、3次元空間ならではの分析を行うことで発揮されます。iDesktopXは、都市計画、防災、通信、景観評価など、様々な分野で活用できる高度な3D空間解析機能を提供します。

図 3D都市モデル上で様々な空間解析を実行しているイメージ


1. 地形とモデルの特性を分析する

(1) 傾斜度・傾斜方位分析

地形やモデルの表面が、どのくらい急で、どちらの方向を向いているかを計算します。建設プロジェクトにおける造成計画や、再生可能エネルギー分野での太陽光パネル設置場所の選定などに利用されます。

(2) 等高線・断面分析

3Dシーン内の地形やモデルから、指定した間隔で等高線を抽出したり、指定したラインに沿った断面図を作成したりできます。地形の起伏を直感的に理解するのに役立ちます。


2. 見える範囲を分析する「可視性解析」

(1) 見通し分析 (Line of Sight Analysis)

2つの地点間で見通しが確保できるか(間に障害物がないか)を判定します。通信アンテナの設置場所検討や、監視カメラの死角チェックなどに活用されます。

(2) 可視領域分析 (Viewshed Analysis)

ある地点(展望台、監視カメラなど)から見える範囲全体を計算し、可視領域と不可視領域を色分けして表示します。景観保護計画や、イベント会場のセキュリティ計画策定に強力なツールとなります。

(3) スカイライン分析 (Skyline Analysis)

ある地点から空を見上げた際の、建物や山によって空が遮られるライン(スカイライン)を抽出します。また、このスカイラインを基に、新しい建物を建てた場合に景観がどう変化するかをシミュレートしたり、建築物の高さ制限を検討したりすることも可能です。


3. 時間と環境に関わる分析

(1) 日照分析

指定した日時における太陽の動きをシミュレートし、建物や地形が互いに落とす影を計算します。これにより、特定の場所(マンションのバルコニーや公園など)が、一日または一年を通じてどのくらいの日照時間を確保できるかを正確に分析できます。建築確認申請における日影規制のチェックや、都市計画における快適な環境作りに不可欠な機能です。

(2) 浸水分析

地形データに基づき、指定した水位まで水が満たされた場合に、どのエリアが浸水するかを3Dで動的にシミュレートします。ハザードマップの作成や、避難計画の策定に役立ちます。

(3) 動的衝突解析

建設機械などの3Dモデルを指定したルートに沿って動かし、周辺の建物やインフラと衝突しないかを事前にシミュレーションします。建設現場やプラントにおける、クレーン作業などの安全計画に活用できます。


4. モデルからの図面作成分析

3Dモデルから、2Dの図面を自動生成する機能です。

(1) DSM/デジタルオルソ画像データ生成: 3D都市モデルから、地物を含む地表面の標高モデル(DSM)や、真上から見た写真のような地図(デジタルオルソ画像)を生成します。

(2) 立面図生成: 建物の3Dモデルから、特定の方角から見た立面図を自動で作成します。


まとめ

今回は、3Dシーンを活用したiDesktopXの高度な「3D空間解析」機能についてご紹介しました。見通しや日照、浸水といったシミュレーションから、スカイライン分析のような景観評価まで、これらの機能は2D地図だけでは得られない、より現実に即した深い洞察を可能にします。デジタルツインを活用したスマートな社会の実現に向けて、3D空間解析の重要性はますます高まっていくでしょう。

次回は、**第22回「GISをWebで共有!Webマップの公開と活用」**です。iDesktopXで作成した地図や分析結果を、Web上で公開し、多くの人と共有するための具体的な方法について解説します。お楽しみに!


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


iDesktopXのPython IDEを使い、3Dシーン内で指定した2点間の見通し分析を自動で実行するサンプルコードです。

Python


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

from PySuperMap import *
from PySuperMap.Realspace import *
from PySuperMap.Analyst import *

def line_of_sight_analysis_sample():
    """
    3Dシーン内で2点間の見通し分析を実行するサンプル
    """
    try:
        # ワークスペースとアクティブなシーンを取得
        workspace = Workspace()
        scene_control = workspace.get_active_scene_control()
        if scene_control is None:
            print("アクティブなシーンがありません。")
            return
        scene = scene_control.get_scene()

        print("見通し分析を開始します...")

        # 1. 観測点とターゲット点を設定 (経度, 緯度, 高さ)
        # 例:東京タワー展望台と六本木ヒルズ屋上
        observer_point = Point3D(139.7454, 35.6586, 250) # 観測点(東京タワー)
        target_point = Point3D(139.7295, 35.6608, 238)   # ターゲット点(六本木ヒルズ)

        # 2. 見通し分析オブジェクトを作成
        line_of_sight = LineOfSight()
       
        # 観測点とターゲット点を設定
        line_of_sight.set_observer_point(observer_point)
        line_of_sight.set_target_points([target_point]) # ターゲットはリストで渡す

        # 3. 分析を実行
        # build()メソッドはシーン内のすべての可視レイヤーを障害物として考慮します
        line_of_sight.build()
       
        # 4. 分析結果を取得
        result = line_of_sight.get_visibility_result(0) # 最初のターゲット点の結果を取得
       
        if result is not None:
            visibility = result.get_visibility()
           
            if visibility == Intervisibility.VISIBLE:
                print("結果: 見通しは確保されています (可視)。")
            elif visibility == Intervisibility.INVISIBLE:
                print("結果: 見通しは確保されていません (不可視)。")
                # 障害物の位置を取得
                barrier_point = result.get_barrier_point()
                print(f"  障害物の座標: X={barrier_point.x}, Y={barrier_point.y}, Z={barrier_point.z}")
            else:
                print("結果: 不明。")
        else:
            print("分析結果の取得に失敗しました。")

        # 5. 分析結果を視覚的にシーンに追加 (オプション)
        # 分析結果のラインをジオメトリとして取得
        sight_line = line_of_sight.get_sight_line(0)
       
        # 可視部分と不可視部分でスタイルを分ける
        visible_style = GeoStyle3D()
        visible_style.set_line_color(Color(0, 255, 0)) # 緑色
        visible_style.set_line_width(2)
       
        invisible_style = GeoStyle3D()
        invisible_style.set_line_color(Color(255, 0, 0)) # 赤色
        invisible_style.set_line_width(2)
       
        # シーンにジオメトリを追加
        # 可視部分
        scene.get_tracking_layer().add(sight_line.get_visible_part(), "visible_line", visible_style)
        # 不可視部分
        scene.get_tracking_layer().add(sight_line.get_invisible_part(), "invisible_line", invisible_style)
       
        scene.refresh()

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

if __name__ == '__main__':
    line_of_sight_analysis_sample()

コメント

このブログの人気の投稿

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

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

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