こんにちは!GIS導入支援コンサルタントのippuku_timeです。
「5分で分かるSuperMap iDesktopX製品・機能紹介シリーズ」、第24回です。前回は、他のGISプラットフォームからの「データ移行」について学びました。今回は、大量のデータを扱うGISプロジェクトで常に課題となる「パフォーマンス最適化」に焦点を当てます。地図がサクサク動くための秘訣、特に3Dシーンにおけるキャッシュ技術について解説します。
【第24回】サクサク動く3D地図の秘訣!iDesktopXのパフォーマンス最適化
1. なぜパフォーマンス最適化が必要か?
GISで扱うデータ、特に3D都市モデルや高解像度の航空写真、広範囲の地形データは、非常にデータ量が大きくなります。これらのデータをそのまま表示しようとすると、PCのスペックによっては画面の描画が遅くなったり、操作がカクカクしたりと、大きなストレスを感じることがあります。
快適な操作性を実現し、作業効率を上げるためには、データを表示用に最適化する「キャッシュ」技術の活用が不可欠です。
図 大規模な3D都市データをキャッシュ技術で高速に表示するイメージ
2. 3Dシーン高速化の鍵「シーンキャッシュ」
3Dシーンのパフォーマンスを向上させるための最も効果的な方法が「シーンキャッシュ」の作成です。これは、表示に時間のかかる元のデータ(例:多数のBIMモデルや地形データ)を、あらかじめ3Dシーン表示に最適化された形式に変換しておく技術です。一度キャッシュを作成してしまえば、次回以降は元のデータを読み込む代わりに、軽量なキャッシュファイルを読み込むため、表示速度が劇的に向上します。
iDesktopXは、データの種類に応じて、様々なタイプのシーンキャッシュを生成できます。
(1) イメージキャッシュ (*.sci3d)
広範囲の航空写真や衛星画像などのラスタデータを3Dシーンの地表面に貼り付ける際に使用します。ズームレベルに応じたピラミッド構造を持ち、高速な表示を実現します。
(2) 地形キャッシュ (*.sct)
DEM(数値標高モデル)などの地形データを、3Dシーンで立体的に、かつ高速に表示するためのキャッシュ形式です。
(3) モデルキャッシュ / ベクトルキャッシュ (*.scv, *.scp)
建物などの3Dモデルや、2Dのベクトルデータ(点、線、ポリゴン)を3Dシーンで高速に表示するためのキャッシュです。特に、Project PLATEAUのような大規模な3D都市モデルを扱う際には必須の技術となります。
3. シーン全体のキャッシュを一括生成
iDesktopXの便利な機能として、「シーン全体のキャッシュ生成」があります。これは、現在開いている3Dシーンに読み込まれているすべてのレイヤー(地形、画像、モデルなど)を、一度の操作でそれぞれ最適なキャッシュ形式に一括で変換してくれる機能です。
(1) 操作手順:
① キャッシュを作成したい3Dシーンを開きます。
② ワークスペースマネージャーでシーン名を右クリックし、「シーンキャッシュの生成...」を選択します。
③ 表示されるダイアログで、キャッシュの保存先や、生成する解像度レベル(LODレベル)などを設定します。
④ 「生成」ボタンをクリックすると、シーン内の各レイヤーに対応したキャッシュファイルが一括で作成されます。
まとめ
今回は、大量の3Dデータを快適に扱うための「パフォーマンス最適化」、特に「シーンキャッシュ」技術についてご紹介しました。GISプロジェクトが大規模化・高精細化する中で、キャッシュを適切に作成・管理する能力は、プロジェクトの成否を分ける重要なスキルとなります。iDesktopXは、様々なデータタイプに対応したキャッシュ生成機能を備えており、ストレスのないサクサクな3D GIS環境の構築を力強くサポートします。
次回は、**第25回「GISを自分仕様に!カスタム開発入門」**です。iDesktopXのUIをカスタマイズしたり、PythonやJavaで独自の機能を追加したりする方法について解説します。お楽しみに!
付録:サンプルコード(Python)
iDesktopXのPython IDEを使い、現在開いているシーン内の特定のモデルレイヤーに対して、3Dモデルキャッシュを生成する処理を自動化するサンプルコードです。
Python
# -*- coding: utf-8 -*-
from PySuperMap import *
from PySuperMap.Realspace import *
from PySuperMap.Mapping import *
def generate_scene_cache_sample():
"""
指定した3Dモデルレイヤーからシーンキャッシュを生成するサンプル
"""
try:
# ワークスペースとアクティブなシーンを取得
workspace = Workspace()
scene_control = workspace.get_active_scene_control()
if scene_control is None:
print("アクティブなシーンがありません。")
return
scene = scene_control.get_scene()
# キャッシュを生成したいレイヤーを取得 (例: "Buildings_3D")
layer_name = "Buildings_3D"
layer = scene.get_layers().get_item(layer_name)
if layer is None:
print(f"レイヤー '{layer_name}' が見つかりません。")
return
dataset = layer.get_dataset()
if dataset is None:
print("レイヤーにデータセットが関連付けられていません。")
return
print(f"レイヤー '{layer_name}' のシーンキャッシュ生成を開始します...")
# 1. シーンキャッシュ生成パラメータを設定
builder = SceneCacheBuilder()
# キャッシュタイプをモデルキャッシュに設定
builder.set_cache_type(SceneCacheType.MODEL)
# 入力データセットを設定
builder.set_datasets([dataset])
# 出力パスとキャッシュ名を設定
# パスはご自身の環境に合わせて変更してください
output_path = r"D:\gis_data\scene_cache"
cache_name = "Buildings_Cache"
builder.set_output_path(output_path)
builder.set_cache_name(cache_name)
# キャッシュの範囲をデータセットの範囲に設定
builder.set_bounds(dataset.get_bounds())
# LOD (Level of Detail) レベルを設定
# この例では1つのレベルのみ生成
builder.set_lod_split_type(LODSplitType.NONE)
# 2. キャッシュ生成を実行
builder.build()
print("\nキャッシュ生成タスクが完了しました。")
print(f"出力先: {os.path.join(output_path, cache_name)}")
except Exception as e:
print(f"エラーが発生しました: {e}")
finally:
if 'builder' in locals() and builder is not None:
builder.dispose()
if __name__ == '__main__':
generate_scene_cache_sample()
コメント
コメントを投稿