Перейти к основному содержимому

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_folderstringПуть к данным GDAL
resolution_levelintТочность реконструкции (1=Высокая, 2=Средняя, 3=Низкая)
divide_parametersJSONПараметры тайлинга
roi_for_3dJSONROI для 3D реконструкции

Опциональные Параметры

ПараметрТипПо УмолчаниюОписание
roi_coordinate_systemJSONWGS84Система координат ROI

Параметры Тайлинга (divide_parameters)

ПараметрТипПо УмолчаниюОписание
divide_modeint-Режим тайлинга: 0=2D сетка, 1=3D сетка, 2=адаптивный по памяти
tile_sizedouble-Размер сетки (обязателен для режима 0/1)
target_memorydouble0Целевой лимит памяти (ГБ)
reconstruct_whole_tileboolfalseРеконструировать ли целые тайлы (без обрезки границ)
tile_systemJSONСистема координат ATСистема координат тайлинга

Объяснение Режимов Тайлинга

1. Регулярная 2D Сетка (divide_mode = 0)

Подходит для областей с небольшими изменениями рельефа:

{
"divide_mode": 0,
"tile_size": 500.0, // сетка 500м x 500м
"tile_system": {
"type": 3,
"epsg_code": 32650 // Система координат проекции UTM
}
}

2. Регулярная 3D Сетка (divide_mode = 1)

Подходит для областей с большими изменениями высоты:

{
"divide_mode": 1,
"tile_size": 300.0, // куб 300м x 300м x 300м
"tile_system": {
"type": 1 // Локальная система координат
}
}

3. Адаптивный Тайлинг по Памяти (divide_mode = 2)

Автоматический тайлинг на основе ограничений памяти:

{
"divide_mode": 2,
"target_memory": 16.0, // Максимум 16ГБ памяти на тайл
"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, // сетка 1км
"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, // куб 500м
"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, // Только 8ГБ доступной памяти
"reconstruct_whole_tile": false
},
"roi_for_3d": {
"boundary": [...]
}
}

Результаты Вывода

Структура Файла tiles.json

Сгенерированный tiles.json после тайлинга:

{
"tiles": [
{
"name": "tile_0_0",
"empty": false,
"max_memory": 12.5, // ГБ
"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-2000мПлоская местность, небольшие изменения высоты
Горная Местность3D Сетка300-1000мБольшие различия высот, требует вертикального слоения
Смешанная СценаАдаптивный по Памяти-Автоматически оптимизировать схему тайлинга
Линейная Инженерия2D СеткаПользовательскийУстановить удлиненные полосы вдоль направления маршрута

Оценка Памяти

Требование памяти на тайл ≈ (Изображения в тайле × Разрешение изображения × 3) / Коэффициент сжатия

Справочные значения:

  • 100 изображений 20МП ≈ 8-12 ГБ
  • 200 изображений 20МП ≈ 16-24 ГБ

Параллельная Обработка

Локальная Параллельность

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": [
// Использовать Smart ROI, сгенерированный из AT
// Правильно расширить границы, чтобы избежать обрезки
]
}
}

Оптимизация Производительности

1. Оценка Времени Обработки

Общее время = Время тайлинга + max(Время обработки на тайл) + Время слияния

2. Балансировка Нагрузки

  • Проверить распределение max_memory
  • Настроить параметры для балансировки нагрузки между тайлами
  • Рассмотреть динамическое распределение задач

3. Оптимизация Хранения

  • Использовать SSD для рабочего каталога
  • Распределить результаты тайлов по нескольким дискам
  • Зарезервировать достаточное временное пространство

Общие Проблемы

В: Пробелы на границах тайлов после тайлинга?

О:

  • Установить reconstruct_whole_tile: true
  • Увеличить перекрытие между тайлами (расширением ROI)
  • Оптимизировать слияние в постобработке

В: Некоторые тайлы не обрабатываются?

О:

  • Проверить, не превышает ли max_memory тайла лимиты
  • Просмотреть распределение изображений в конкретных тайлах
  • Рассмотреть пере-тайлинг или настройку параметров

В: Слишком много тайлов?

О:

  • Увеличить tile_size или target_memory
  • Использовать другой режим тайлинга
  • Рассмотреть иерархическую стратегию обработки

Продвинутые Применения

Пользовательские Схемы Тайлинга

На основе tiles.json вы можете:

  1. Вручную настроить границы тайлов
  2. Объединить маленькие тайлы
  3. Разделить большие тайлы
  4. Установить приоритеты

Инкрементальные Обновления

# Обрабатывать только измененные области
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)

Следующие Шаги


Совет: Правильная стратегия тайлинга является ключом к обработке крупномасштабных данных. Рекомендуется сначала тестировать с небольшими данными для поиска оптимальных параметров перед обработкой полных наборов данных.