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_dir | string | 作業ディレクトリ(AT結果を含む必要がある) |
gdal_folder | string | GDALデータパス |
resolution_level | int | 再構築精度(1=高、2=中、3=低) |
divide_parameters | JSON | タイリングパラメータ |
roi_for_3d | JSON | 3D再構築のROI |
オプションパラメータ
パラメータ | 型 | デフォルト | 説明 |
---|---|---|---|
roi_coordinate_system | JSON | WGS84 | ROI座標系 |
タイリングパラメータ (divide_parameters)
パラメータ | 型 | デフォルト | 説明 |
---|---|---|---|
divide_mode | int | - | タイリングモード:0=2Dグリッド、1=3Dグリッド、2=メモリアダプティブ |
tile_size | double | - | グリッドサイズ(モード0/1で必須) |
target_memory | double | 0 | 目標メモリ制限(GB) |
reconstruct_whole_tile | bool | false | 完全なタイルを再構築するかどうか(境界クリッピングなし) |
tile_system | JSON | AT座標系 | タイリング座標系 |
タイリングモードの説明
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"])
分散処理
タイリング結果を複数のマシンに分散して処理できます:
- マスターノードがタイリングを実行
- tiles.jsonとデータを配布
- 各ノードが割り当てられたタイルを独立して処理
- 結果を統合
ベストプラクティス
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に基づいて、以下が可能です:
- タイル境界を手動調整
- 小さなタイルをマージ
- 大きなタイルを分割
- 優先度を設定
増分更新
# 変更されたエリアのみを処理
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)
次のステップ
- タイル化再構築についてはReconstruct3Dを学習
- より多くの処理技術については基本概念を確認
ヒント:適切なタイリング戦略は大規模データ処理の鍵です。完全なデータセットを処理する前に、まず小さなデータでテストして最適なパラメータを見つけることをお勧めします。