Sanjayraju30 commited on
Commit
2d0e7f7
·
verified ·
1 Parent(s): e13d102

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +73 -125
app.py CHANGED
@@ -1,134 +1,82 @@
1
- import random
2
- import pandas as pd
3
  import streamlit as st
4
- import pydeck as pdk
 
 
 
 
5
 
6
- # ---- Area-Specific Configuration ----
7
- AREA_DETAILS = {
8
- "Hyderabad": {
9
- "coords": [17.4036, 78.5247],
10
- "area_name": "Ramanthapur Dairy Farm",
11
- "purpose": "Dairy Farm"
12
- },
13
- "Ballari": {
14
- "coords": [15.1468, 76.9237],
15
- "area_name": "Cowl Bazar Power Station",
16
- "purpose": "Power Station"
17
- },
18
- "Gadwal": {
19
- "coords": [16.2315, 77.7965],
20
- "area_name": "Bheem Nagar Solar Station",
21
- "purpose": "Solar Station"
22
- },
23
- "Kurnool": {
24
- "coords": [15.8281, 78.0373],
25
- "area_name": "Venkata Ramana Agriculture Field",
26
- "purpose": "Agriculture Monitoring"
27
- }
28
  }
29
 
30
- POLES_PER_SITE = 12
31
-
32
- # ---- Generate Poles with Anomalies ----
33
- def generate_open_area_poles(site_name, center_lat, center_lon, area, purpose):
34
- poles = []
35
- spacing = 0.0006
36
- anomalies_options = ['None', 'Sensor Fault', 'Overheat', 'Power Surge']
37
- anomaly_weights = [0.6, 0.2, 0.1, 0.1]
38
-
39
- for i in range(POLES_PER_SITE):
40
- lat = center_lat + random.uniform(-0.0002, 0.0002)
41
- lon = center_lon + (i - POLES_PER_SITE // 2) * spacing
42
- alert_level = random.choices(['Green', 'Yellow', 'Red'], weights=[6, 4, 2])[0]
43
- anomaly = random.choices(anomalies_options, weights=anomaly_weights)[0]
44
-
45
- poles.append({
46
- "Pole ID": f"{site_name[:3].upper()}-{i+1:03}",
47
- "Site": site_name,
48
- "Latitude": lat,
49
- "Longitude": lon,
50
- "Alert Level": alert_level,
51
- "Health Score": round(random.uniform(70, 100), 2),
52
- "Power Status": random.choice(['Sufficient', 'Insufficient']),
53
- "Camera Status": random.choice(['Online', 'Offline']),
54
- "Location Area": area,
55
- "Purpose": purpose,
56
- "Anomalies": anomaly
57
  })
58
- return poles
59
 
60
- # ---- Prepare Full DataFrame ----
61
- all_poles = []
62
- for site, details in AREA_DETAILS.items():
63
- poles = generate_open_area_poles(site, *details['coords'], details['area_name'], details['purpose'])
64
- all_poles.extend(poles)
65
 
66
- df = pd.DataFrame(all_poles)
67
 
68
  # ---- Streamlit UI ----
69
- st.set_page_config(page_title="Smart Pole Visual Dashboard", layout="wide")
70
- st.title("🌐 Smart Renewable Pole Monitoring Dashboard")
71
-
72
- site = st.selectbox("📍 Select a site location:", list(AREA_DETAILS.keys()))
73
- selected = AREA_DETAILS[site]
74
-
75
- # ---- Filtered View ----
76
- filtered_df = df[df["Site"] == site]
77
-
78
- # ---- Display Site Description ----
79
- st.markdown(f"### 📌 Location: **{selected['area_name']}**")
80
- st.markdown(f"🔧 **Poles Purpose**: {selected['purpose']}")
81
-
82
- # ---- KPI Metrics ----
83
- col1, col2, col3 = st.columns(3)
84
- col1.metric("Total Poles", POLES_PER_SITE)
85
- col2.metric("🔴 Red Alerts", filtered_df[filtered_df["Alert Level"] == "Red"].shape[0])
86
- col3.metric("📷 Offline Cameras", filtered_df[filtered_df["Camera Status"] == "Offline"].shape[0])
87
-
88
- # ---- Alert Level to Color ----
89
- def alert_color(alert):
90
- return {
91
- "Green": [0, 255, 0, 160],
92
- "Yellow": [255, 255, 0, 160],
93
- "Red": [255, 0, 0, 160]
94
- }[alert]
95
-
96
- filtered_df = filtered_df.copy()
97
- filtered_df["Color"] = filtered_df["Alert Level"].apply(alert_color)
98
-
99
- # ---- Map Visualization ----
100
- st.subheader("🗺️ Pole Location & Health Status")
101
- st.pydeck_chart(pdk.Deck(
102
- initial_view_state=pdk.ViewState(
103
- latitude=selected['coords'][0],
104
- longitude=selected['coords'][1],
105
- zoom=16.5,
106
- pitch=45
107
- ),
108
- layers=[
109
- pdk.Layer(
110
- "ScatterplotLayer",
111
- data=filtered_df,
112
- get_position='[Longitude, Latitude]',
113
- get_color='Color',
114
- get_radius=30,
115
- pickable=True
116
- )
117
- ],
118
- tooltip={
119
- "html": "<b>Pole ID:</b> {Pole ID}<br/>"
120
- "<b>Location:</b> {Location Area}<br/>"
121
- "<b>Purpose:</b> {Purpose}<br/>"
122
- "<b>Health Score:</b> {Health Score}<br/>"
123
- "<b>Alert Level:</b> {Alert Level}<br/>"
124
- "<b>Camera:</b> {Camera Status}<br/>"
125
- "<b>Power:</b> {Power Status}<br/>"
126
- "<b>Anomaly:</b> {Anomalies}",
127
- "style": {"color": "white", "backgroundColor": "black"}
128
- }
129
- ))
130
-
131
- # ---- Data Table ----
132
- st.subheader("📋 Detailed Pole Information")
133
- st.dataframe(filtered_df, use_container_width=True)
134
-
 
 
 
1
  import streamlit as st
2
+ import pandas as pd
3
+ import folium
4
+ from streamlit_folium import st_folium
5
+ from folium.plugins import HeatMap
6
+ import random
7
 
8
+ # ---- Simulated Smart Pole Data ----
9
+ AREAS = {
10
+ "Hyderabad": [17.4036, 78.5247],
11
+ "Ballari": [15.1468, 76.9237],
12
+ "Kurnool": [15.8281, 78.0373],
13
+ "Gadwal": [16.2315, 77.7965]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  }
15
 
16
+ def generate_poles(site, lat, lon, count=12):
17
+ data = []
18
+ for i in range(count):
19
+ lat_offset = random.uniform(-0.002, 0.002)
20
+ lon_offset = random.uniform(-0.002, 0.002)
21
+ energy = round(random.uniform(20, 100), 2)
22
+ wind = round(random.uniform(0, 20), 2)
23
+ sensor = round(random.uniform(0, 1), 2)
24
+ alert = random.choice(["Normal", "Alert"])
25
+ data.append({
26
+ "Site": site,
27
+ "Pole ID": f"{site[:3].upper()}-{i+1:03}",
28
+ "Latitude": lat + lat_offset,
29
+ "Longitude": lon + lon_offset,
30
+ "Energy": energy,
31
+ "Wind": wind,
32
+ "Sensor": sensor,
33
+ "Alert": alert
 
 
 
 
 
 
 
 
 
34
  })
35
+ return data
36
 
37
+ # Generate full dataset
38
+ poles_data = []
39
+ for area, coords in AREAS.items():
40
+ poles_data.extend(generate_poles(area, coords[0], coords[1]))
 
41
 
42
+ df = pd.DataFrame(poles_data)
43
 
44
  # ---- Streamlit UI ----
45
+ st.set_page_config(layout="wide")
46
+ st.title("🌐 Hugging Face Compatible Solar Pole Heatmap")
47
+
48
+ # ---- Create Folium Map with Esri Satellite ----
49
+ center = [16.5, 77.5]
50
+ m = folium.Map(location=center, zoom_start=7,
51
+ tiles='https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
52
+ attr='Esri Satellite')
53
+
54
+ # ---- Add HeatMap layer for energy ----
55
+ heat_data = [[row["Latitude"], row["Longitude"], row["Energy"]] for _, row in df.iterrows()]
56
+ HeatMap(heat_data, radius=15).add_to(m)
57
+
58
+ # ---- Add Pole Markers with Alerts ----
59
+ for _, row in df.iterrows():
60
+ popup_html = f"""
61
+ <b>Pole ID:</b> {row['Pole ID']}<br/>
62
+ <b>Site:</b> {row['Site']}<br/>
63
+ <b>Energy:</b> {row['Energy']}<br/>
64
+ <b>Wind:</b> {row['Wind']}<br/>
65
+ <b>Sensor:</b> {row['Sensor']}<br/>
66
+ <b>Status:</b> {row['Alert']}
67
+ """
68
+
69
+ icon = folium.Icon(color="red" if row["Alert"] == "Alert" else "green", icon="info-sign")
70
+ folium.Marker(
71
+ location=[row["Latitude"], row["Longitude"]],
72
+ popup=popup_html,
73
+ icon=icon
74
+ ).add_to(m)
75
+
76
+ # ---- Display Map ----
77
+ st.subheader("🗺️ Smart Pole Satellite Heatmap")
78
+ st_data = st_folium(m, width=1200, height=600)
79
+
80
+ # ---- Optional: Table view
81
+ with st.expander("📋 Show Pole Data Table"):
82
+ st.dataframe(df)