メインコンテンツまでスキップ

DivideTiles - タイル処理

概要

DivideTilesインターフェースは、再構築前にシーンをタイルに分割するために使用されます。このインターフェースは、2D規則グリッド、3D規則グリッド、およびメモリベースのアダプティブタイリング手法をサポートし、大規模データセットの処理に適しています。

使用例
  • 超大規模データセット(数千枚の画像)
  • メモリ制限のある処理環境
  • 並列処理が必要なプロジェクト
  • 分散コンピューティングシナリオ

動作原理

インターフェース呼び出し

コマンドライン呼び出し

# 方法1:メインエンジンを通じて
reconstruct_full_engine.exe -reconstruct_type 4 -task_json divide_config.json

# 方法2:スタンドアロンタイリングエンジン
divide_engine.exe divide_config.json

パラメータ説明

  • reconstruct_type: 4として固定(DivideTilesを示す)
  • task_json: 設定ファイルパス

設定パラメータ

必須パラメータ

パラメータ説明
working_dirstring作業ディレクトリ(AT結果を含む必要がある)
gdal_folderstringGDALデータパス
resolution_levelint再構築精度(1=高、2=中、3=低)
divide_parametersJSONタイリングパラメータ
roi_for_3dJSON3D再構築のROI

オプションパラメータ

パラメータデフォルト説明
roi_coordinate_systemJSONWGS84ROI座標系

タイリングパラメータ (divide_parameters)

パラメータデフォルト説明
divide_modeint-タイリングモード:0=2Dグリッド、1=3Dグリッド、2=メモリアダプティブ
tile_sizedouble-グリッドサイズ(モード0/1で必須)
target_memorydouble0目標メモリ制限(GB)
reconstruct_whole_tileboolfalse完全なタイルを再構築するかどうか(境界クリッピングなし)
tile_systemJSONAT座標系タイリング座標系

タイリングモードの説明

1. 2D規則グリッド (divide_mode = 0)

地形変化の少ないエリアに適しています:

{
"divide_mode": 0,
"tile_size": 500.0, // 500m x 500mグリッド
"tile_system": {
"type": 3,
"epsg_code": 32650 // UTM投影座標系
}
}

2. 3D規則グリッド (divide_mode = 1)

標高変化の大きいエリアに適しています:

{
"divide_mode": 1,
"tile_size": 300.0, // 300m x 300m x 300m立方体
"tile_system": {
"type": 1 // ローカル座標系
}
}

3. メモリアダプティブタイリング (divide_mode = 2)

メモリ制限に基づく自動タイリング:

{
"divide_mode": 2,
"target_memory": 16.0, // タイルあたり最大16GBメモリ
"reconstruct_whole_tile": false
}

完全な設定例

都市規模シーン2Dタイリング

{
"working_dir": "C:/Projects/CityScale",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 0,
"tile_size": 1000.0, // 1kmグリッド
"tile_system": {
"type": 3,
"epsg_code": 32650
},
"reconstruct_whole_tile": true
},
"roi_for_3d": {
"boundary": [
[500000, 2500000],
[510000, 2500000],
[510000, 2510000],
[500000, 2510000]
],
"min_z": 0,
"max_z": 500
},
"roi_coordinate_system": {
"type": 3,
"epsg_code": 32650
}
}

山岳地形3Dタイリング

{
"working_dir": "C:/Projects/Mountain",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 1,
"tile_size": 500.0, // 500m立方体
"tile_system": {
"type": 0, // LocalENU
"origin_point": [114.123, 22.123, 100.0]
}
},
"roi_for_3d": {
"boundary": [...],
"min_z": 100,
"max_z": 2000 // 大きな標高差
}
}

メモリ制限環境

{
"working_dir": "C:/Projects/LimitedMemory",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 2,
"target_memory": 8.0, // 利用可能メモリ8GBのみ
"reconstruct_whole_tile": false
},
"roi_for_3d": {
"boundary": [...]
}
}

出力結果

tiles.jsonファイル構造

タイリング後に生成されるtiles.json

{
"tiles": [
{
"name": "tile_0_0",
"empty": false,
"max_memory": 12.5, // GB
"roi": {
"boundary": [...],
"min_z": 100,
"max_z": 200
}
},
{
"name": "tile_0_1",
"empty": false,
"max_memory": 15.3,
"roi": {...}
}
],
"divide_mode": 0,
"tile_system": {...},
"tile_grid": { // グリッド情報(モード0/1)
"origin": [500000, 2500000],
"rows": 10,
"cols": 10
},
"tile_size": 1000.0
}

