EshaTariq/AstroViz_AI
1
1import streamlit as st2import requests3 4import plotly.graph_objects as go5import pandas as pd6import pydeck as pdk7import os8from dotenv import load_dotenv9 10# Load environment variables11load_dotenv()12 13# NASA API Key14NASA_API_KEY = os.getenv("NASA_API_KEY")15 16# Fetch NASA data (Example: Asteroids - NeoWs)17@st.cache_data18def get_nasa_data():19 url = f"https://api.nasa.gov/neo/rest/v1/feed?api_key={NASA_API_KEY}"20 response = requests.get(url)21 if response.status_code == 200:22 return response.json()23 else:24 return None25 26# Streamlit UI27st.title("๐ AstroViz AI - Space Data Visualization")28st.sidebar.header("Navigation")29page = st.sidebar.selectbox("Choose a visualization:", ["Asteroid Data", "3D Space View", "Planet Data Visualization"])30 31if page == "Asteroid Data":32 st.subheader("๐ Near Earth Objects (NEOs)")33 data = get_nasa_data()34 if data:35 neos = []36 for date, objects in data['near_earth_objects'].items():37 for obj in objects:38 neos.append({39 "Name": obj['name'],40 "Diameter (m)": obj['estimated_diameter']['meters']['estimated_diameter_max'],41 "Velocity (km/h)": obj['close_approach_data'][0]['relative_velocity']['kilometers_per_hour'],42 "Miss Distance (km)": obj['close_approach_data'][0]['miss_distance']['kilometers'],43 "Orbiting Body": obj['close_approach_data'][0]['orbiting_body']44 })45 df = pd.DataFrame(neos)46 st.dataframe(df)47 fig = px.bar(df, x="Name", y="Diameter (m)", color="Orbiting Body", title="Asteroid Sizes")48 st.plotly_chart(fig)49 scatter_fig = px.scatter(df, x="Miss Distance (km)", y="Velocity (km/h)", size="Diameter (m)", color="Orbiting Body", hover_data=["Name"], title="Asteroid Miss Distance vs. Speed")50 st.plotly_chart(scatter_fig)51 else:52 st.error("Failed to fetch NASA data. Try again later.")53 54elif page == "3D Space View":55 st.subheader("๐ 3D Visualization of Earth & Objects")56 layer = pdk.Layer(57 "ScatterplotLayer",58 data=pd.DataFrame({"lat": [0], "lon": [0], "size": [500000]}),59 get_position="[lon, lat]",60 get_radius="size",61 get_color="[255, 0, 0, 160]",62 pickable=True,63 )64 view_state = pdk.ViewState(latitude=0, longitude=0, zoom=1, pitch=50, bearing=0)65 st.pydeck_chart(pdk.Deck(layers=[layer], initial_view_state=view_state))66 67elif page == "Planet Data Visualization":68 st.subheader("๐ช Explore Planetary Data")69 planet_data = pd.DataFrame({70 "Planet": ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"],71 "Mass (10^24 kg)": [0.33, 4.87, 5.97, 0.64, 1898, 568, 86.8, 102],72 "Diameter (km)": [4879, 12104, 12756, 6792, 142984, 120536, 51118, 49528],73 "Distance from Sun (10^6 km)": [57.9, 108.2, 149.6, 227.9, 778.5, 1432.0, 2867.0, 4497.1]74 })75 selected_planet = st.selectbox("Choose a planet to visualize:", planet_data["Planet"].tolist())76 planet_info = planet_data[planet_data["Planet"] == selected_planet]77 st.write(planet_info)78 planet_fig = go.Figure(data=[go.Bar(x=planet_info["Planet"], y=planet_info["Diameter (km)"], marker_color='blue')])79 planet_fig.update_layout(title="Planet Diameter Comparison", xaxis_title="Planet", yaxis_title="Diameter (km)")80 st.plotly_chart(planet_fig)81 82st.sidebar.info("Data sourced from NASA API.")83 