본문으로 건너뛰기

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_folderstringGDAL 데이터 경로
resolution_levelint재구성 정밀도 (1=높음, 2=중간, 3=낮음)
divide_parametersJSON타일링 매개변수
roi_for_3dJSON3D 재구성용 ROI

선택적 매개변수

매개변수타입기본값설명
roi_coordinate_systemJSONWGS84ROI 좌표계

타일링 매개변수 (divide_parameters)

매개변수타입기본값설명
divide_modeint-타일링 모드: 0=2D 격자, 1=3D 격자, 2=메모리 적응형
tile_sizedouble-격자 크기 (모드 0/1에서 필수)
target_memorydouble0목표 메모리 제한 (GB)
reconstruct_whole_tileboolfalse전체 타일 재구성 여부 (경계 클리핑 없음)
tile_systemJSONAT 좌표계타일링 좌표계

타일링 모드 설명

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"])

분산 처리

타일링 결과를 여러 머신에 분산하여 처리할 수 있습니다:

  1. 마스터 노드가 타일링 수행
  2. tiles.json과 데이터 분산
  3. 각 노드가 할당된 타일을 독립적으로 처리
  4. 결과 집계

모범 사례

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을 기반으로 다음이 가능합니다:

  1. 타일 경계 수동 조정
  2. 작은 타일 병합
  3. 큰 타일 분할
  4. 우선순위 설정

증분 업데이트

# 변경된 영역만 처리
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)

다음 단계


팁: 적절한 타일링 전략은 대규모 데이터 처리의 핵심입니다. 전체 데이터셋을 처리하기 전에 먼저 작은 데이터로 테스트하여 최적의 매개변수를 찾는 것이 좋습니다.