import random import pandas as pd import streamlit as st import pydeck as pdk # ---- Fixed Coordinates for Specific Local Areas ---- AREA_COORDINATES = { "Hyderabad": [17.4036, 78.5247], # Ramanthapur "Ballari": [15.1468, 76.9237], # Cowl Bazar "Gadwal": [16.2315, 77.7965], # Bheem Nagar "Kurnool": [15.8281, 78.0373] # Venkata Ramana Colony } POLES_PER_SITE = 12 # ---- Helper Function to Simulate Poles in a Tight Area ---- def generate_fixed_poles(site_name, center_lat, center_lon): poles = [] for i in range(POLES_PER_SITE): lat = center_lat + random.uniform(-0.001, 0.001) lon = center_lon + random.uniform(-0.001, 0.001) alert_level = random.choices(['Green', 'Yellow', 'Red'], weights=[6, 4, 2])[0] poles.append({ "Pole ID": f"{site_name[:3].upper()}-{i+1:03}", "Site": site_name, "Latitude": lat, "Longitude": lon, "Alert Level": alert_level, "Health Score": round(random.uniform(70, 100), 2), "Power Status": random.choice(['Sufficient', 'Insufficient']), "Camera Status": random.choice(['Online', 'Offline']) }) return poles # ---- Data Preparation ---- all_poles = [] for site, coords in AREA_COORDINATES.items(): all_poles.extend(generate_fixed_poles(site, *coords)) df = pd.DataFrame(all_poles) # ---- Streamlit UI ---- st.set_page_config(page_title="Localized Smart Pole View", layout="wide") st.title("📍 Smart Pole Monitoring - Specific Neighborhood Areas") site = st.selectbox("Select a site to view", list(AREA_COORDINATES.keys())) # ---- Filtered View ---- filtered_df = df[df["Site"] == site] # ---- Metrics ---- col1, col2, col3 = st.columns(3) col1.metric("Total Poles", POLES_PER_SITE) col2.metric("Red Alerts", filtered_df[filtered_df["Alert Level"] == "Red"].shape[0]) col3.metric("Offline Cameras", filtered_df[filtered_df["Camera Status"] == "Offline"].shape[0]) # ---- Map Color Mapping ---- def alert_color(alert): return { "Green": [0, 255, 0, 160], "Yellow": [255, 255, 0, 160], "Red": [255, 0, 0, 160] }[alert] filtered_df = filtered_df.copy() filtered_df["Color"] = filtered_df["Alert Level"].apply(alert_color) # ---- Map ---- st.pydeck_chart(pdk.Deck( initial_view_state=pdk.ViewState( latitude=AREA_COORDINATES[site][0], longitude=AREA_COORDINATES[site][1], zoom=15, pitch=45 ), layers=[ pdk.Layer( "ScatterplotLayer", data=filtered_df, get_position='[Longitude, Latitude]', get_color='Color', get_radius=100, pickable=True ) ], tooltip={ "html": "Pole ID: {Pole ID}
" "Health Score: {Health Score}
" "Alert Level: {Alert Level}
" "Camera: {Camera Status}
" "Power: {Power Status}", "style": {"color": "white", "backgroundColor": "black"} } )) # ---- Table View ---- st.subheader(f"📋 Pole Details in {site}") st.dataframe(filtered_df, use_container_width=True)