タイリング結果の使用

Reconstruct3Dは自動的にtiles.jsonを読み取り、タイル化再構築を実行します:

{
"license_id": 9200,
"working_dir": "C:/Projects/CityScale", // tiles.jsonを含む
// ... その他のReconstruct3Dパラメータ
}

タイリング戦略の選択

シーンタイプ比較

シーンタイプ推奨モードグリッドサイズ提案説明
平坦な都市2Dグリッド500-2000m平坦な地形、小さな標高変化
山岳地形3Dグリッド300-1000m大きな標高差、垂直層化が必要
混合シーンメモリアダプティブ-タイリングスキームを自動最適化
線状エンジニアリング2Dグリッドカスタムルート方向に沿って細長いストリップを設定

メモリ推定

タイルあたりメモリ要件 ≈ (タイル内画像数 × 画像解像度 × 3) / 圧縮比

参考値:

  • 100枚20MP画像 ≈ 8-12 GB
  • 200枚20MP画像 ≈ 16-24 GB

並列処理

ローカル並列

import subprocess
import json
import concurrent.futures

# タイリング結果を読み取り
with open("tiles.json", "r") as f:
tiles_info = json.load(f)

def process_tile(tile):
if tile["empty"]:
return

config = {
"license_id": 9200,
"working_dir": f"./output/{tile['name']}",
"tile_name": tile["name"],
# ... その他のパラメータ
}

with open(f"{tile['name']}.json", "w") as f:
json.dump(config, f)

subprocess.run([
"reconstruct_full_engine.exe",
"-reconstruct_type", "2",
"-task_json", f"{tile['name']}.json"
])

# 並列処理
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
executor.map(process_tile, tiles_info["tiles"])

分散処理

タイリング結果を複数のマシンに分散して処理できます:

  1. マスターノードがタイリングを実行
  2. tiles.jsonとデータを配布
  3. 各ノードが割り当てられたタイルを独立して処理
  4. 結果を統合

ベストプラクティス

1. タイルサイズ選択

  • 十分なメモリ:境界効果を減らすため大きなタイルを使用
  • 限られたメモリ:安定性を確保するため小さなタイルを使用
  • 並列処理:タイル数とタイルあたり処理時間のバランス

2. オーバーラップエリア処理

{
"reconstruct_whole_tile": true, // 完全なタイルを生成
// 後処理でオーバーラップエリアをマージ
}

3. 座標系選択

  • 2Dタイリング:投影座標系を使用(メートル単位)
  • 3Dタイリング:ローカルまたはLocalENU
  • 地理座標系での3Dタイリングを避ける

4. ROI最適化

{
"roi_for_3d": {
"boundary": [
// ATから生成されたSmart ROIを使用
// クリッピングを避けるため境界を適切に拡張
]
}
}

パフォーマンス最適化

1. 処理時間推定

総時間 = タイリング時間 + max(タイルあたり処理時間) + マージ時間

2. 負荷分散

  • max_memory分布を確認
  • タイル間で負荷を分散するようパラメータを調整
  • 動的タスク割り当てを検討

3. ストレージ最適化

  • 作業ディレクトリにSSDを使用
  • タイル結果を複数のディスクに分散
  • 十分な一時スペースを確保

よくある問題

Q: タイリング後にタイル境界にギャップがある?

A:

  • reconstruct_whole_tile: trueを設定
  • タイル間のオーバーラップを増やす(ROIを拡張)
  • 後処理でマージを最適化

Q: 一部のタイルが処理に失敗する?

A:

  • タイルのmax_memoryが制限を超えていないか確認
  • 特定のタイルでの画像分布を確認
  • 再タイリングまたはパラメータ調整を検討

Q: タイルが多すぎる?

A:

  • tile_sizeまたはtarget_memoryを増やす
  • 異なるタイリングモードを使用
  • 階層処理戦略を検討

高度なアプリケーション

カスタムタイリングスキーム

tiles.jsonに基づいて、以下が可能です:

  1. タイル境界を手動調整
  2. 小さなタイルをマージ
  3. 大きなタイルを分割
  4. 優先度を設定

増分更新

# 変更されたエリアのみを処理
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)

次のステップ


ヒント:適切なタイリング戦略は大規模データ処理の鍵です。完全なデータセットを処理する前に、まず小さなデータでテストして最適なパラメータを見つけることをお勧めします。