跳到主要内容

DivideTiles - 分块处理

概述

DivideTiles 接口用于在重建前对场景进行分块划分。该接口支持 2D 规则网格、3D 规则网格和基于内存的自适应分块方法,适用于处理大规模数据集。

适用场景
  • 超大规模数据集(数千张图像)
  • 内存受限的处理环境
  • 需要并行处理的项目
  • 分布式计算场景

工作原理

接口调用

命令行调用

# 方式一:通过主引擎
reconstruct_full_engine.exe -reconstruct_type 4 -task_json divide_config.json

# 方式二:独立分块引擎
divide_engine.exe divide_config.json

参数说明

  • reconstruct_type: 固定为 4(表示 DivideTiles)
  • task_json: 配置文件路径

配置参数

必需参数

参数名类型说明
working_dirstring工作目录(必须包含空三结果)
gdal_folderstringGDAL 数据路径
resolution_levelint重建精度(1=高,2=中,3=低)
divide_parametersJSON分块参数
roi_for_3dJSON三维重建的 ROI

可选参数

参数名类型默认值说明
roi_coordinate_systemJSONWGS84ROI 坐标系

分块参数(divide_parameters)

参数名类型默认值说明
divide_modeint-分块模式:0=2D网格,1=3D网格,2=内存自适应
tile_sizedouble-网格大小(mode 0/1 时必需)
target_memorydouble0目标内存限制(GB)
reconstruct_whole_tileboolfalse是否重建完整块(不裁剪边界)
tile_systemJSON空三坐标系分块坐标系

分块模式详解

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 // Local 坐标系
}
}

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, // 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, // 仅 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": { // 网格信息(mode 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 张 2000万像素图像 ≈ 8-12 GB
  • 200 张 2000万像素图像 ≈ 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 分块:Local 或 LocalENU
  • 避免在地理坐标系中进行 3D 分块

4. ROI 优化

{
"roi_for_3d": {
"boundary": [
// 使用空三生成的 Smart ROI
// 适当扩展边界避免裁剪
]
}
}

性能优化

1. 预估处理时间

总时间 = 分块时间 + max(各块处理时间) + 合并时间

2. 负载均衡

  • 检查 max_memory 分布
  • 调整参数使各块负载相近
  • 考虑动态任务分配

3. 存储优化

  • 使用 SSD 存储工作目录
  • 分块结果可以分散到多个磁盘
  • 预留足够的临时空间

常见问题

Q: 分块后边界有裂缝?

A:

  • 设置 reconstruct_whole_tile: true
  • 增加块间重叠(通过扩展 ROI)
  • 后处理合并优化

Q: 某些块处理失败?

A:

  • 检查该块的 max_memory 是否超限
  • 查看具体块的图像分布
  • 考虑重新分块或调整参数

Q: 分块数量过多?

A:

  • 增加 tile_sizetarget_memory
  • 使用不同的分块模式
  • 考虑分层处理策略

高级应用

自定义分块方案

基于 tiles.json,可以:

  1. 手动调整块边界
  2. 合并小块
  3. 分割大块
  4. 设置优先级

增量更新

# 只处理变化的区域
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)

下一步


提示:合理的分块策略是处理大规模数据的关键。建议先用小数据测试,找到最优参数后再处理完整数据。