Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -22,12 +22,16 @@ region = ee.Geometry.Polygon(
|
|
| 22 |
[48.685226, 31.468496], [48.681879, 31.417603]]]
|
| 23 |
)
|
| 24 |
|
| 25 |
-
# تعریف پالتهای رنگی برای
|
| 26 |
palettes = {
|
| 27 |
-
'NDVI':
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
}
|
| 32 |
|
| 33 |
# توابع برای هر شاخص
|
|
@@ -35,20 +39,22 @@ def get_index_map(index, start_date, end_date):
|
|
| 35 |
s2 = ee.ImageCollection('COPERNICUS/S2').filterBounds(region).filterDate(start_date, end_date)
|
| 36 |
if index == "NDVI":
|
| 37 |
image = s2.map(lambda image: image.normalizedDifference(['B8', 'B4']).rename('NDVI')).median()
|
| 38 |
-
|
| 39 |
-
image = s2.map(lambda image: image.expression('2.5 * ((B8 - B4) / (B8 + 6 * B4 - 7.5 * B2 + 1))', {
|
| 40 |
-
'B8': image.select('B8'), 'B4': image.select('B4'), 'B2': image.select('B2')
|
| 41 |
-
}).rename('EVI')).median()
|
| 42 |
-
elif index == "SAVI":
|
| 43 |
-
image = s2.map(lambda image: image.expression('(1 + 0.5) * ((B8 - B4) / (B8 + B4 + 0.5))', {
|
| 44 |
-
'B8': image.select('B8'), 'B4': image.select('B4')
|
| 45 |
-
}).rename('SAVI')).median()
|
| 46 |
elif index == "NDMI":
|
| 47 |
image = s2.map(lambda image: image.normalizedDifference(['B8', 'B11']).rename('NDMI')).median()
|
| 48 |
-
|
| 49 |
-
vis_params = {'min': -1, 'max': 1, 'palette': palettes[index]}
|
| 50 |
return image, vis_params
|
| 51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
# ساخت برنامه Streamlit
|
| 53 |
st.title("نقشه شاخصهای کشاورزی برای مزارع شرکت دهخدا")
|
| 54 |
|
|
@@ -57,7 +63,7 @@ start_date = st.date_input("تاریخ شروع", datetime.date(2023, 1, 1))
|
|
| 57 |
end_date = st.date_input("تاریخ پایان", datetime.date(2023, 12, 31))
|
| 58 |
|
| 59 |
# انتخاب شاخص
|
| 60 |
-
index_option = st.selectbox("شاخص مورد نظر را انتخاب کنید:", ["NDVI", "
|
| 61 |
|
| 62 |
# انتخاب مزرعه از فایل CSV
|
| 63 |
farm_name = st.sidebar.selectbox("نام مزرعه را انتخاب کنید:", farms_data['farm_name'].unique())
|
|
@@ -89,3 +95,17 @@ if st.button("نمایش نقشه"):
|
|
| 89 |
|
| 90 |
# امکان دانلود نقشه
|
| 91 |
st.download_button(label="دانلود نقشه", data=map_.to_image(), file_name="map.png", mime="image/png")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
[48.685226, 31.468496], [48.681879, 31.417603]]]
|
| 23 |
)
|
| 24 |
|
| 25 |
+
# تعریف پالتهای رنگی برای شاخصها
|
| 26 |
palettes = {
|
| 27 |
+
'NDVI': {
|
| 28 |
+
'min': -0.2, 'max': 0.8,
|
| 29 |
+
'palette': ['#0000FF', '#8A2BE2', '#FFFF00', '#00FF00', '#008000', '#006400']
|
| 30 |
+
},
|
| 31 |
+
'NDMI': {
|
| 32 |
+
'min': -0.1, 'max': 0.5,
|
| 33 |
+
'palette': ['#FF0000', '#FFA500', '#FFFF00', '#008000', '#0000FF']
|
| 34 |
+
}
|
| 35 |
}
|
| 36 |
|
| 37 |
# توابع برای هر شاخص
|
|
|
|
| 39 |
s2 = ee.ImageCollection('COPERNICUS/S2').filterBounds(region).filterDate(start_date, end_date)
|
| 40 |
if index == "NDVI":
|
| 41 |
image = s2.map(lambda image: image.normalizedDifference(['B8', 'B4']).rename('NDVI')).median()
|
| 42 |
+
vis_params = palettes['NDVI']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
elif index == "NDMI":
|
| 44 |
image = s2.map(lambda image: image.normalizedDifference(['B8', 'B11']).rename('NDMI')).median()
|
| 45 |
+
vis_params = palettes['NDMI']
|
|
|
|
| 46 |
return image, vis_params
|
| 47 |
|
| 48 |
+
# توابع برای دریافت دادههای باد از Google Earth Engine
|
| 49 |
+
def get_wind_data():
|
| 50 |
+
# استفاده از مجموعه داده ERA5 برای دریافت سرعت و جهت باد
|
| 51 |
+
era5 = ee.ImageCollection('ECMWF/ERA5_LAND/HOURLY').select(['u10', 'v10']).filterDate('2023-01-01', '2023-12-31').mean()
|
| 52 |
+
u10 = era5.select('u10').reduceRegion(ee.Reducer.mean(), region, scale=1000).getInfo()
|
| 53 |
+
v10 = era5.select('v10').reduceRegion(ee.Reducer.mean(), region, scale=1000).getInfo()
|
| 54 |
+
wind_speed = (u10['u10'] ** 2 + v10['v10'] ** 2) ** 0.5 # محاسبه سرعت باد
|
| 55 |
+
wind_direction = (180 / 3.14159) * ee.Number(ee.Image(u10['u10']).atan2(ee.Image(v10['v10']))).getInfo() # محاسبه جهت باد
|
| 56 |
+
return wind_speed, wind_direction
|
| 57 |
+
|
| 58 |
# ساخت برنامه Streamlit
|
| 59 |
st.title("نقشه شاخصهای کشاورزی برای مزارع شرکت دهخدا")
|
| 60 |
|
|
|
|
| 63 |
end_date = st.date_input("تاریخ پایان", datetime.date(2023, 12, 31))
|
| 64 |
|
| 65 |
# انتخاب شاخص
|
| 66 |
+
index_option = st.selectbox("شاخص مورد نظر را انتخاب کنید:", ["NDVI", "NDMI"])
|
| 67 |
|
| 68 |
# انتخاب مزرعه از فایل CSV
|
| 69 |
farm_name = st.sidebar.selectbox("نام مزرعه را انتخاب کنید:", farms_data['farm_name'].unique())
|
|
|
|
| 95 |
|
| 96 |
# امکان دانلود نقشه
|
| 97 |
st.download_button(label="دانلود نقشه", data=map_.to_image(), file_name="map.png", mime="image/png")
|
| 98 |
+
|
| 99 |
+
# نمایش سرعت و جهت باد در پنل کناری
|
| 100 |
+
st.sidebar.header("اطلاعات باد")
|
| 101 |
+
wind_speed, wind_direction = get_wind_data()
|
| 102 |
+
st.sidebar.write(f"سرعت باد: {wind_speed:.2f} متر بر ثانیه")
|
| 103 |
+
st.sidebar.write(f"جهت باد: {wind_direction:.2f} درجه")
|
| 104 |
+
|
| 105 |
+
# نمایش قطبنما برای جهت باد
|
| 106 |
+
compass_html = f"""
|
| 107 |
+
<div style='width: 100px; height: 100px; border-radius: 50%; background: conic-gradient(red {wind_direction}deg, lightgray 0);'>
|
| 108 |
+
<div style='transform: rotate({wind_direction}deg); color: white; font-size: 20px; text-align: center; position: relative; top: 35px; font-weight: bold;'>⬆</div>
|
| 109 |
+
</div>
|
| 110 |
+
"""
|
| 111 |
+
st.sidebar.markdown(compass_html, unsafe_allow_html=True)
|