modified: app.py
This commit is contained in:
91
app.py
91
app.py
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user