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 | ROI для 3D реконструкции |
Опциональные Параметры
Параметр | Тип | По Умолчанию | Описание |
---|---|---|---|
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 | Целевой лимит памяти (ГБ) |
reconstruct_whole_tile | bool | false | Реконструировать ли целые тайлы (без обрезки границ) |
tile_system | JSON | Система координат 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"])
Распределенная Обработка
Результаты тайлинга могут быть распределены на несколько машин для обработки:
- Главный узел выполняет тайлинг
- Распределить tiles.json и данные
- Каждый узел независимо обрабатывает назначенные тайлы
- Агрегировать результаты
Лучшие Практики
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 вы можете:
- Вручную настроить границы тайлов
- Объединить маленькие тайлы
- Разделить большие тайлы
- Установить приоритеты
Инкрементальные Обновления
# Обрабатывать только измененные области
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)
Следующие Шаги
- Изучите Reconstruct3D для тайловой реконструкции
- Проверьте Основные Концепции для дополнительных техник обработки
Совет: Правильная стратегия тайлинга является ключом к обработке крупномасштабных данных. Рекомендуется сначала тестировать с небольшими данными для поиска оптимальных параметров перед обработкой полных наборов данных.