Spaces:
Running
Running
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 | |
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') |