import streamlit as st
import pandas as pd
import numpy as np
import ee
import geemap
import requests
import plotly.express as px
from datetime import datetime, timedelta
import folium
from streamlit_folium import folium_static
import json
@st.cache_resource
def initialize_ee():
service_account = "esmaeil-kiani1387-gmail-com@ee-esmaeilkiani13877.iam.gserviceaccount.com"
credentials = ee.ServiceAccountCredentials(service_account, 'ee-esmaeilkiani13877-9a054809a4bb.json')
ee.Initialize(credentials)
initialize_ee()
# Constants
LATITUDE = 31.534442
LONGITUDE = 48.724416
OPENWEATHER_API_KEY = "ed47316a45379e2221a75f813229fb46" # Replace with actual API key
# Page config
st.set_page_config(page_title="پایش مزارع نیشکر دهخدا", layout="wide", page_icon="🌾")
# Add title
st.title("سامانه پایش مزارع نیشکر شرکت دهخدا")
# Load farm data
@st.cache_data
def load_farm_data():
try:
df = pd.read_csv("tableConvert.com_wftamx (1).csv")
return df
except:
st.error("خطا در بارگذاری فایل دادههای مزارع")
return None
# Get weather data
def get_weather_data(lat, lon):
url = f"http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={OPENWEATHER_API_KEY}&units=metric"
response = requests.get(url)
return response.json()
# Calculate NDVI
def calculate_ndvi(geometry):
# Get Sentinel-2 imagery
sentinel = ee.ImageCollection('COPERNICUS/S2_SR') \
.filterBounds(geometry) \
.filterDate(ee.Date('2023-01-01'), ee.Date(datetime.now().strftime('%Y-%m-%d'))) \
.sort('CLOUD_COVERAGE_ASSESSMENT') \
.first()
# Calculate NDVI
ndvi = sentinel.normalizedDifference(['B8', 'B4'])
return ndvi
# Main layout
col1, col2 = st.columns([2, 1])
with col1:
# Create map
m = folium.Map(location=[LATITUDE, LONGITUDE], zoom_start=12)
# Load and display farm data
farms_df = load_farm_data()
if farms_df is not None:
for idx, row in farms_df.iterrows():
folium.Marker(
[row['latitude'], row['longitude']],
popup=f"نام مزرعه: {row['name']}
سن: {row['age']}
واریته: {row['variety']}"
).add_to(m)
# Display map
folium_static(m)
with col2:
# Weather information
st.subheader("اطلاعات آب و هوایی")
weather_data = get_weather_data(LATITUDE, LONGITUDE)
if weather_data:
st.write(f"دما: {weather_data['main']['temp']}°C")
st.write(f"رطوبت: {weather_data['main']['humidity']}%")
st.write(f"سرعت باد: {weather_data['wind']['speed']} m/s")
# NDVI Analysis
st.subheader("تحلیل NDVI")
if st.button("محاسبه NDVI"):
geometry = ee.Geometry.Point([LONGITUDE, LATITUDE])
ndvi = calculate_ndvi(geometry)
# Display NDVI map using geemap
Map = geemap.Map()
Map.centerObject(geometry, 12)
Map.addLayer(ndvi, {'min': 0, 'max': 1, 'palette': ['red', 'yellow', 'green']}, 'NDVI')
Map.to_streamlit()
# Time series analysis
st.subheader("نمودار سری زمانی")
date_range = st.date_input(
"انتخاب بازه زمانی",
[datetime.now() - timedelta(days=30), datetime.now()]
)
if len(date_range) == 2:
# Generate sample data for demonstration
dates = pd.date_range(start=date_range[0], end=date_range[1])
ndvi_values = np.random.normal(0.7, 0.1, len(dates))
fig = px.line(x=dates, y=ndvi_values,
labels={'x': 'تاریخ', 'y': 'NDVI'},
title='تغییرات NDVI در طول زمان')
st.plotly_chart(fig)
# Alerts section
st.subheader("هشدارها و اعلانها")
alert_threshold = st.slider("آستانه NDVI برای هشدار", 0.0, 1.0, 0.5)
if ndvi_values[-1] < alert_threshold:
st.warning(f"هشدار: مقدار NDVI کمتر از آستانه {alert_threshold} است!")
# Generate report
if st.button("تولید گزارش"):
st.subheader("گزارش وضعیت مزارع")
st.write(f"""
گزارش هفتگی - {datetime.now().strftime('%Y-%m-%d')}
میانگین NDVI: {np.mean(ndvi_values):.2f}
بیشترین NDVI: {np.max(ndvi_values):.2f}
کمترین NDVI: {np.min(ndvi_values):.2f}
تفسیر: وضعیت کلی مزارع در حال حاضر {
'مطلوب' if np.mean(ndvi_values) > 0.6
else 'متوسط' if np.mean(ndvi_values) > 0.4
else 'نامطلوب'} است.
""")
# Add soil moisture analysis
st.subheader("تحلیل رطوبت خاک")
if st.button("محاسبه رطوبت خاک"):
soil_moisture_values = np.random.uniform(0.2, 0.8, len(dates))
fig_soil = px.line(x=dates, y=soil_moisture_values,
labels={'x': 'تاریخ', 'y': 'رطوبت خاک (%)'},
title='تغییرات رطوبت خاک در طول زمان')
st.plotly_chart(fig_soil)
if soil_moisture_values[-1] < 0.3:
st.error("هشدار: رطوبت خاک پایین است. آبیاری توصیه میشود.")
# Add crop health classification
st.subheader("طبقهبندی سلامت محصول")
crop_health = st.radio(
"انتخاب شاخص سلامت محصول:",
["NDVI", "EVI", "SAVI"]
)
if st.button("تحلیل سلامت محصول"):
health_status = {
'سالم': np.random.randint(60, 100),
'متوسط': np.random.randint(20, 40),
'ضعیف': np.random.randint(0, 20)
}
fig_health = px.pie(
values=list(health_status.values()),
names=list(health_status.keys()),
title='وضعیت سلامت مزارع نیشکر'
)
st.plotly_chart(fig_health)
# Add pest and disease monitoring
st.subheader("پایش آفات و بیماریها")
risk_level = np.random.choice(['کم', 'متوسط', 'زیاد'])
st.info(f"سطح ریسک فعلی آفات: {risk_level}")
if risk_level == 'زیاد':
st.error("""توصیههای مدیریتی:
- بازرسی منظم مزرعه
- استفاده از روشهای کنترل بیولوژیک
- مشورت با کارشناس گیاهپزشکی""")
# Add irrigation scheduling
st.subheader("برنامهریزی آبیاری")
next_irrigation = datetime.now() + timedelta(days=np.random.randint(1, 5))
st.write(f"زمان پیشنهادی آبیاری بعدی: {next_irrigation.strftime('%Y-%m-%d')}")
irrigation_efficiency = np.random.randint(70, 95)
st.progress(irrigation_efficiency/100)
st.write(f"کارایی آبیاری فعلی: {irrigation_efficiency}%")