import streamlit as st import ee import geemap.foliumap as geemap import pandas as pd import datetime import matplotlib.pyplot as plt import geopandas as gpd import zipfile import os import requests # اعتبار سنجی و اتصال به Google Earth Engine service_account = 'earth-engine-service-account@ee-esmaeilkiani1387.iam.gserviceaccount.com' credentials = ee.ServiceAccountCredentials(service_account, 'ee-esmaeilkiani1387-1b2c5e812a1d.json') ee.Initialize(credentials) # خواندن فایل CSV مزارع farms_data = pd.read_csv('Farm_Details_Export.csv') # تعریف ناحیه مورد مطالعه با مختصات جدید region = ee.Geometry.Polygon( [[[48.681879, 31.417603], [48.721447, 31.413209], [48.724279, 31.420826], [48.726768, 31.427418], [48.728228, 31.435694], [48.736382, 31.42837], [48.739557, 31.435657], [48.742261, 31.441772], [48.752303, 31.452243], [48.75226, 31.459784], [48.759127, 31.473657], [48.766809, 31.472413], [48.773203, 31.491188], [48.77758, 31.534579], [48.785563, 31.540797], [48.792601, 31.59696], [48.694668, 31.60756], [48.691921, 31.603466], [48.697586, 31.534067], [48.69381, 31.507727], [48.685226, 31.468496], [48.681879, 31.417603]]] ) # تابع برای دانلود و استخراج شیپ‌فایل def download_and_extract_shapefile(zip_url, extract_to='.'): zip_path = os.path.join(extract_to, 'shapefile.zip') # دانلود فایل زیپ with requests.get(zip_url, stream=True) as r: r.raise_for_status() with open(zip_path, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) # استخراج فایل زیپ with zipfile.ZipFile(zip_path, 'r') as zip_ref: zip_ref.extractall(extract_to) # یافتن فایل .shp for file in os.listdir(extract_to): if file.endswith('.shp'): return os.path.join(extract_to, file) return None # تابع برای خواندن و نمایش شیپ‌فایل def load_and_display_shapefile(shapefile_path): gdf = gpd.read_file(shapefile_path) geojson = gdf.to_json() map_ = geemap.Map(center=[31.5, 48.7], zoom=10) map_.add_geojson(geojson, layer_name="Shapefile Layer") map_.to_streamlit(height=600) # آدرس شیپ‌فایل آپلود شده در هاگینگ فیس (لینک مستقیم فایل زیپ) zip_url = 'https://huggingface.co./spaces/Esmaeilkiani/AppSugarcane/resolve/main/Dehkhodaa.rar' # دانلود و نمایش شیپ‌فایل shapefile_path = download_and_extract_shapefile(zip_url) if shapefile_path: st.write("شیپ‌فایل با موفقیت بارگذاری شد!") load_and_display_shapefile(shapefile_path) else: st.write("خطا در بارگذاری شیپ‌فایل.") # انتخاب بازه زمانی با کلیدهای یکتا start_date = st.date_input("تاریخ شروع", datetime.date(2023, 1, 1), key="start_date") end_date = st.date_input("تاریخ پایان", datetime.date(2023, 12, 31), key="end_date") # انتخاب شاخص index_option = st.selectbox("شاخص مورد نظر را انتخاب کنید:", ["NDVI", "NDMI", "NDRE"]) # انتخاب مزرعه از فایل CSV farm_name = st.sidebar.selectbox("نام مزرعه را انتخاب کنید:", farms_data['farm_name'].unique()) # پیدا کردن مختصات مزرعه انتخاب شده selected_farm = farms_data[farms_data['farm_name'] == farm_name] latitude = selected_farm['latitude'].values[0] longitude = selected_farm['longitude'].values[0] farm_age = selected_farm['age'].values[0] farm_variety = selected_farm['variety'].values[0] # دکمه برای نمایش نقشه if st.button("نمایش نقشه"): if index_option == "NDVI": index_map, vis_params = get_ndvi_map(start_date.isoformat(), end_date.isoformat()) elif index_option == "NDMI": index_map, vis_params = get_ndmi_map(start_date.isoformat(), end_date.isoformat()) else: index_map, vis_params = get_ndre_map(start_date.isoformat(), end_date.isoformat()) # ایجاد نقشه با Geemap map_ = geemap.Map(center=[latitude, longitude], zoom=14) map_.addLayer(index_map.clip(region), vis_params, index_option) map_.add_colorbar(vis_params, label=index_option) # افزودن مزرعه به نقشه map_.add_marker([latitude, longitude], popup=f"نام: {farm_name}
سن: {farm_age}
واریته: {farm_variety}") map_.add_ee_layer(region, {'color': 'FF0000'}, 'منطقه مورد مطالعه') # نمایش نقشه در Streamlit map_.to_streamlit(height=600) # محاسبه NDRE میانگین ndre_image = get_ndre_map(start_date.isoformat(), end_date.isoformat())[0] mean_ndre = ndre_image.reduceRegion(reducer=ee.Reducer.mean(), geometry=region, scale=30).get('NDRE').getInfo() # نمودار تصمیم‌گیری برای برداشت fig, ax = plt.subplots() ax.bar(['NDRE', 'مناسب برای برداشت'], [mean_ndre, 0.5], color=['green', 'orange']) ax.set_ylim(0, 1) ax.set_title(f"شاخص NDRE برای مزرعه {farm_name}") st.pyplot(fig) # نمایش وضعیت برداشت if mean_ndre > 0.5: st.write(f"مزرعه {farm_name} به حد قابل قبول برای برداشت رسیده است (NDRE = {mean_ndre:.2f}).") else: st.write(f"مزرعه {farm_name} هنوز آماده برداشت نیست (NDRE = {mean_ndre:.2f}).")