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()