Esmaeilkiani's picture
Update app.py
ddd1a18 verified
import streamlit as st
import pandas as pd
import geopandas as gpd
import ee
import geemap
import folium
from streamlit_folium import folium_static
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta
# Initialize Earth Engine
service_account = 'esmaeil-kiani1387-gmail-com@ee-esmaeilkiani13877.iam.gserviceaccount.com'
credentials = ee.ServiceAccountCredentials(service_account, 'ee-esmaeilkiani13877-9a054809a4bb.json')
ee.Initialize(credentials)
# Load farm data
@st.cache_data
def load_data():
df = pd.read_csv('tableConvert.com_wftamx (1).csv')
return df
# Calculate vegetation indices
def calculate_indices(image):
ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI')
evi2 = image.expression(
'2.5 * ((NIR - RED) / (NIR + 2.4 * RED + 1))',
{'NIR': image.select('B8'), 'RED': image.select('B4')}
).rename('EVI2')
lai = image.expression(
'3.618 * EVI - 0.118',
{'EVI': image.select('EVI2')}
).rename('LAI')
return image.addBands([ndvi, evi2, lai])
# Get Sentinel-2 imagery
def get_sentinel_imagery(geometry, start_date, end_date):
return (ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(geometry)
.filterDate(start_date, end_date)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.map(calculate_indices)
.median())
# Main app
def main():
st.title('Sugarcane Farm Analysis')
# Load data
df = load_data()
# Sidebar
st.sidebar.title('Farm Selection')
selected_farm = st.sidebar.selectbox('Select a farm', df['name'])
# Main content
col1, col2 = st.columns([1, 2])
with col1:
st.subheader('Farm Information')
farm_data = df[df['name'] == selected_farm].iloc[0]
st.write(f"Age: {farm_data['age']}")
st.write(f"Variety: {farm_data['variety']}")
with col2:
st.subheader('Farm Location')
m = folium.Map(location=[farm_data['latitude'], farm_data['longitude']], zoom_start=12)
folium.Marker(
[farm_data['latitude'], farm_data['longitude']],
popup=farm_data['name']
).add_to(m)
folium_static(m)
# Vegetation indices analysis
st.subheader('Vegetation Indices Analysis')
# Date range selection
today = datetime.now()
start_date = st.date_input('Start date', today - timedelta(days=30))
end_date = st.date_input('End date', today)
if start_date and end_date:
geometry = ee.Geometry.Point([farm_data['longitude'], farm_data['latitude']])
image = get_sentinel_imagery(geometry, start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d'))
# Display NDVI map
ndvi_map = geemap.Map(center=[farm_data['latitude'], farm_data['longitude']], zoom=14)
ndvi_map.add_layer(image.select('NDVI'), {'min': 0, 'max': 1, 'palette': ['red', 'yellow', 'green']}, 'NDVI')
ndvi_map.add_child(folium.LayerControl())
folium_static(ndvi_map)
# Plot time series of indices
indices = ['NDVI', 'EVI2', 'LAI']
fig, ax = plt.subplots(figsize=(10, 6))
for index in indices:
values = image.select(index).reduceRegion(
reducer=ee.Reducer.mean(),
geometry=geometry,
scale=10
).getInfo()[index]
ax.plot([start_date, end_date], [values, values], label=index)
ax.set_xlabel('Date')
ax.set_ylabel('Index Value')
ax.legend()
st.pyplot(fig)
if __name__ == '__main__':
main()