| import streamlit as st |
| import requests |
| from PIL import Image |
| import numpy as np |
| import matplotlib.pyplot as plt |
| from io import BytesIO |
| from datetime import datetime, timedelta |
|
|
| |
| SOLAR_IMAGE_URL = "https://sdo.gsfc.nasa.gov/assets/img/latest/latest_4096_HMIIC.jpg" |
| STORM_IMAGE_URL = "https://sdo.gsfc.nasa.gov/assets/img/latest/latest_4096_0335.jpg" |
|
|
| |
| def get_solar_image(url): |
| response = requests.get(url) |
| image = Image.open(BytesIO(response.content)) |
| return image |
|
|
| |
| def analyze_solar_image(image): |
| image_gray = image.convert('L') |
| image_array = np.array(image_gray) |
| threshold = 100 |
| sun_pixels = image_array < threshold |
| sun_activity = np.sum(sun_pixels) |
| return sun_activity, sun_pixels |
|
|
| |
| def estimate_kp_index(sun_activity): |
| kp_index = min(8, sun_activity // 10000) |
| return kp_index |
|
|
| |
| def estimate_latitude(kp_index): |
| if kp_index < 4: |
| return "Rarement visible (au-dessus de 60° de latitude)" |
| elif kp_index < 6: |
| return "Visible parfois (entre 60° et 65° de latitude)" |
| elif kp_index < 8: |
| return "Visible souvent (entre 65° et 70° de latitude)" |
| else: |
| return "Visible fréquemment (entre 70° et 75° de latitude)" |
|
|
| |
| def estimate_impact_time(distance): |
| speed_of_solar_wind = 400 |
| time_seconds = distance / speed_of_solar_wind |
| return datetime.now() + timedelta(seconds=time_seconds) |
|
|
| |
| def estimate_impact_latitude(sun_activity, kp_index): |
| base_latitude = 60 |
| intensity_factor = kp_index * 1.5 |
| estimated_latitude = base_latitude + intensity_factor |
| return estimated_latitude |
|
|
| |
| def calculate_probabilities(sun_activity, kp_index): |
| probabilities = [] |
| for intensity in range(1, 5): |
| distance = 150 + intensity * 50 |
| probability = (sun_activity / 10000) * (intensity / 4) * 100 |
| impact_time = estimate_impact_time(distance) |
| impact_latitude = estimate_impact_latitude(sun_activity, kp_index) |
| probabilities.append({'intensity': intensity, 'distance': distance, 'probability': probability, |
| 'impact_time': impact_time, 'impact_latitude': impact_latitude}) |
| return probabilities |
|
|
| |
| def display_results(kp_index, probabilities): |
| st.write(f"Indice KP estimé : {kp_index}") |
| latitude_estimation = estimate_latitude(kp_index) |
| st.write(f"Estimation de la latitude pour les aurores boréales : {latitude_estimation}") |
|
|
| st.write("Probabilités d'apparition d'aurores boréales :") |
| highest_probability_storm = (None, 0) |
|
|
| for storm in probabilities: |
| st.write(f"Tempête (Intensité: {storm['intensity']}, Distance: {storm['distance']} km) - Probabilité: {storm['probability']:.2f}%") |
| st.write(f"Heure d'impact estimée : {storm['impact_time']}") |
| st.write(f"Latitude d'impact estimée : {storm['impact_latitude']:.2f}°") |
| |
| if storm['probability'] > highest_probability_storm[1]: |
| highest_probability_storm = (storm, storm['probability']) |
|
|
| if highest_probability_storm[0] is not None: |
| st.write("Tempête avec la probabilité la plus élevée :") |
| st.write(f"Intensité: {highest_probability_storm[0]['intensity']}, Distance: {highest_probability_storm[0]['distance']} km - Probabilité: {highest_probability_storm[1]:.2f}%") |
| st.write(f"Heure d'impact estimée : {highest_probability_storm[0]['impact_time']}") |
| st.write(f"Latitude d'impact estimée : {highest_probability_storm[0]['impact_latitude']:.2f}°") |
|
|
|
|
| |
| st.title("Prédiction des Aurores Boréales") |
|
|
| |
| if st.button("Exécuter l'analyse"): |
| |
| solar_image = get_solar_image(SOLAR_IMAGE_URL) |
| st.image(solar_image, caption="Image actuelle du Soleil", use_column_width=True) |
|
|
| |
| sun_activity, sun_pixels = analyze_solar_image(solar_image) |
| kp_index = estimate_kp_index(sun_activity) |
| |
| |
| probabilities = calculate_probabilities(sun_activity, kp_index) |
| |
| |
| display_results(kp_index, probabilities) |
|
|