CSV-Export: Nachbarschaftserkennung ueber Bounding-Box-Ueberschneidung (STRtree/shapely)

Neue Spalte "Nachbarn" (kommaseparierte TeileId-Liste) in export_csv.py:
zwei Elemente gelten als benachbart, wenn ihre Bounding-Boxes (x/y-Ebene)
sich ueberschneiden. Toleranz konfigurierbar in mm ueber cfg/export.cfg
[Nachbarschaft] -> toleranz_mm, siehe lib/export_neighbors.py.
Nur EXPORTCSV betroffen, EXPORTSIVAS bleibt unveraendert.

shapely als neue Abhaengigkeit in requirements.txt ergaenzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 15:26:30 +02:00
parent 57badf0556
commit 6ab698286f
9 changed files with 315 additions and 127 deletions
+5 -5
View File
@@ -203,7 +203,7 @@ class TestFoerdererExportCSV:
def test_header_felder(self):
"""CSV-Header muss korrekte Spaltenbezeichnungen haben."""
expected = ["Elementnummer", "TeileArt", "TeileId", "Bezeichnung",
"Planquadrat", "Anzahl", "Position", "Boundingbox", "Merkmale"]
"Planquadrat", "Anzahl", "Position", "Boundingbox", "Nachbarn", "Merkmale"]
for i, name in enumerate(expected):
assert self.header[i] == name, (
f"Header[{i}]: erwartet '{name}', ist '{self.header[i]}'"
@@ -235,10 +235,10 @@ class TestFoerdererExportCSV:
def test_merkmale_sind_valides_json(self):
"""Merkmale-Spalte muss valides JSON enthalten."""
for i, row in enumerate(self.rows):
if len(row) < 9:
if len(row) < 10:
continue
try:
json.loads(row[8])
json.loads(row[9])
except json.JSONDecodeError as e:
pytest.fail(f"Zeile {i + 2}: Merkmale ist kein valides JSON: {e}")
@@ -247,9 +247,9 @@ class TestFoerdererExportCSV:
required = {"Typ", "Winkel", "DeltaH_mm", "DeltaL_mm",
"L_VF_m", "Hoehe_Von_mm", "Hoehe_Bis_mm"}
for i, row in enumerate(self.rows):
if len(row) < 9:
if len(row) < 10:
continue
merkmale = json.loads(row[8])
merkmale = json.loads(row[9])
missing = required - set(merkmale.keys())
assert not missing, (
f"Zeile {i + 2}: Fehlende Merkmale-Felder: {missing}"