Spaces:
Sleeping
Sleeping
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 | |
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 | |
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']}<br>سن: {row['age']}<br>واریته: {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}%") |