Zum Hauptinhalt springen

DivideTiles - Kachelverarbeitung

Überblick

Die DivideTiles-Schnittstelle wird verwendet, um Szenen vor der Rekonstruktion in Kacheln zu unterteilen. Diese Schnittstelle unterstützt 2D-reguläre Raster-, 3D-reguläre Raster- und speicherbasierte adaptive Kachelverfahren, geeignet für die Verarbeitung großskaliger Datensätze.

Anwendungsfälle
  • Ultra-großskalige Datensätze (Tausende von Bildern)
  • Speicherbegrenzte Verarbeitungsumgebungen
  • Projekte, die parallele Verarbeitung erfordern
  • Verteilte Computing-Szenarien

Funktionsweise

Schnittstellenaufruf

Kommandozeilenaufruf

# Methode 1: Über Hauptmotor
reconstruct_full_engine.exe -reconstruct_type 4 -task_json divide_config.json

# Methode 2: Eigenständiger Kachelmotor
divide_engine.exe divide_config.json

Parameterbeschreibung

  • reconstruct_type: Fest als 4 (zeigt DivideTiles an)
  • task_json: Konfigurationsdateipfad

Konfigurationsparameter

Erforderliche Parameter

ParameterTypBeschreibung
working_dirstringArbeitsverzeichnis (muss AT-Ergebnisse enthalten)
gdal_folderstringGDAL-Datenpfad
resolution_levelintRekonstruktionspräzision (1=Hoch, 2=Mittel, 3=Niedrig)
divide_parametersJSONKachelparameter
roi_for_3dJSONROI für 3D-Rekonstruktion

Optionale Parameter

ParameterTypStandardBeschreibung
roi_coordinate_systemJSONWGS84ROI-Koordinatensystem

Kachelparameter (divide_parameters)

ParameterTypStandardBeschreibung
divide_modeint-Kachelmodus: 0=2D-Raster, 1=3D-Raster, 2=speicheradaptiv
tile_sizedouble-Rastergröße (erforderlich für Modus 0/1)
target_memorydouble0Zielspeicherlimit (GB)
reconstruct_whole_tileboolfalseOb komplette Kacheln rekonstruiert werden sollen (kein Grenzschnitt)
tile_systemJSONAT-KoordinatensystemKachel-Koordinatensystem

Kachelmodi erklärt

1. 2D-reguläres Raster (divide_mode = 0)

Geeignet für Gebiete mit geringen Geländeunterschieden:

{
"divide_mode": 0,
"tile_size": 500.0, // 500m x 500m Raster
"tile_system": {
"type": 3,
"epsg_code": 32650 // UTM-Projektionskoordinatensystem
}
}

2. 3D-reguläres Raster (divide_mode = 1)

Geeignet für Gebiete mit großen Höhenunterschieden:

{
"divide_mode": 1,
"tile_size": 300.0, // 300m x 300m x 300m Würfel
"tile_system": {
"type": 1 // Lokales Koordinatensystem
}
}

3. Speicheradaptive Kachelung (divide_mode = 2)

Automatische Kachelung basierend auf Speicherlimits:

{
"divide_mode": 2,
"target_memory": 16.0, // Maximal 16GB Speicher pro Kachel
"reconstruct_whole_tile": false
}

Vollständige Konfigurationsbeispiele

Stadtweite Szene 2D-Kachelung

{
"working_dir": "C:/Projects/CityScale",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 0,
"tile_size": 1000.0, // 1km Raster
"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
}
}

Berggelände 3D-Kachelung

{
"working_dir": "C:/Projects/Mountain",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 1,
"tile_size": 500.0, // 500m Würfel
"tile_system": {
"type": 0, // LocalENU
"origin_point": [114.123, 22.123, 100.0]
}
},
"roi_for_3d": {
"boundary": [...],
"min_z": 100,
"max_z": 2000 // Großer Höhenunterschied
}
}

Speicherbegrenzte Umgebung

{
"working_dir": "C:/Projects/LimitedMemory",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 2,
"target_memory": 8.0, // Nur 8GB verfügbarer Speicher
"reconstruct_whole_tile": false
},
"roi_for_3d": {
"boundary": [...]
}
}

Ausgabeergebnisse

tiles.json Dateistruktur

Die generierte tiles.json nach der Kachelung:

{
"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": { // Rasterinformationen (Modus 0/1)
"origin": [500000, 2500000],
"rows": 10,
"cols": 10
},
"tile_size": 1000.0
}

Verwendung der Kachelergebnisse

Reconstruct3D liest automatisch tiles.json und führt gekachelte Rekonstruktion durch:

{
"license_id": 9200,
"working_dir": "C:/Projects/CityScale", // Enthält tiles.json
// ... andere Reconstruct3D-Parameter
}

