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 54e9105..1a2fd8f 100644 Binary files a/__pycache__/overpass.cpython-313.pyc and b/__pycache__/overpass.cpython-313.pyc differ 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 0000000..1d7284b Binary files /dev/null and b/queries/__pycache__/bergbahn.cpython-313.pyc differ diff --git a/queries/__pycache__/restaurant.cpython-313.pyc b/queries/__pycache__/restaurant.cpython-313.pyc new file mode 100644 index 0000000..8f80af0 Binary files /dev/null and b/queries/__pycache__/restaurant.cpython-313.pyc differ diff --git a/queries/bergbahn.py b/queries/bergbahn.py new file mode 100644 index 0000000..c1bcd35 --- /dev/null +++ b/queries/bergbahn.py @@ -0,0 +1,13 @@ +# -> 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