From d0ab53185cd63955fcea800c2bb0ca30d36727e4 Mon Sep 17 00:00:00 2001 From: Marco Schmid Date: Thu, 23 Apr 2026 21:11:42 +0200 Subject: [PATCH] Task_6: split bbox, store data as .json --- TASK.md | 25 +++------- __pycache__/overpass.cpython-313.pyc | Bin 5880 -> 6004 bytes main.py | 43 ++++++++++++------ overpass.py | 8 +++- queries/__pycache__/bergbahn.cpython-313.pyc | Bin 0 -> 499 bytes .../__pycache__/restaurant.cpython-313.pyc | Bin 0 -> 398 bytes queries/bergbahn.py | 13 ++++++ queries/restaurant.py | 12 +++++ 8 files changed, 66 insertions(+), 35 deletions(-) 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/TASK.md b/TASK.md index 27b6588..6b92317 100644 --- a/TASK.md +++ b/TASK.md @@ -1,20 +1,9 @@ -# TASK 5: +# TASK 6: -* 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: +* 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. -``` - RESTAURANT_QUERY = """ - [out:json][timeout:5][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 +* Speichert und loggt in welchen Koordinaten-Tuples ein Fehler auftritt (gebt am Schluss eine Zusammenfassung + dieser fehlerhaften Queries aus) +* Bildet ein neues Modul `storage.py` und baut den Code, welcher zum Speichern der POIS als .json auf der Festplatte nötig ist. \ No newline at end of file diff --git a/__pycache__/overpass.cpython-313.pyc b/__pycache__/overpass.cpython-313.pyc index 54e910528b1bbd31b7df6549f3e8fc409167a741..1a2fd8f0620df0b75b70b51c24b80bbd551ffe62 100644 GIT binary patch delta 590 zcmeyN`$doUGcPX}0}#YyzRL8R$ScYCYofYZJwq^~H%k#q3`-DL5~KhDlo(>zOc^2k zBKBaGA`S@#C5B*DDTZLS7*11Ws0>#ydkl9lM+{FeXAEx)Gb>Qoge{m$iXn@oh!07Q zA1KNV78MBQiQxyTX7(~+3FZY02?q0lgAtPsaGk)j|gt*(Tcv zO9-&#m!uUk-iPQ_y zA=i0AFY$!_{=m%08OHdlSQKdVOessIom`HVtOuF39Zgsdny@-rZdMT~VKf#iQUS^r zfuiCTTW)?zYEE$x3y8xGax2h{w>Z;NOMJlYF5(0!b)39b)MfHFQFCK|AQu$7#pi$o v&^kuO+YJ1786@vAh}~x3d%!7hom1)(r_>CK%bY3=Y#-Pd1S}_ei>(C!A_|W6 delta 455 zcmeyO_d}QWGcPX}0}#wfd6mgIkyn!O+(dP?dX^#<2?iyGU{)!HV73@mQ)ZA728JTG zVD=dHV2&7$V9prM7-m+Wm6RLyL{63h!0;SJ^k zi@@}=1oMN%`C|Bk1*{?%7!pO~7#M;Div)s&iUec0lo(ofygeQLzOkvkyV8~;R=A2w8a=3e{+#Y38ScRkqS`0 z2o%1z*mCnzQge!nSSCw~xiA%RPL2|@lJfz|FamM$P9Om^lacW@1OHtH$-4|<5BM!6 I9~WB-03~y8yZ`_I diff --git a/main.py b/main.py index 720a30e..7e5d82f 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,23 @@ from overpass import load_pois, OverpassApiError from models import POI +import logging +from queries.bergbahn import BERGBAHN_QUERY +from queries.restaurant import RESTAURANT_QUERY + +# --------------------------------------------------------------------------- +# 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 @@ -10,33 +28,28 @@ 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} + # --------------------------------------------------------------------------- # Hauptlogik # --------------------------------------------------------------------------- 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: - pois: list[POI] = load_pois(overpass_query=QUERY, bbox=bbox) + pois: list[POI] = load_pois(overpass_query=QUERY.get(query_name,""), bbox=bbox) except OverpassApiError as exc: - print(f"Fehler bei '{name}': {exc}") + logger.error(f"Fehler bei '{name}': {exc}") continue - print(f"\n{name}: {len(pois)} POIs gefunden") + logger.info(f"\n{name}: {len(pois)} POIs gefunden") for poi in pois: - print(f" {poi.id}: ({poi.lat}, {poi.lon})") + logger.info(f" {poi.id}: ({poi.lat}, {poi.lon})") if __name__ == "__main__": diff --git a/overpass.py b/overpass.py index e6892c1..94aa37e 100644 --- a/overpass.py +++ b/overpass.py @@ -1,6 +1,10 @@ import requests from pprint import pprint from models import POI +import logging + +logger = logging.getLogger(__name__) + OVERPASS_URL = "https://overpass-api.de/api/interpreter" @@ -71,7 +75,7 @@ def _fetch_overpass(overpass_query: str, bbox: tuple) -> dict: response = requests.post( OVERPASS_URL, data={"data": query}, - timeout=5, + timeout=15, headers={"User-Agent": "CDS Exercise"}, ) response.raise_for_status() # prüft den HTTP-Statuscode der Antwort und wirft eine Exception, wenn es ein Fehler war (requests.HTTPError) @@ -119,7 +123,7 @@ def _parse_pois(raw: dict) -> list[POI]: try: pois.append(_parse_poi(element)) except OverpassApiError as exc: - print(f"POI übersprungen (id={element.get('id', '?')}): {exc}") + logger.warning(f"POI übersprungen (id={element.get('id', '?')}): {exc}") return pois diff --git a/queries/__pycache__/bergbahn.cpython-313.pyc b/queries/__pycache__/bergbahn.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d7284baae50183f0fc875e0aa6472e16aa8a05f GIT binary patch literal 499 zcmey&%ge<81bi8Lr^eyCrFYfzAwMdz26SY;LG=fy^s zWag%Vc!mbC(Yc8g#hF#9R;C6Z5Npk)!KI*(m!Favt(2IXnwMEpsbs5Elv-SpSXz{r zSE3ZFQJs{OUs0=R4OCa2SV@dBbmNi}(^ByogsuQ+8PL57$*FlIsYMD&`6-pwTz;C2 zw*-P*gF_rcgB<-r;sZlngCbWld?Qi}=_i;MLOOH+$7Q;YQxe$*?dyv1RYo1apelWJGQ1~d;8s>QrO;sY}y SBjX1aP7#)i3<5 Prinzip der Trennung von Daten und Logik! + +BERGBAHN_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; + """ \ No newline at end of file diff --git a/queries/restaurant.py b/queries/restaurant.py new file mode 100644 index 0000000..7cdf834 --- /dev/null +++ b/queries/restaurant.py @@ -0,0 +1,12 @@ +# -> Prinzip der Trennung von Daten und Logik! + +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