File size: 5,553 Bytes
5882ae2
 
33af4fe
5882ae2
33af4fe
5882ae2
33af4fe
 
5882ae2
33af4fe
5882ae2
33af4fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5882ae2
33af4fe
 
 
 
 
 
5882ae2
33af4fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5882ae2
33af4fe
 
 
 
 
54d9563
33af4fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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}).")