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_dir | string | 工作目录(必须包含空三结果) |
gdal_folder | string | GDAL 数据路径 |
resolution_level | int | 重建精度(1=高,2=中,3=低) |
divide_parameters | JSON | 分块参数 |
roi_for_3d | JSON | 三维重建的 ROI |
可选参数
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
roi_coordinate_system | JSON | WGS84 | ROI 坐标系 |
分块参数(divide_parameters)
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
divide_mode | int | - | 分块模式:0=2D网格,1=3D网格,2=内存自适应 |
tile_size | double | - | 网格大小(mode 0/1 时必需) |
target_memory | double | 0 | 目标内存限制(GB) |
reconstruct_whole_tile | bool | false | 是否重建完整块(不裁剪边界) |
tile_system | JSON | 空三坐标系 | 分块坐标系 |
分块模式详解
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"])
分布式处理
分块结果可以分发到多台机器处理:
- 主节点执行分块
- 分发 tiles.json 和数据
- 各节点独立处理分配的块
- 汇总结果
最佳实践
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_size
或target_memory
- 使用不同的分块模式
- 考虑分层处理策略
高级应用
自定义分块方案
基于 tiles.json,可以:
- 手动调整块边界
- 合并小块
- 分割大块
- 设置优先级
增量更新
# 只处理变化的区域
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)
下一步
- 了解 Reconstruct3D 的分块重建
- 查看基本概念了解更多处理技巧
提示:合理的分块策略是处理大规模数据的关键。建议先用小数据测试,找到最优参数后再处理完整数据。