{"id":51116277,"url":"https://github.com/osmberlin/osm-schulabgleich","last_synced_at":"2026-06-24T22:01:15.954Z","repository":{"id":348435193,"uuid":"1198070422","full_name":"osmberlin/osm-schulabgleich","owner":"osmberlin","description":"Vergleicht offizielle Schuldaten von jedeschule mit OSM.","archived":false,"fork":false,"pushed_at":"2026-05-06T20:10:12.000Z","size":1098,"stargazers_count":2,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-06T22:20:07.667Z","etag":null,"topics":["opendata","openstreetmap","osm","schule"],"latest_commit_sha":null,"homepage":"https://schulabgleich.osm-verkehrswende.org/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/osmberlin.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-01T05:13:02.000Z","updated_at":"2026-05-06T21:42:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/osmberlin/osm-schulabgleich","commit_stats":null,"previous_names":["osmberlin/osm-schul-abgleich","osmberlin/osm-schulabgleich"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/osmberlin/osm-schulabgleich","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osmberlin%2Fosm-schulabgleich","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osmberlin%2Fosm-schulabgleich/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osmberlin%2Fosm-schulabgleich/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osmberlin%2Fosm-schulabgleich/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/osmberlin","download_url":"https://codeload.github.com/osmberlin/osm-schulabgleich/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osmberlin%2Fosm-schulabgleich/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34750953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["opendata","openstreetmap","osm","schule"],"created_at":"2026-06-24T22:01:15.320Z","updated_at":"2026-06-24T22:01:15.938Z","avatar_url":"https://github.com/osmberlin.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OSM Schulabgleich\n\nVergleicht pro Bundesland Schulstammdaten von [jedeschule.codefor.de](https://jedeschule.codefor.de) mit OSM (`amenity=school`, `education=school`, `amenity=college` und `education=college`; je **Knoten**, **Weg** und **Relation** in einem Overpass-Lauf mit `out geom`).\n\nDie zentrale CSV kommt von [jedeschule.codefor.de](https://jedeschule.codefor.de) ([Projekt](https://codefor.de/projekte/jedeschule-2/), [csv-data](https://jedeschule.codefor.de/csv-data/)); die CI trennt **Daten-Refresh** und **Deploy**:\n\n- `data-refresh.yml` lädt Daten nachts um **03:00 Europe/Berlin** und aktualisiert dabei **OSM und amtliche CSV in jedem Lauf**.\n- `pages-deploy.yml` nutzt den letzten erfolgreichen Datensatz-Artefaktstand und deployt ohne frischen Download.\n\n**Diagramme (Mermaid):** [Pipeline (Download → pro Land)](docs/pipeline.md) · [`matchSchools` (Abgleichslogik)](docs/match-schools.md)\n\n## Daten-Pipeline (Download → Abgleich pro Bundesland)\n\nNach dem Download liegen die JedeSchule-CSV und das OSM-GeoJSON (nur für den Match-Schritt, unter `public/datasets/.pipeline/`, nicht im statischen Build). Der Abgleich läuft **pro Bundesland** (Gate → Dedupe → `matchSchools`) und schreibt direkt `public/datasets/{code}/…` sowie `summary.json`.\n\n| Skript                         | Aufgabe                                                                                                                                                                                                                                              |\n| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `pipeline:download:jedeschule` | CSV laden → `jedeschule-latest.csv`, `jedeschule_stats.json`, `schools_official_de.meta.json`.                                                                                                                                                       |\n| `pipeline:download:osm`        | Ein Overpass-Lauf für **Deutschland** → `.pipeline/schools_osm_de.geojson`, `schools_osm_de.meta.json`.                                                                                                                                              |\n| `pipeline:download`            | Startet **beide** Downloads **parallel**; **Exit 1**, wenn eine Quelle fehlschlägt (`ok: false` in den Meta-JSONs).                                                                                                                                  |\n| `pipeline:match`               | Abgleich aller Länder (**ohne** nationale Zwischendateien). **Nur** wenn JedeSchule- **und** OSM-Meta `ok: true` und CSV + `.pipeline`-OSM vorliegen, sonst Skip + `runs.jsonl`. `PIPELINE_FORCE_MATCH=1` erzwingt den Lauf mit vorhandenen Dateien. |\n| `pipeline:split-lands`         | Entspricht `pipeline:match` (Alias; es gibt keinen separaten Split-Schritt mehr).                                                                                                                                                                    |\n| `pipeline:rebuild`             | Nur Abgleich (**ohne** Downloads), analog `pipeline:match`.                                                                                                                                                                                          |\n| `pipeline`                     | `pipeline:download` → `pipeline:rebuild` (z. B. CI).                                                                                                                                                                                                 |\n\n```bash\nbun run pipeline\n```\n\nCSV-URL: `scripts/lib/jedeschuleDumpConfig.ts`. Optional lokal: `public/datasets/jedeschule-latest.csv` (`.gitignore`). Meta in `schools_official_de.meta.json` u. a. `generatedAt`, HTTP-Header, SHA-256, `update_timestamp`, `upstreamDatasetChanged`.\n\nDownload-Orchestrierung: `Bun.spawn` (beide Quellen parallel); der Parent prüft danach beide Meta-Dateien.\n\n## Bundesland-Grenzen\n\nDie vereinfachten Grenzen liegen unter `public/bundesland-boundaries/{code}.geojson` (**OpenStreetMap**).\n\n## Entwicklung\n\n```bash\nbun install\nbun run pipeline:download          # oder einzeln :jedeschule / :osm\nbun run pipeline:rebuild\nbun run dev\n```\n\nWenn die Downloads schon passen und nur der Abgleich neu laufen soll:\n\n```bash\nbun run pipeline:rebuild\n```\n\n## Suchparameter (Query-String)\n\n### Startseite (`/`)\n\n- **`map`** (`?map=z/lat/lon`, wie bei openstreetmap.org): Router **`beforeLoad`** leitet auf das passende **`/bundesland/{code}`** um (wie bei **`?osm=`** technisch gleiches Muster: keine globale Client-Logik nötig).\n- **`osm`:** OSM-Objekt als Freitext — z. B. `w93504889`, `way/93504889` oder Link von **openstreetmap.org** / **osm.org**. **`beforeLoad`** lädt die Position per **Overpass**, bestimmt das **Bundesland** und leitet zu **`/bundesland/{code}?map=z/lat/lon`** um (**`bbox`** wird nicht gesetzt). **`osm`** steht danach nicht mehr in der URL. Geht auch mit **`?osm=`** unter **`/bundesland/{code}`** (gleicher Redirect). Die **Lupen**-Suche in der Kopfzeile navigiert zu **`/?osm=…`** und löst denselben Ablauf aus.\n\n### Bundesland-Übersicht (`/bundesland/{code}`)\n\n- **`map`:** synchronisiert die **Kartenansicht** (Zoom und Mittelpunkt).\n- **`bbox`** (`?bbox=west,south,east,north`): optionaler **Listenfilter** auf den Kartenausschnitt (Setzen/Löschen über die Karte).\n\n## Qualität\n\n```bash\nbun run lint\nbun run test\nbun run build\n```\n\nGitHub Actions:\n\n- `.github/workflows/data-refresh.yml`: geplanter/manueller Daten-Refresh, schreibt `datasets-last-good` (Artifact).\n- `.github/workflows/pages-deploy.yml`: Push-Deploy aus `datasets-last-good` + `pipeline:rebuild` + Pages-Deploy.\n\n## See also\n\n- https://community.openstreetmap.org/t/art-der-schulen-uber-isced-level-school-oder-school-de/104643\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fosmberlin%2Fosm-schulabgleich","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fosmberlin%2Fosm-schulabgleich","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fosmberlin%2Fosm-schulabgleich/lists"}