Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -93,10 +93,22 @@ def reduce_zonal_ndvi(image, ee_object):
|
|
93 |
)
|
94 |
return image.set(reduced)
|
95 |
|
|
|
96 |
def calculate_NDVI(image):
|
97 |
ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI')
|
98 |
return ndvi
|
99 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
# Get Zonal NDVI
|
101 |
def get_zonal_ndvi(collection, geom_ee_object):
|
102 |
reduced_collection = collection.map(lambda image: reduce_zonal_ndvi(image, ee_object=geom_ee_object))
|
@@ -106,16 +118,6 @@ def get_zonal_ndvi(collection, geom_ee_object):
|
|
106 |
df = pd.DataFrame({'NDVI': stats_list, 'Date': dates, 'Imagery': filenames})
|
107 |
return df
|
108 |
|
109 |
-
def get_zonal_ndviYoY(collection, ee_object):
|
110 |
-
ndvi_collection = collection.map(calculate_NDVI)
|
111 |
-
max_ndvi = ndvi_collection.max()
|
112 |
-
reduced_max_ndvi = max_ndvi.reduceRegion(
|
113 |
-
reducer=ee.Reducer.mean(),
|
114 |
-
geometry=ee_object.geometry(),
|
115 |
-
scale=10,
|
116 |
-
maxPixels=1e12)
|
117 |
-
return reduced_max_ndvi
|
118 |
-
|
119 |
|
120 |
# put title in center
|
121 |
st.markdown("""
|
@@ -203,27 +205,31 @@ if uploaded_file is not None:
|
|
203 |
st.line_chart(resultant_df[['AvgNDVI_Inside', 'Avg_NDVI_Buffer', 'Date']].set_index('Date'))
|
204 |
|
205 |
####### YoY Profile ########
|
206 |
-
start_year =
|
207 |
end_year = 2023
|
208 |
|
209 |
max_ndvi_geoms = []
|
210 |
max_ndvi_buffered_geoms = []
|
211 |
for year in range(start_year, end_year+1):
|
212 |
-
|
213 |
-
|
|
|
|
|
214 |
|
215 |
# Filter data based on the date, bounds, cloud coverage and select NIR and Red Band
|
216 |
collection = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', max_cloud_cover)).filter(ee.Filter.date(start_ddmm, end_ddmm)).select(['B4', 'B8'])
|
217 |
-
|
218 |
# Get Zonal NDVI based on collection and geometries (Original KML and Buffered KML)
|
219 |
max_ndvi_geoms.append(get_zonal_ndviYoY(collection.filterBounds(geom_ee_object), geom_ee_object))
|
220 |
max_ndvi_buffered_geoms.append(get_zonal_ndviYoY(collection.filterBounds(buffered_ee_object), buffered_ee_object))
|
221 |
-
|
|
|
222 |
yoy_df = pd.DataFrame({'Year': list(range(start_year, end_year+1)), 'NDVI_Inside': max_ndvi_geoms, 'NDVI_Buffer': max_ndvi_buffered_geoms})
|
|
|
223 |
|
224 |
# plot the time series
|
225 |
st.write("Year on Year Plot")
|
226 |
-
st.line_chart(yoy_df[['NDVI_Inside', 'NDVI_Buffer', 'Year']].set_index('Year'))
|
227 |
|
228 |
# Visualize map on ESRI basemap
|
229 |
st.write("Map Visualization")
|
|
|
93 |
)
|
94 |
return image.set(reduced)
|
95 |
|
96 |
+
# Calculate NDVI
|
97 |
def calculate_NDVI(image):
|
98 |
ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI')
|
99 |
return ndvi
|
100 |
|
101 |
+
# Get Zonal NDVI for Year on Year Profile
|
102 |
+
def get_zonal_ndviYoY(collection, ee_object):
|
103 |
+
ndvi_collection = collection.map(calculate_NDVI)
|
104 |
+
max_ndvi = ndvi_collection.max()
|
105 |
+
reduced_max_ndvi = max_ndvi.reduceRegion(
|
106 |
+
reducer=ee.Reducer.mean(),
|
107 |
+
geometry=ee_object.geometry(),
|
108 |
+
scale=10,
|
109 |
+
maxPixels=1e12)
|
110 |
+
return reduced_max_ndvi.get('NDVI').getInfo()
|
111 |
+
|
112 |
# Get Zonal NDVI
|
113 |
def get_zonal_ndvi(collection, geom_ee_object):
|
114 |
reduced_collection = collection.map(lambda image: reduce_zonal_ndvi(image, ee_object=geom_ee_object))
|
|
|
118 |
df = pd.DataFrame({'NDVI': stats_list, 'Date': dates, 'Imagery': filenames})
|
119 |
return df
|
120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
|
122 |
# put title in center
|
123 |
st.markdown("""
|
|
|
205 |
st.line_chart(resultant_df[['AvgNDVI_Inside', 'Avg_NDVI_Buffer', 'Date']].set_index('Date'))
|
206 |
|
207 |
####### YoY Profile ########
|
208 |
+
start_year = 2019
|
209 |
end_year = 2023
|
210 |
|
211 |
max_ndvi_geoms = []
|
212 |
max_ndvi_buffered_geoms = []
|
213 |
for year in range(start_year, end_year+1):
|
214 |
+
|
215 |
+
# Construct start and end dates for every year
|
216 |
+
start_ddmm = str(year)+pd.to_datetime(start_date).strftime("-%m-%d")
|
217 |
+
end_ddmm = str(year)+pd.to_datetime(end_date).strftime("-%m-%d")
|
218 |
|
219 |
# Filter data based on the date, bounds, cloud coverage and select NIR and Red Band
|
220 |
collection = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', max_cloud_cover)).filter(ee.Filter.date(start_ddmm, end_ddmm)).select(['B4', 'B8'])
|
221 |
+
|
222 |
# Get Zonal NDVI based on collection and geometries (Original KML and Buffered KML)
|
223 |
max_ndvi_geoms.append(get_zonal_ndviYoY(collection.filterBounds(geom_ee_object), geom_ee_object))
|
224 |
max_ndvi_buffered_geoms.append(get_zonal_ndviYoY(collection.filterBounds(buffered_ee_object), buffered_ee_object))
|
225 |
+
|
226 |
+
# Create a DataFrame for YoY profile
|
227 |
yoy_df = pd.DataFrame({'Year': list(range(start_year, end_year+1)), 'NDVI_Inside': max_ndvi_geoms, 'NDVI_Buffer': max_ndvi_buffered_geoms})
|
228 |
+
yoy_df['Ratio'] = yoy_df['NDVI_Inside'] / yoy_df['NDVI_Buffer']
|
229 |
|
230 |
# plot the time series
|
231 |
st.write("Year on Year Plot")
|
232 |
+
st.line_chart(yoy_df[['NDVI_Inside', 'NDVI_Buffer', 'Ratio', 'Year']].set_index('Year'))
|
233 |
|
234 |
# Visualize map on ESRI basemap
|
235 |
st.write("Map Visualization")
|