# README Ich habe euch den `GeoService` demonstriert. Das ist ein Docker-basierter Mikroservice, welcher Fragen wie 'Zeige mir basierend auf meinem Standort die 3 per Auto nächstgelegenen Restaurants' oder 'Wieviele Schwimmbäder befinden sich im Umkreis von 3 Kilometer um meinen jetzigen Standort' etc. Um den Service zu betreiben braucht es (valide) Daten. Diese kann man kaufen oder sich selbst bauen. Wir gehen hier den zweiten Weg :-). Das Ziel für die nächsten paar Übungsstunden ist ein kleines Projekt (Miniprojekt), welches uns diese Basisdaten mithilfe von OpenStreetMap (Overpass) für die ganze Schweiz baut. Es geht weniger darum, ein super End-Produkt zu bauen (inhaltlich), als vielmehr darum viele in diesem Semester gelernte Konzepte und Techniken zu integrieren und an einem praxisnahen Beispiel miteinander zu erarbeiten und zu festigen. Dies sind u.U.: * Zugriff mit Python auf eine API (Overpass) * Arbeiten mit git auf Gitea (commits, clone, checkout) * Dataclasses * sauberer Python-Code mit Docstrings, Typehints und Logging * Speichern der Resultate als .json in einem File und in eine Postgres-Datenbank * Parallelisierung (multithreading) von Abfragen auf Overpass-API * Dekorator-Pattern (für Zeitmessung) * Schreiben von Pytests mit und ohne Mocks **Ziel:** Valide Daten für ausgewählte POI's (Points Of Interests) zu produzieren, z.B. ```json { "generated_at": "2026-03-09T23:03:40.107307+00:00", "count": 2511, "pois": [ { "id": "node/2068758717", "type": "node", "poi_type": "rail_station", "name": "St. Urban Ziegelei", "lat": 47.2271478, "lon": 7.8361018, "tags": { "name": "St. Urban Ziegelei" } }, { "id": "node/2068760081", "type": "node", "poi_type": "rail_station", "name": "St. Urban", "lat": 47.2317566, "lon": 7.8359882, "tags": { "name": "St. Urban" } } ] } ``` Für die POIs machen wir unseren eigenen Datatyp 'POI' (`dataclass`) Ein einzelner POI: ``` { "id": "node/2068758717", "type": "node", "poi_type": "rail_station", "name": "St. Urban Ziegelei", "lat": 47.2271478, "lon": 7.8361018, "tags": { "name": "St. Urban Ziegelei" } ``` Die Daten beziehen wir von `https://overpass-turbo.eu/`. Overpass bietet nebst diesem frontend-basierten Ansatz auch eine API-Schnittstelle (POST- und GET-Requests) an, welche wir nutzen können (`OVERPASS_URL=https://overpass-api.de/api/interpreter`). ## Gitea Das Miniprojekt liegt auf `Gitea` bereit. Ziel ist es auch den Umgang mit git ein wenig zu üben. In `GIT_HINTS.md` habe ich die wichtigsten Befehle im Zusammenhang mit diesem Miniprojekt festgehalten. **zu beachten**: Der Workflow mit `git commit/pull` etc. hier ist nicht derselbe, wie in einem normalen Projekt. Normalerweise machen wir von `main` einen Branch, lösen auf diesem einen Task, stellen dann einen `PR` und mergen zurück in `main`. Dann beginnt das ganze Spiel wieder von vorne... Hier im Miniprojekt verhält es sich ein wenig anders. Die (Muster)-Lösungen liegen schon zu Beginn auf dem `main`-Branch und sind mit tags (z.B. TASK_1) versehen. Der main-Branch kann also zu unterschiedlichen Zeitpunkten ausgecheckt werden und Zeit die Arbeit zu diesem Zeitpunkt. Der/die Studierende kann also zu einem bestimmten Task auschecken und dann in `Task.md` nachlesen, was als Nächstes ansteht. Idee ist jedoch nicht, einfach die 'Lösungen' anzuschauen, sondern auf einem paralellen Branch `work` die Übungen selbst zu programmieren. Wenn Du nicht mehr weiter weisst, kannst Du jederzeit auf `main` zu einem Task-Tag wechseln und nachschauen. Programmiert (und commited) soll aber IMMER nur auf dem `work`-Branch werden! ## Code Aus u.a. didaktischen Gründen, beginnen wir nicht gerade mit allem möglichen in unserem Projekt, sondern arbeiten zuerst z.B. einmal in `main.py` und nutzen `print`-Statements im Wissen, dass wir die später durch saubere `loggings` ersetzen. Auch gibt es punktuell immer wieder Refaktorierungen des Codes (darauf werde ich jeweils in den Tasks hinweisen). Ziel ist am Schluss ein verständliches Miniprojekt mit einer sauberen Struktur und verständlichem Code. Das Miniprojekt erhebt aber eben keinen Anspruch auf absolute Performanz oder Stabilität, es ist ein und bleibt ein Lernprojekt! Viel Spass im Projekt!