Sugarcane / app.py
Esmaeilkianii's picture
Update app.py
d6c077d verified
raw
history blame
5.33 kB
import streamlit as st
import pandas as pd
import plotly.express as px
import folium
from streamlit_folium import folium_static
import ee
import datetime
import os
# Set up Google Earth Engine
service_account = 'dehkhodamap-e9f0da4ce9f6514021@ee-esmaeilkiani13877.iam.gserviceaccount.com'
credentials = ee.ServiceAccountCredentials(service_account, 'ee-esmaeilkiani13877-cfdea6eaf411.json')
ee.Initialize(credentials)
# Load farm data
@st.cache_data
def load_farm_data():
return pd.read_csv('farm_coordinates.csv')
farms = load_farm_data()
# Streamlit app
st.title('Sugarcane Farm Dashboard')
# Sidebar
st.sidebar.title('Navigation')
page = st.sidebar.radio('Go to', ['Map', 'Comparative Charts', 'Weekly Reports'])
if page == 'Map':
st.header('Sugarcane Farm Map')
# Create map
m = folium.Map(location=[farms['latitude'].mean(), farms['longitude'].mean()], zoom_start=10)
# Add markers for each farm
for idx, row in farms.iterrows():
folium.Marker(
location=[row['latitude'], row['longitude']],
popup=f"Farm: {row['name']}, Age: {row['age']}, Variety: {row['variety']}",
icon=folium.Icon(color='green', icon='leaf')
).add_to(m)
# Display map
folium_static(m)
# Farm search
search_farm = st.text_input('Search for a farm:')
if search_farm:
farm = farms[farms['name'].str.contains(search_farm, case=False)]
if not farm.empty:
st.write(f"Farm found: {farm['name'].values[0]}")
st.map(farm)
else:
st.write("Farm not found.")
elif page == 'Comparative Charts':
st.header('Comparative Charts')
# Function to get NDVI data
def get_ndvi_data(geometry, start_date, end_date):
collection = ee.ImageCollection('COPERNICUS/S2_SR') \
.filterBounds(geometry) \
.filterDate(start_date, end_date) \
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
def addNDVI(image):
ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI')
return image.addBands(ndvi)
ndvi_collection = collection.map(addNDVI)
ndvi_values = ndvi_collection.select('NDVI').mean().reduceRegion(
reducer=ee.Reducer.mean(),
geometry=geometry,
scale=10
).get('NDVI')
return ndvi_values.getInfo()
# Function to get LAI data
def get_lai_data(geometry, start_date, end_date):
collection = ee.ImageCollection('MODIS/006/MOD15A2H') \
.filterBounds(geometry) \
.filterDate(start_date, end_date)
lai_values = collection.select('Lai_500m').mean().reduceRegion(
reducer=ee.Reducer.mean(),
geometry=geometry,
scale=500
).get('Lai_500m')
return lai_values.getInfo()
# Date range selection
start_date = st.date_input('Start date', datetime.date(2023, 1, 1))
end_date = st.date_input('End date', datetime.date.today())
if start_date < end_date:
# Get NDVI and LAI data for each farm
ndvi_data = []
lai_data = []
for idx, row in farms.iterrows():
geometry = ee.Geometry.Point([row['longitude'], row['latitude']])
ndvi = get_ndvi_data(geometry, start_date.isoformat(), end_date.isoformat())
lai = get_lai_data(geometry, start_date.isoformat(), end_date.isoformat())
ndvi_data.append({'Farm': row['name'], 'NDVI': ndvi})
lai_data.append({'Farm': row['name'], 'LAI': lai})
ndvi_df = pd.DataFrame(ndvi_data)
lai_df = pd.DataFrame(lai_data)
# NDVI chart
fig_ndvi = px.bar(ndvi_df, x='Farm', y='NDVI', title='NDVI Comparison')
st.plotly_chart(fig_ndvi)
# LAI chart
fig_lai = px.bar(lai_df, x='Farm', y='LAI', title='LAI Comparison')
st.plotly_chart(fig_lai)
else:
st.error('Error: End date must fall after start date.')
elif page == 'Weekly Reports':
st.header('Weekly Reports')
# Farm selection
selected_farm = st.selectbox('Select a farm:', farms['name'])
# Week selection
week = st.slider('Select week:', 1, 52, 1)
# Simulate weekly data (replace this with actual data processing)
def get_weekly_data(farm, week):
return {
'NDVI': 0.5 + 0.1 * week, # Simulated increasing NDVI
'LAI': 2 + 0.2 * week, # Simulated increasing LAI
}
data = get_weekly_data(selected_farm, week)
# Display weekly report
st.subheader(f'Weekly Report for {selected_farm} - Week {week}')
col1, col2 = st.columns(2)
with col1:
st.metric(label="NDVI 🌱", value=f"{data['NDVI']:.2f}")
with col2:
st.metric(label="LAI 🌡", value=f"{data['LAI']:.2f}")
# Trend chart
weeks = list(range(1, week + 1))
trend_data = [get_weekly_data(selected_farm, w) for w in weeks]
trend_df = pd.DataFrame(trend_data)
trend_df['Week'] = weeks
fig = px.line(trend_df, x='Week', y=['NDVI', 'LAI'], title=f'Trend for {selected_farm}')
st.plotly_chart(fig)
# Footer
st.sidebar.markdown('---')
st.sidebar.text('Dashboard created with Streamlit')