Spaces:
Configuration error
Configuration error
Update app.py
Browse files
app.py
CHANGED
@@ -1,277 +1,130 @@
|
|
1 |
-
import streamlit as st
|
2 |
import ee
|
|
|
3 |
import folium
|
4 |
-
from folium import plugins
|
5 |
import pandas as pd
|
6 |
-
import numpy as np
|
7 |
-
import matplotlib.pyplot as plt
|
8 |
import requests
|
9 |
-
from
|
10 |
-
|
11 |
-
# تنظیمات اولیه Streamlit
|
12 |
-
st.set_page_config(page_title="مانیتورینگ مزارع نیشکر", page_icon="🌱", layout="wide")
|
13 |
-
|
14 |
-
# احراز هویت Google Earth Engine
|
15 |
-
def authenticate_gee():
|
16 |
-
try:
|
17 |
-
service_account = 'dehkhodamap-e9f0da4ce9f6514021@ee-esmaeilkiani13877.iam.gserviceaccount.com'
|
18 |
-
credentials = ee.ServiceAccountCredentials(service_account, 'ee-esmaeilkiani13877-cfdea6eaf411.json')
|
19 |
-
ee.Initialize(credentials)
|
20 |
-
st.success("اتصال به Google Earth Engine با موفقیت انجام شد.")
|
21 |
-
except Exception as e:
|
22 |
-
st.error(f"خطا در اتصال به Google Earth Engine: {str(e)}")
|
23 |
-
|
24 |
-
# بارگذاری دادههای مزرعه از CSV
|
25 |
-
@st.cache_data
|
26 |
-
def load_farm_data():
|
27 |
-
try:
|
28 |
-
data = pd.read_csv('farm_coordinates.csv')
|
29 |
-
if len(data) == 0:
|
30 |
-
st.warning("فایل farm_coordinates.csv خالی است.")
|
31 |
-
return data
|
32 |
-
except Exception as e:
|
33 |
-
st.error(f"خطا در بارگذاری فایل farm_coordinates.csv: {str(e)}")
|
34 |
-
return pd.DataFrame()
|
35 |
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
if len(data) == 0:
|
41 |
-
st.warning("فایل پایگاه داده (1).csv خالی است.")
|
42 |
-
return data
|
43 |
-
except Exception as e:
|
44 |
-
st.error(f"خطا در بارگذاری فایل پایگاه داده (1).csv: {str(e)}")
|
45 |
-
return pd.DataFrame()
|
46 |
|
47 |
# جمعآوری دادهها از Google Earth Engine
|
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 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
return None
|
166 |
-
except Exception as e:
|
167 |
-
st.error(f"خطا در دریافت دادههای آب و هوا: {str(e)}")
|
168 |
-
return None
|
169 |
-
|
170 |
-
# تولید گزارش هفتگی
|
171 |
-
def generate_weekly_report(farm_name, gee_data, weather_data):
|
172 |
-
try:
|
173 |
-
report = f"گزارش هفتگی برای مزرعه {farm_name}:\n\n"
|
174 |
-
|
175 |
-
# اضافه کردن اطلاعات NDVI
|
176 |
-
ndvi_mean = gee_data.select('NDVI').mean().getInfo()
|
177 |
-
report += f"میانگین NDVI: {ndvi_mean:.2f}\n"
|
178 |
-
|
179 |
-
# اضافه کردن اطلاعات آب و هوا
|
180 |
-
if weather_data and 'main' in weather_data:
|
181 |
-
temp = weather_data['main'].get('temp', 'N/A')
|
182 |
-
humidity = weather_data['main'].get('humidity', 'N/A')
|
183 |
-
report += f"دمای فعلی: {temp}°C\n"
|
184 |
-
report += f"رطوبت فعلی: {humidity}%\n"
|
185 |
-
|
186 |
-
return report
|
187 |
-
except Exception as e:
|
188 |
-
st.error(f"خطا در تولید گزارش هفتگی: {str(e)}")
|
189 |
-
return "گزارش در دسترس نیست."
|
190 |
-
|
191 |
-
# تابع اصلی
|
192 |
-
def main():
|
193 |
-
st.title("🌱 مانیتورینگ مزارع نیشکر")
|
194 |
-
|
195 |
-
# احراز هویت GEE
|
196 |
-
authenticate_gee()
|
197 |
-
|
198 |
-
# بارگذاری دادهها
|
199 |
-
farm_data = load_farm_data()
|
200 |
-
daily_farm_data = load_daily_farm_data()
|
201 |
-
|
202 |
-
if len(farm_data) == 0 or len(daily_farm_data) == 0:
|
203 |
-
st.warning("دادههای مزرعه در دسترس نیست. لطفاً فایلهای CSV را بررسی کنید.")
|
204 |
-
return
|
205 |
-
|
206 |
-
# نوار کناری برای ورودی کاربر
|
207 |
-
st.sidebar.header("تنظیمات")
|
208 |
-
if 'name' in farm_data.columns:
|
209 |
-
selected_farm = st.sidebar.selectbox("انتخاب مزرعه", farm_data['name'].unique().tolist())
|
210 |
-
else:
|
211 |
-
st.warning("ستون 'name' در دادههای مزرعه یافت نشد.")
|
212 |
-
return
|
213 |
-
|
214 |
-
selected_day = st.sidebar.selectbox("انتخاب روز", ["شنبه", "یکشنبه", "دوشنبه", "سهشنبه", "چهارشنبه", "پنجشنبه"])
|
215 |
-
|
216 |
-
# دریافت مختصات مزرعه انتخاب شده
|
217 |
-
farm_coords = farm_data.loc[farm_data['name'] == selected_farm, ['longitude', 'latitude']]
|
218 |
-
if len(farm_coords) == 0:
|
219 |
-
st.warning(f"مختصات برای مزرعه {selected_farm} یافت نشد.")
|
220 |
-
return
|
221 |
-
|
222 |
-
# تبدیل مختصات به لیست
|
223 |
-
coords = farm_coords.values[0].tolist()
|
224 |
-
|
225 |
-
# جمعآوری دادههای GEE
|
226 |
-
aoi = ee.Geometry.Point(coords)
|
227 |
-
start_date = '2023-01-01'
|
228 |
-
end_date = '2023-12-31'
|
229 |
-
gee_data = collect_gee_data(aoi, start_date, end_date)
|
230 |
-
|
231 |
-
if gee_data is None:
|
232 |
-
st.warning("دادههای Google Earth Engine در دسترس نیست.")
|
233 |
-
return
|
234 |
-
|
235 |
-
# محتوای اصلی
|
236 |
-
col1, col2 = st.columns(2)
|
237 |
-
|
238 |
-
with col1:
|
239 |
-
st.subheader("🗺️ نقشه مزرعه")
|
240 |
-
m = create_map(farm_data, gee_data)
|
241 |
-
if m:
|
242 |
-
folium_static(m)
|
243 |
-
else:
|
244 |
-
st.warning("نقشه در دسترس نیست.")
|
245 |
-
|
246 |
-
with col2:
|
247 |
-
st.subheader("📊 شاخصهای مزرعه")
|
248 |
-
ndvi_mean = gee_data.select('NDVI').mean().getInfo()
|
249 |
-
st.metric(label="🌱 میانگین NDVI", value=f"{ndvi_mean:.2f}")
|
250 |
-
|
251 |
-
st.subheader("📈 نمودارهای مقایسهای")
|
252 |
-
fig = create_comparison_charts(gee_data, selected_farm, farm_data)
|
253 |
-
if fig:
|
254 |
-
st.pyplot(fig)
|
255 |
-
else:
|
256 |
-
st.warning("نمودارهای مقایسهای در دسترس نیست.")
|
257 |
-
|
258 |
-
st.subheader("🌤️ اطلاعات آب و هوا")
|
259 |
-
weather_data = fetch_weather_data(coords[1], coords[0], "ed47316a45379e2221a75f813229fb46")
|
260 |
-
if weather_data and 'main' in weather_data:
|
261 |
-
col1, col2 = st.columns(2)
|
262 |
-
with col1:
|
263 |
-
st.metric(label="🌡️ دما", value=f"{weather_data['main'].get('temp', 'N/A')}°C")
|
264 |
-
with col2:
|
265 |
-
st.metric(label="💧 رطوبت", value=f"{weather_data['main'].get('humidity', 'N/A')}%")
|
266 |
-
else:
|
267 |
-
st.warning("اطلاعات آب و هوا در دسترس نیست.")
|
268 |
-
|
269 |
-
st.subheader("📝 گزارش هفتگی")
|
270 |
-
if weather_data:
|
271 |
-
report = generate_weekly_report(selected_farm, gee_data, weather_data)
|
272 |
-
st.text_area("گزارش", report, height=200)
|
273 |
-
else:
|
274 |
-
st.warning("گزارش هفتگی در دسترس نیست.")
|
275 |
-
|
276 |
-
if __name__ == "__main__":
|
277 |
-
main()
|
|
|
|
|
1 |
import ee
|
2 |
+
import streamlit as st
|
3 |
import folium
|
|
|
4 |
import pandas as pd
|
|
|
|
|
5 |
import requests
|
6 |
+
from datetime import datetime, timedelta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
8 |
+
# احراز هویت با Google Earth Engine
|
9 |
+
service_account = 'dehkhodamap-e9f0da4ce9f6514021@ee-esmaeilkiani13877.iam.gserviceaccount.com'
|
10 |
+
credentials = ee.ServiceAccountCredentials(service_account, 'ee-esmaeilkiani13877-cfdea6eaf411.json')
|
11 |
+
ee.Initialize(credentials)
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
# جمعآوری دادهها از Google Earth Engine
|
14 |
+
def get_indices(aoi, start_date, end_date):
|
15 |
+
sentinel2 = ee.ImageCollection('COPERNICUS/S2') \
|
16 |
+
.filterBounds(aoi) \
|
17 |
+
.filterDate(start_date, end_date) \
|
18 |
+
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
|
19 |
+
|
20 |
+
def calculate_indices(image):
|
21 |
+
ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI')
|
22 |
+
ndwi = image.normalizedDifference(['B3', 'B8']).rename('NDWI')
|
23 |
+
ndre = image.normalizedDifference(['B8', 'B5']).rename('NDRE')
|
24 |
+
lai = image.expression('2.76 * (NDVI / (1 - NDVI))', {'NDVI': ndvi}).rename('LAI')
|
25 |
+
chl = image.expression('(NIR / RED) - 1', {'NIR': image.select('B8'), 'RED': image.select('B4')}).rename('CHL')
|
26 |
+
return image.addBands([ndvi, ndwi, ndre, lai, chl])
|
27 |
+
|
28 |
+
indices = sentinel2.map(calculate_indices)
|
29 |
+
return indices
|
30 |
+
|
31 |
+
# خواندن فایل CSV برای مشخصات مزارع
|
32 |
+
farm_coordinates = pd.read_csv('farm_coordinates.csv')
|
33 |
+
|
34 |
+
# خواندن فایل CSV برای دادههای روزانه مزارع
|
35 |
+
daily_data = pd.read_csv('پایگاه داده (1).csv')
|
36 |
+
|
37 |
+
# نمایش نقشه و شاخصها
|
38 |
+
def display_map(indices, aoi):
|
39 |
+
map_center = [aoi.centroid().coordinates().getInfo()[1], aoi.centroid().coordinates().getInfo()[0]]
|
40 |
+
m = folium.Map(location=map_center, zoom_start=12)
|
41 |
+
|
42 |
+
ndvi_image = indices.select('NDVI').mean()
|
43 |
+
ndwi_image = indices.select('NDWI').mean()
|
44 |
+
|
45 |
+
ndvi_vis_params = {
|
46 |
+
'min': 0, 'max': 1, 'palette': ['red', 'yellow', 'green']
|
47 |
+
}
|
48 |
+
ndwi_vis_params = {
|
49 |
+
'min': -1, 'max': 1, 'palette': ['blue', 'white', 'green']
|
50 |
+
}
|
51 |
+
|
52 |
+
ndvi_url = ndvi_image.getMapId(ndvi_vis_params)['tile_fetcher'].url_format
|
53 |
+
ndwi_url = ndwi_image.getMapId(ndwi_vis_params)['tile_fetcher'].url_format
|
54 |
+
|
55 |
+
folium.TileLayer(tiles=ndvi_url, attr='NDVI', overlay=True, name='NDVI').add_to(m)
|
56 |
+
folium.TileLayer(tiles=ndwi_url, attr='NDWI', overlay=True, name='NDWI').add_to(m)
|
57 |
+
folium.LayerControl().add_to(m)
|
58 |
+
|
59 |
+
return m
|
60 |
+
|
61 |
+
# مقایسه شاخصها
|
62 |
+
def compare_indices(indices):
|
63 |
+
ndvi_chart = indices.select('NDVI').getRegion(aoi, 30).getInfo()
|
64 |
+
ndwi_chart = indices.select('NDWI').getRegion(aoi, 30).getInfo()
|
65 |
+
ndre_chart = indices.select('NDRE').getRegion(aoi, 30).getInfo()
|
66 |
+
lai_chart = indices.select('LAI').getRegion(aoi, 30).getInfo()
|
67 |
+
|
68 |
+
return ndvi_chart, ndwi_chart, ndre_chart, lai_chart
|
69 |
+
|
70 |
+
# نمایش دادههای آب و هوا
|
71 |
+
def get_weather_data(lat, lon):
|
72 |
+
api_key = 'ed47316a45379e2221a75f813229fb46'
|
73 |
+
url = f'http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={api_key}'
|
74 |
+
response = requests.get(url)
|
75 |
+
data = response.json()
|
76 |
+
return data
|
77 |
+
|
78 |
+
# گزارشهای هفتگی
|
79 |
+
def weekly_report(indices, aoi):
|
80 |
+
lai_chart = indices.select('LAI').getRegion(aoi, 30).getInfo()
|
81 |
+
return lai_chart
|
82 |
+
|
83 |
+
# کد Streamlit برای نمایش نتایج
|
84 |
+
st.title('مانیتورینگ مزارع نیشکر')
|
85 |
+
|
86 |
+
# انتخاب مزرعه
|
87 |
+
farm_name = st.selectbox('انتخاب مزرعه', farm_coordinates['name'].unique())
|
88 |
+
farm_info = farm_coordinates[farm_coordinates['name'] == farm_name].iloc[0]
|
89 |
+
|
90 |
+
# انتخاب روز هفته
|
91 |
+
day_of_week = st.selectbox('انتخاب روز هفته', daily_data['روز'].unique())
|
92 |
+
daily_info = daily_data[daily_data['روز'] == day_of_week]
|
93 |
+
|
94 |
+
# تعیین منطقه جغرافیایی
|
95 |
+
aoi = ee.Geometry.Point([farm_info['longitude'], farm_info['latitude']]).buffer(500)
|
96 |
+
|
97 |
+
# تعیین دوره زمانی
|
98 |
+
start_date = '2023-01-01'
|
99 |
+
end_date = '2023-12-31'
|
100 |
+
|
101 |
+
# جمعآوری دادهها
|
102 |
+
indices = get_indices(aoi, start_date, end_date)
|
103 |
+
|
104 |
+
# نمایش نقشه
|
105 |
+
st.subheader('نقشه شاخصها')
|
106 |
+
m = display_map(indices, aoi)
|
107 |
+
st_folium = folium.Map(location=[farm_info['latitude'], farm_info['longitude']], zoom_start=12)
|
108 |
+
st_folium.add_child(m)
|
109 |
+
st_data = st_folium._repr_html_()
|
110 |
+
st.components.v1.html(st_data, height=600)
|
111 |
+
|
112 |
+
# مقایسه شاخصها
|
113 |
+
st.subheader('مقایسه شاخصها')
|
114 |
+
ndvi_chart, ndwi_chart, ndre_chart, lai_chart = compare_indices(indices)
|
115 |
+
st.line_chart(ndvi_chart)
|
116 |
+
st.line_chart(ndwi_chart)
|
117 |
+
st.line_chart(ndre_chart)
|
118 |
+
st.line_chart(lai_chart)
|
119 |
+
|
120 |
+
# نمایش دادههای آب و هوا
|
121 |
+
st.subheader('دادههای آب و هوا')
|
122 |
+
weather_data = get_weather_data(farm_info['latitude'], farm_info['longitude'])
|
123 |
+
st.write(f"دما: {weather_data['main']['temp']}°C")
|
124 |
+
st.write(f"رطوبت: {weather_data['main']['humidity']}%")
|
125 |
+
st.write(f"سرعت باد: {weather_data['wind']['speed']} m/s")
|
126 |
+
|
127 |
+
# گزارشهای هفتگی
|
128 |
+
st.subheader('گزارشهای هفتگی')
|
129 |
+
lai_chart = weekly_report(indices, aoi)
|
130 |
+
st.line_chart(lai_chart)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|