# Projektstruktur

Interaktive Wahlkarte für die Berliner Abgeordnetenhaus- und BVV-Wahlen. Die Karte wird als einbettbares Widget (Script-Tag) auf einer externen Website eingebunden.

## Einstiegspunkte

| Datei | Zweck |
|---|---|
| `wahlkarte-embed.js` | Haupt-Widget: rendert Leaflet-Karte, Steuerelemente, Tooltip-Logik |
| `wahlkarte-embed.css` | Styles für das Widget |
| `test.html` | Lokale Testseite zum Einbinden des Widgets |

## Datenpipeline

```
Rohdaten/DL_BE_AGHBVV2023.xlsx
        │
        ▼
local/build_results.py          → data/ERGEBNISSE_*.json.gz  (Wahlergebnisse)
local/dissolve_awk.py           → data/wahlkreise.geojson.gz (Wahlkreis-Polygone aus AWK-Grenzen)
local/dissolve_bwb.py           → data/briefwahlbezirke.geojson.gz
local/seed_tiles.py             → cache/tiles/               (Kartenkacheln pre-cachen)

Rohdaten/AGH2023_Strukturdaten.xlsx
        │
        ▼
local/build_strukturdaten.py    → data/STRUKTURDATEN_2023.json.gz (Demografie je Briefwahlbezirk,
                             einwohnergewichtet aus UWB-Werten aggregiert)
```

## Verzeichnisse

```
Rohdaten/   XLSX vom Landeswahlleiter, Wahllokale
data/       Verarbeitete GeoJSON- und JSON-Dateien (meist .gz)
local/      Python-Skripte der Datenpipeline
lib/        Vendored JS-Libs (Leaflet, Turf)
promis/     Porträtfotos bekannter Kandidat:innen
cache/      Serverseitiger Tile-Cache (nicht ins Repo)
```

## Wichtige JSON-Dateien

| Datei | Inhalt |
|---|---|
| `data/config.json` | Sperrklauseln, Parteifarben, Tooltip-Texte |
| `data/ERGEBNISSE_agh_bezirke_2023.json.gz` | AGH-Ergebnisse auf Bezirks-/Wahlkreisebene |
| `data/ERGEBNISSE_agh_wahlbezirke_2023.json.gz` | AGH-Urnenwahlbezirke |
| `data/ERGEBNISSE_agh_bwb_2023.json.gz` | AGH-Briefwahlbezirke |
| `data/ERGEBNISSE_bvv_*.json.gz` | BVV-Entsprechungen |
| `data/wahlbezirke.geojson.gz` | Polygon-Geometrien der Wahlbezirke |
| `data/wahlkreise.geojson.gz` | Polygon-Geometrien der Wahlkreise |
| `data/bezirke.geojson.gz` | Bezirksgrenzen |
| `data/briefwahlbezirke.geojson.gz` | Briefwahlbezirk-Geometrien |
| `data/wahllokale.json.gz` | Standorte der Wahllokale |
| `data/Adressen.geojson` / `adressen.db` | Geocodierte Berliner Adressen |
| `data/berliner-mauer.geojson.gz` | Mauerverlauf (Overlay) |
| `data/ost-west-grenze.geojson.gz` | Ost-West-Grenze (Overlay) |
| `data/sbahnring.geojson.gz` | S-Bahn-Ring (Overlay) |
| `data/promi.json.gz` | Bekannte Kandidierende mit Foto-Mapping |
| `data/STRUKTURDATEN_2023.json.gz` | Demografie je Briefwahlbezirk (AGH, nur Ansicht "Wahlbezirke") |

## Server-PHP

| Datei | Zweck |
|---|---|
| `tile-proxy.php` | Proxyt basemap.de-Kacheln und legt sie im Cache ab |
| `geocode.php` | Adresssuche gegen `adressen.db` (SQLite) |

## Neue Wahl einpflegen

1. XLSX vom Landeswahlleiter in `Rohdaten/` ablegen
2. In `local/build_results.py` oben `XLSX`, `WAHL_NAME`, `JAHR` und ggf. `PARTEIEN` anpassen
3. `python local/build_results.py` ausführen → erzeugt neue `ERGEBNISSE_*_{JAHR}.json.gz`
4. Geometrien ggf. neu erzeugen: `local/dissolve_awk.py`, `local/dissolve_bwb.py`
5. In `data/config.json` Parteifarben/Sperrklauseln prüfen
