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}%")