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.

{
  "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!

Description
No description provided
Readme 140 KiB
Languages
Python 100%