AppSugarcane / app.py
Esmaeilkiani's picture
Update app.py
54d9563 verified
raw
history blame
5.55 kB
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}<br>سن: {farm_age}<br>واریته: {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}).")