modified: app.py

This commit is contained in:
SimolZimol
2024-09-10 09:40:34 +02:00
parent 272e7cad25
commit db03079370

91
app.py
View File

@@ -5,70 +5,47 @@ from flask import Flask, jsonify
app = Flask(__name__)
# URL der komprimierten JSON-Datei
URL = "https://opendata.dwd.de/weather/weather_reports/synoptic/germany/json/Z__C_EDZW_latest_bda01%2Csynop_bufr_GER_999999_999999__MW_XXX.json.bz2"
def fetch_weather_data():
# Download der komprimierten Datei
response = requests.get(URL)
# Funktion zum Herunterladen und Entpacken der BZ2-Datei
def get_weather_data():
url = 'https://opendata.dwd.de/weather/weather_reports/synoptic/germany/json/Z__C_EDZW_latest_bda01%2Csynop_bufr_GER_999999_999999__MW_XXX.json.bz2'
response = requests.get(url)
if response.status_code == 200:
# Entpacke die bz2-Datei
compressed_content = bz2.decompress(response.content)
# Konvertiere die Bytes zu einem JSON-Objekt
weather_data = json.loads(compressed_content.decode('utf-8'))
return weather_data
else:
return {"error": "Fehler beim Abrufen der Wetterdaten"}
def format_weather_data(raw_data):
# Extrahiert die lesbaren Wetterdaten
formatted_data = []
# Entpacke die BZ2-Datei
decompressed_data = bz2.decompress(response.content)
# Gehe die Liste der "messages" durch und extrahiere die relevanten Daten
for entry in raw_data.get("messages", []):
# Jeder Eintrag enthält die Wetterdaten für eine Station
station_info = {}
for item in entry:
if isinstance(item, list):
for sub_item in item:
# Filtern und lesen von relevanten Wetterdaten
key = sub_item.get("key")
value = sub_item.get("value")
if key == "stationOrSiteName":
station_info["Station Name"] = value
elif key == "latitude":
station_info["Latitude"] = value
elif key == "longitude":
station_info["Longitude"] = value
elif key == "airTemperature":
station_info["Temperature (°C)"] = round(value - 273.15, 2) # Umrechnung von Kelvin in Celsius
elif key == "dewpointTemperature":
station_info["Dew Point (°C)"] = round(value - 273.15, 2) # Umrechnung von Kelvin in Celsius
elif key == "pressureReducedToMeanSeaLevel":
station_info["Pressure (hPa)"] = value / 100 # Umrechnung von Pa in hPa
elif key == "relativeHumidity":
station_info["Humidity (%)"] = value
elif key == "windSpeed":
station_info["Wind Speed (m/s)"] = value
elif key == "windDirection":
station_info["Wind Direction (°)"] = value
formatted_data.append(station_info)
# Lade das JSON aus den entpackten Daten
weather_data = json.loads(decompressed_data.decode('utf-8'))
return formatted_data
return weather_data
# API-Route, um die Wetterdaten an den Client zurückzugeben
@app.route('/weather')
def get_weather():
raw_data = fetch_weather_data()
if "error" in raw_data:
return jsonify(raw_data)
def weather():
data = get_weather_data()
# Formatierte Wetterdaten anzeigen
formatted_data = format_weather_data(raw_data)
# Beispiel: Extrahiere spezifische Wetterinformationen aus den Daten
# In diesem Fall Temperatur, Luftfeuchtigkeit und Druck
weather_info = []
return jsonify(formatted_data)
for message in data['messages']:
for subset in message[1:]:
for item in subset:
if isinstance(item, list):
weather_record = {}
for entry in item:
if entry['key'] == 'stationOrSiteName':
weather_record['station'] = entry['value']
if entry['key'] == 'airTemperature':
weather_record['temperature'] = entry['value'] - 273.15 # K -> °C
if entry['key'] == 'pressureReducedToMeanSeaLevel':
weather_record['pressure'] = entry['value'] / 100 # Pa -> hPa
if entry['key'] == 'relativeHumidity':
weather_record['humidity'] = entry['value']
if weather_record:
weather_info.append(weather_record)
return jsonify(weather_info)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)