Esmaeilkiani's picture
Update app.py
65c5f3f verified
Raw History Blame
4.68 kB
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("مختصات مزرعه نماینده یافت نشد.")