Esmaeilkianii commited on
Commit
473d3b5
·
verified ·
1 Parent(s): c3d3254

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +123 -270
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 streamlit_folium import folium_static
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
- @st.cache_data
37
- def load_daily_farm_data():
38
- try:
39
- data = pd.read_csv('پایگاه داده (1).csv')
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
- @st.cache_data
49
- def collect_gee_data(_aoi, start_date, end_date):
50
- try:
51
- # فیلتر کردن مجموعه تصاویر Sentinel-2
52
- s2 = ee.ImageCollection('COPERNICUS/S2_SR') \
53
- .filterBounds(aoi) \
54
- .filterDate(start_date, end_date) \
55
- .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
56
-
57
- if s2.size().getInfo() == 0:
58
- st.warning("هیچ تصویری برای محدوده و تاریخ انتخاب شده یافت نشد.")
59
- return None
60
-
61
- def calculate_indices(image):
62
- ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI')
63
- ndwi = image.normalizedDifference(['B3', 'B8']).rename('NDWI')
64
- ndre = image.normalizedDifference(['B8', 'B5']).rename('NDRE')
65
-
66
- # محاسبه LAI (فرمول ساده‌شده)
67
- lai = image.expression(
68
- '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
69
- 'NIR': image.select('B8'),
70
- 'RED': image.select('B4'),
71
- 'BLUE': image.select('B2')
72
- }).rename('LAI')
73
-
74
- # محاسبه CHL (فرمول ساده‌شده)
75
- chl = image.expression(
76
- '(NIR / RED) - 1', {
77
- 'NIR': image.select('B8'),
78
- 'RED': image.select('B4')
79
- }).rename('CHL')
80
-
81
- return image.addBands([ndvi, ndwi, ndre, lai, chl])
82
-
83
- return s2.map(calculate_indices)
84
- except Exception as e:
85
- st.error(f"خطا در جمع‌آوری داده‌های Google Earth Engine: {str(e)}")
86
- return None
87
-
88
- # ایجاد نقشه با استفاده از Folium
89
- def create_map(farm_data, gee_data):
90
- try:
91
- if len(farm_data) == 0:
92
- return None
93
-
94
- center_lat = farm_data['latitude'].mean()
95
- center_lon = farm_data['longitude'].mean()
96
- m = folium.Map(location=[center_lat, center_lon], zoom_start=10)
97
-
98
- # اضافه کردن لایه NDVI
99
- ndvi_layer = folium.raster_layers.ImageOverlay(
100
- name='NDVI',
101
- image=gee_data.select('NDVI').mean().getMapId()['image_url'],
102
- bounds=gee_data.getBounds().getInfo()['coordinates'][0],
103
- opacity=0.7
104
- )
105
- ndvi_layer.add_to(m)
106
-
107
- # اضافه کردن نشانگر برای مزارع
108
- for _, farm in farm_data.iterrows():
109
- folium.Marker(
110
- location=[farm['latitude'], farm['longitude']],
111
- popup=farm['name'],
112
- icon=folium.Icon(color='green', icon='leaf')
113
- ).add_to(m)
114
-
115
- # اضافه کردن کنترل لایه
116
- folium.LayerControl().add_to(m)
117
-
118
- return m
119
- except Exception as e:
120
- st.error(f"خطا در ایجاد نقشه: {str(e)}")
121
- return None
122
-
123
- # ایجاد نمودارهای مقایسه‌ای
124
- def create_comparison_charts(gee_data, farm_name, farm_data):
125
- try:
126
- if len(farm_data) == 0:
127
- return None
128
-
129
- fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 12))
130
-
131
- # سری زمانی NDVI
132
- farm_coords = farm_data.loc[farm_data['name'] == farm_name, ['longitude', 'latitude']]
133
- if len(farm_coords) == 0:
134
- return None
135
-
136
- coords = farm_coords.values[0].tolist()
137
- ndvi_ts = gee_data.select('NDVI').getRegion(ee.Geometry.Point(coords), 30).getInfo()
138
- ndvi_df = pd.DataFrame(ndvi_ts[1:], columns=ndvi_ts[0])
139
- ndvi_df['datetime'] = pd.to_datetime(ndvi_df['time'], unit='ms')
140
- ndvi_df.plot(x='datetime', y='NDVI', ax=ax1)
141
- ax1.set_title(f'سری زمانی NDVI - {farm_name}')
142
- ax1.set_ylabel('NDVI')
143
-
144
- # نمودار پراکندگی NDVI در مقابل NDWI
145
- ax2.scatter(gee_data.select('NDVI').mean().getInfo(), gee_data.select('NDWI').mean().getInfo())
146
- ax2.set_xlabel('NDVI')
147
- ax2.set_ylabel('NDWI')
148
- ax2.set_title(f'NDVI در مقابل NDWI - {farm_name}')
149
-
150
- return fig
151
- except Exception as e:
152
- st.error(f"خطا در ایجاد نمودارهای مقایسه‌ای: {str(e)}")
153
- return None
154
-
155
- # دریافت داده‌های آب و هوا
156
- @st.cache_data
157
- def fetch_weather_data(lat, lon, api_key):
158
- try:
159
- url = f"http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={api_key}&units=metric"
160
- response = requests.get(url)
161
- if response.status_code == 200:
162
- return response.json()
163
- else:
164
- st.error(f"خطا در دریافت داده‌های آب و هوا: {response.status_code}")
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)