From 4f5b5d8dd34468336f1d4e785c159be12fb07813 Mon Sep 17 00:00:00 2001 From: Marco Schmid Date: Tue, 21 Apr 2026 20:42:38 +0200 Subject: [PATCH] Task 5: split bbox, store .json to disk --- main.py | 78 ++++++++++-------- queries/__init__.py | 0 queries/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 196 bytes queries/__pycache__/bergbahn.cpython-313.pyc | Bin 0 -> 498 bytes .../__pycache__/restaurant.cpython-313.pyc | Bin 0 -> 436 bytes queries/bergbahn.py | 12 +++ queries/restaurant.py | 11 +++ 7 files changed, 67 insertions(+), 34 deletions(-) create mode 100644 queries/__init__.py create mode 100644 queries/__pycache__/__init__.cpython-313.pyc create mode 100644 queries/__pycache__/bergbahn.cpython-313.pyc create mode 100644 queries/__pycache__/restaurant.cpython-313.pyc create mode 100644 queries/bergbahn.py create mode 100644 queries/restaurant.py diff --git a/main.py b/main.py index aab2504..ff74058 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,24 @@ -from main_start import QUERY +import logging from overpass import fetch_overpass +from queries.bergbahn import BERGBAHN_QUERY +from queries.restaurant import RESTAURANT_QUERY import requests +# --------------------------------------------------------------------------- +# Logging konfigurieren +# --------------------------------------------------------------------------- + +# Erinnerung: Log-Levels -> DEBUG, INFO, WARNING, ERROR, CRITICAL + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s [%(levelname)s] %(message)s", + datefmt="%H:%M:%S", +) +logger = logging.getLogger(__name__) + + # --------------------------------------------------------------------------- # Konfiguration # --------------------------------------------------------------------------- @@ -12,17 +28,7 @@ BBOXEN = { "schweiz": (45.8, 5.9, 47.8, 10.5), } -QUERY = """ - [out:json][timeout:2][maxsize:500000]; - ( - node["aerialway"="station"]({bbox}); - way["aerialway"="station"]({bbox}); - node["railway"="funicular"]({bbox}); - way["railway"="funicular"]({bbox}); - node["railway"="station"]["funicular"="yes"]({bbox}); - ); - out center body; - """ +QUERY = {"bergbahn": BERGBAHN_QUERY} # --------------------------------------------------------------------------- @@ -30,18 +36,29 @@ QUERY = """ # --------------------------------------------------------------------------- def main() -> None: + query_name = list(QUERY.keys())[0] + for name, bbox in BBOXEN.items(): + logger.info(f"Starte Abfrage für Query: {query_name}, '{name}' mit bbox={bbox}") try: - result = fetch_overpass(overpass_query=QUERY, bbox=bbox) + result = fetch_overpass(overpass_query=QUERY.get(query_name,""), bbox=bbox) except RuntimeError as e: - print(f"API-Fehler bei '{name}': {e}") + logger.error(f"API-Fehler bei '{name}': {e}") continue except requests.Timeout: - print(f"Timeout bei '{name}' — bbox zu gross oder Server überlastet") + logger.error(f"Timeout bei '{name}' — bbox zu gross oder Server überlastet") continue elements = result.get("elements", []) - print(elements) + logger.info(f"'{name}': {len(elements)} Elemente gefunden") + + for el in elements: + el_type = el.get("type", "?") + tags = el.get("tags", {}) + el_name = tags.get("name", "–") + logger.debug(f" [{el_type}] {el_name}") + + logger.info("Fertig.") if __name__ == "__main__": @@ -49,24 +66,17 @@ if __name__ == "__main__": # Was ist passiert? - # * Wir haben die Logik in ein eigenes Modul 'overpass' verfrachtet - # * Wir haben die Funktion von einer reinen Bergbahn-Logik befreit und für alle möglichen Overpass-Queries bereit - # gemacht (generalisiert) + # * Wir haben den Logger eingebaut und können auf verschiedenen Levels loggen + # * Wir haben ein neues Model 'queries' erstellt und darin die Queries für bergbahn und restaurant abgelegt. + # -> Prinzip der Trennung von Daten und Logik! # TASK: - # * Jetzt wäre doch ein guter Zeitpunkt um anstelle der print-Statements das Logging einzubauen -> verwendet das - # Logging-Modul in Python und ersetzt die print-statements! - # * Hier haben wir einen weiteren Query für restaurants -> bildet ein neues Modul 'queries' und baut dort sowohl den - # Bergbahn- als auch den Restaurant-Query ein: - # - # RESTAURANT_QUERY = """ - # [out:json][timeout:15][maxsize:500000]; - # ( - # node["amenity"="restaurant"]({bbox}); - # way["amenity"="restaurant"]({bbox}); - # node["amenity"="cafe"]({bbox}); - # way["amenity"="cafe"]({bbox}); - # ); - # out center body; - # """ \ No newline at end of file + # * bbox für Schweiz scheint zu gross und wirft einen error ... Lösungsmöglichkeiten? + # -> Wir können die Schweiz (Koordinaten) in Unterregionen aufsplitten. Macht das bitte. + # -> entfernt dazu die bbox für 'davos', nehmt die 'schweiz' und splittet sie in 4, 9 oder 16 + # Koordinaten-Tuples auf. + # * Speichert und loggt in welchen Koordinaten-Tuples ein Fehler auftritt (gebt am Schluss eine Zusammenfassung + # dieser fehlerhaften Queries aus) + # * Baut eine neue Liste für die erfolgreichen Resultate und speichert diese Liste am Schluss als .json auf + # eurer Festplatte \ No newline at end of file diff --git a/queries/__init__.py b/queries/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/queries/__pycache__/__init__.cpython-313.pyc b/queries/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f53a1659fa6f72e5cba7c689fa2ab93a7be52cb1 GIT binary patch literal 196 zcmey&%ge<81UvUX&jitrK?DpiLK&Y~fQ+dO=?t2Tek&P@n1H;`AgNo)`WgATsrtEz zMalX4F8Rr&xv6<2#rmOsA+A9|p3WX2`pNkzsqv{5smY}!`9=E9{w}WZ!2yoWuKG@n z&K|Bl{z3ZAF2VZwWvN94iN(eGg{7%QnW@G4@$s2?nI-Y@dIgoYIBatBQ%ZAE?TT1| Tc7ohg3}Sp_W@Kb6Vg|ARqJ}e7 literal 0 HcmV?d00001 diff --git a/queries/__pycache__/bergbahn.cpython-313.pyc b/queries/__pycache__/bergbahn.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..337ad29b7d48bbd5689552720af5486a65f96d49 GIT binary patch literal 498 zcma)3O-{l<7@aCHq!AK5LDLo8IJj^FVgjWR69ZacVVZ_a%Lrp=2WL7;H7-1ahwu(A zJO^7BZb`U+U;U3U(YKh%o9}&ZzIn4O6m$f5czkA-hR{<+J^=g`%RFp%sEY&|Y1Rta zfP(IEl~m3ok9{v;5zW|k+4mwclkAFCcFGz2s$S9!Bj!WunS=^PCYK~NYo<&{!gy@@ zrRyNzvm2`lGAR8+^=2jrd$&4OF$>j%h+oY9RQ)vjoXa!6d~0S(<#%_O7T#-wG)|~6 z0zOQudfU?G#fIbVH|nkS;JEL&C--QXkBzzAi0<^VFLG6XXeF{CqUGF4sViq0=BvC1mW&x?&N z$;?d!@eB=OqjM80iZiQHtxOF-Al8~ogG)gnFFz$US}8F%H7~QIQpr}SD7CmGv9u^L zuS6+UqdF-mzoJ&t8mO*3v62{N=*A@{rlsOF2weftGN5}El2h|aQi~Ll@>43Ux%@O4 zZwUms28TF?208kL#0Q4D21Tx9_zVhwTdDdP`MIh3xrs%|`T8#T$)!NAloacS`h~a# z1$jDqgy<&&y%?Wbk(yjul3%3n?C;_l9~|K5?5gkN==LY>UzS=_kXT%- zUs#%2l$lzrj|d69g34PQHo5sJr8%i~MQlJ@L1ACa3nV@;Gcq!MVBr*DxyT?;!~zrn E09X5j)c^nh literal 0 HcmV?d00001 diff --git a/queries/bergbahn.py b/queries/bergbahn.py new file mode 100644 index 0000000..0f1cc87 --- /dev/null +++ b/queries/bergbahn.py @@ -0,0 +1,12 @@ + +BERGBAHN_QUERY = """ +[out:json][timeout:10][maxsize:500000]; +( + node["aerialway"="station"]({bbox}); + way["aerialway"="station"]({bbox}); + node["railway"="funicular"]({bbox}); + way["railway"="funicular"]({bbox}); + node["railway"="station"]["funicular"="yes"]({bbox}); +); +out center body; +""" \ No newline at end of file diff --git a/queries/restaurant.py b/queries/restaurant.py new file mode 100644 index 0000000..1167778 --- /dev/null +++ b/queries/restaurant.py @@ -0,0 +1,11 @@ + +RESTAURANT_QUERY = """ +[out:json][timeout:10][maxsize:500000]; +( + node["amenity"="restaurant"]({bbox}); + way["amenity"="restaurant"]({bbox}); + node["amenity"="cafe"]({bbox}); + way["amenity"="cafe"]({bbox}); +); +out center body; +""" \ No newline at end of file