Auswahl der Kachelstrategie

Szenentyp-Vergleich

SzenentypEmpfohlener ModusRastergröße-VorschlagBeschreibung
Flache Stadt2D-Raster500-2000mFlaches Gelände, kleine Höhenunterschiede
Berggelände3D-Raster300-1000mGroße Höhenunterschiede, erfordert vertikale Schichtung
Gemischte SzeneSpeicheradaptiv-Automatische Optimierung des Kachelschemas
Lineare Technik2D-RasterBenutzerdefiniertLängliche Streifen entlang der Routenrichtung setzen

Speicherschätzung

Speicherbedarf pro Kachel ≈ (Bilder in Kachel × Bildauflösung × 3) / Komprimierungsverhältnis

Referenzwerte:

  • 100 20MP-Bilder ≈ 8-12 GB
  • 200 20MP-Bilder ≈ 16-24 GB

Parallele Verarbeitung

Lokale Parallelität

import subprocess
import json
import concurrent.futures

# Kachelergebnisse lesen
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"],
# ... andere Parameter
}

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

# Parallele Verarbeitung
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
executor.map(process_tile, tiles_info["tiles"])

Verteilte Verarbeitung

Kachelergebnisse können zur Verarbeitung auf mehrere Maschinen verteilt werden:

  1. Master-Knoten führt Kachelung durch
  2. Verteile tiles.json und Daten
  3. Jeder Knoten verarbeitet zugewiesene Kacheln unabhängig
  4. Ergebnisse aggregieren

Bewährte Praktiken

1. Kachelgrößenauswahl

  • Ausreichender Speicher: Verwende größere Kacheln zur Reduzierung von Grenzeffekten
  • Begrenzter Speicher: Verwende kleinere Kacheln zur Stabilitätsgewährleistung
  • Parallele Verarbeitung: Balance zwischen Kachelanzahl und Verarbeitungszeit pro Kachel

2. Überlappungsbereich-Behandlung

{
"reconstruct_whole_tile": true, // Komplette Kacheln generieren
// Überlappungsbereiche in Nachbearbeitung zusammenführen
}

3. Koordinatensystemauswahl

  • 2D-Kachelung: Verwende projiziertes Koordinatensystem (metrische Einheiten)
  • 3D-Kachelung: Lokal oder LocalENU
  • Vermeide 3D-Kachelung in geografischen Koordinatensystemen

4. ROI-Optimierung

{
"roi_for_3d": {
"boundary": [
// Verwende Smart ROI generiert von AT
// Grenzen ordnungsgemäß erweitern um Abschneiden zu vermeiden
]
}
}

Leistungsoptimierung

1. Verarbeitungszeit-Schätzung

Gesamtzeit = Kachelzeit + max(Verarbeitungszeit pro Kachel) + Zusammenführungszeit

2. Lastausgleich

  • max_memory-Verteilung prüfen
  • Parameter anpassen um Last über Kacheln auszugleichen
  • Dynamische Aufgabenzuteilung berücksichtigen

3. Speicheroptimierung

  • Verwende SSD für Arbeitsverzeichnis
  • Verteile Kachelergebnisse über mehrere Festplatten
  • Reserviere ausreichenden temporären Speicherplatz

Häufige Probleme

F: Lücken an Kachelgrenzen nach Kachelung?

A:

  • Setze reconstruct_whole_tile: true
  • Erhöhe Überlappung zwischen Kacheln (durch ROI-Erweiterung)
  • Optimiere Zusammenführung in Nachbearbeitung

F: Einige Kacheln verarbeiten nicht?

A:

  • Prüfe ob Kachel-max_memory Limits überschreitet
  • Überprüfe Bildverteilung in spezifischen Kacheln
  • Erwäge Neu-Kachelung oder Parameteranpassung

F: Zu viele Kacheln?

A:

  • Erhöhe tile_size oder target_memory
  • Verwende anderen Kachelmodus
  • Erwäge hierarchische Verarbeitungsstrategie

Erweiterte Anwendungen

Benutzerdefinierte Kachelschemas

Basierend auf tiles.json kannst du:

  1. Kachelgrenzen manuell anpassen
  2. Kleine Kacheln zusammenführen
  3. Große Kacheln aufteilen
  4. Prioritäten setzen

Inkrementelle Updates

# Nur geänderte Bereiche verarbeiten
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)

Nächste Schritte


Tipp: Eine ordnungsgemäße Kachelstrategie ist der Schlüssel zur Verarbeitung großskaliger Daten. Es wird empfohlen, zuerst mit kleinen Daten zu testen, um optimale Parameter zu finden, bevor komplette Datensätze verarbeitet werden.