import streamlit as st import pandas as pd import folium from streamlit_folium import st_folium import ee import geemap.foliumap as geemap # احراز هویت GEE با فایل json SERVICE_ACCOUNT = 'dehkhodamap-e9f0da4ce9f6514021@ee-esmaeilkiani13877.iam.gserviceaccount.com' KEY_PATH = 'ee-esmaeilkiani13877-cfdea6eaf411 (3).json' ee.Initialize(ee.ServiceAccountCredentials(SERVICE_ACCOUNT, KEY_PATH)) st.set_page_config(page_title="داشبورد مزارع نماینده", layout="wide") st.title("📡 داشبورد پایش مزارع نماینده نیشکر دهخدا") # خواندن فایل‌ها df_links = pd.read_csv("مزارع نماینده راتون.csv", encoding='utf-8-sig') df_coords = pd.read_csv("مختصات و مشخصات کامل مزارع (4).csv", encoding='utf-8-sig') df_links.columns = df_links.columns.str.strip() df_coords.columns = df_coords.columns.str.strip() df_coords = df_coords.dropna(subset=["طول جغرافیایی", "عرض جغرافیایی"]) # انتخاب مزرعه نماینده representatives = df_links["مزرعه نماینده"].dropna().unique() selected_rep = st.selectbox("🔍 انتخاب مزرعه نماینده:", sorted(representatives), index=0) if selected_rep: subset_df = df_links[df_links["مزرعه نماینده"] == selected_rep] sub_farms = subset_df["زیر مجموعه"].dropna().tolist() rep_coords = df_coords[df_coords["مزرعه"] == selected_rep] if not rep_coords.empty: rep_lat = rep_coords["عرض جغرافیایی"].values[0] rep_lon = rep_coords["طول جغرافیایی"].values[0] m = folium.Map( location=[rep_lat, rep_lon], zoom_start=14, tiles="https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}", attr="Google Satellite" ) folium.Marker( location=[rep_lat, rep_lon], tooltip=f"🌟 مزرعه نماینده: {selected_rep}", icon=folium.Icon(color='blue', icon='star') ).add_to(m) # نمایش زیرمزارعه‌ها روی نقشه for i, row in subset_df.iterrows(): farm = row["زیر مجموعه"] coords = df_coords[df_coords["مزرعه"] == farm] if not coords.empty: lat = coords["عرض جغرافیایی"].values[0] lon = coords["طول جغرافیایی"].values[0] folium.CircleMarker( location=[lat, lon], radius=8, color="red", fill=True, fill_color="yellow", fill_opacity=0.8, tooltip=f"{farm} - سن: {row['سن']}، واریته: {row['واریته']}" ).add_to(m) st_folium(m, width=1000, height=600) # نمایش جدول اطلاعات زیرمزارعه‌ها st.subheader("📋 اطلاعات زیرمزارعه‌ها") st.dataframe(subset_df[["زیر مجموعه", "سن", "واریته", "تهیه قلمه", "مساحت کلی"]]) # نمودار NDVI برای هر زیرمزرعه st.subheader("📈 نمودار سری زمانی NDVI (S2)") for farm in sub_farms: coords = df_coords[df_coords["مزرعه"] == farm] if not coords.empty: lat = coords["عرض جغرافیایی"].values[0] lon = coords["طول جغرافیایی"].values[0] point = ee.Geometry.Point(float(lon), float(lat)) collection = ee.ImageCollection('COPERNICUS/S2_SR') \ .filterBounds(point) \ .filterDate('2024-01-01', '2024-12-31') \ .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)) \ .map(lambda img: img.addBands(img.normalizedDifference(['B8', 'B4']).rename('NDVI'))) ndvi_ts = collection.select('NDVI').getRegion(point, 30).getInfo() if len(ndvi_ts) > 1: df_ndvi = pd.DataFrame(ndvi_ts[1:], columns=ndvi_ts[0]) df_ndvi["datetime"] = pd.to_datetime(df_ndvi["time"], unit='ms') df_ndvi = df_ndvi[["datetime", "NDVI"]].dropna() st.line_chart(df_ndvi.set_index("datetime")["NDVI"], height=200, use_container_width=True) st.markdown(f"📍 **{farm}**") else: st.warning(f"📍 داده‌ای برای NDVI مزرعه {farm} پیدا نشد.") else: st.warning("مختصات مزرعه نماینده یافت نشد.")