TNGIC Conference - Automated mapping of surface water in Tennessee using Google Earth Engine
This is a conference presentation I presented at the Tennessee Geographic Information Council (TNGIC) Virtual Fall Forum on October 7, 2020.
Slides: gishub.org/tngic
Notebook: github.com/giswqs/geemap/blob/master/exampl..
Install geemap
# Installs geemap package
import subprocess
try:
import geemap
except ImportError:
print('geemap package not installed. Installing ...')
subprocess.check_call(["python", '-m', 'pip', 'install', 'geemap'])
# Checks whether this notebook is running on Google Colab
try:
import google.colab
import geemap.eefolium as geemap
except:
import geemap
# Authenticates and initializes Earth Engine
import ee
Create an interactive map
Map = geemap.Map()
Map
Define region of interest (ROI)
roi = ee.FeatureCollection('TIGER/2018/States') \
.filter(ee.Filter.eq('NAME', 'Tennessee'))
Map.addLayer(roi, {}, "TN")
Map.centerObject(roi, 7)
Create Landsat timeseries
images = geemap.landsat_timeseries(roi=roi, start_year=1984, end_year=2020, start_date='01-01', end_date='12-31')
first = images.first()
vis_params = {
'bands': ['NIR', 'Red', 'Green'],
'min': 0,
'max': 3000
}
Map.addLayer(first, vis_params, 'First image')
Calculate Normalized Difference Water Index (NDWI)
ndwi_images = images.map(lambda img: img.normalizedDifference(['Green', 'SWIR1']).rename('ndwi'))
ndwi_palette = ['#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858']
first_ndwi = ndwi_images.first()
Map.addLayer(first_ndwi, {'palette': ndwi_palette}, 'First NDWI')
Extract surface water extent
water_images = ndwi_images.map(lambda img: img.gt(0).selfMask())
first_water = water_images.first()
Map.addLayer(first_water, {'palette': ['blue']}, 'First Water')
Calculate surface water areas
def cal_area(img):
pixel_area = img.multiply(ee.Image.pixelArea()).divide(1e6)
img_area = pixel_area.reduceRegion(**{
'geometry': roi.geometry(),
'reducer': ee.Reducer.sum(),
'scale': 1000,
'maxPixels': 1e12
})
return img.set({'water_area': img_area})
water_areas = water_images.map(cal_area)
water_stats = water_areas.aggregate_array('water_area').getInfo()
water_stats
Plot temporal trend
import matplotlib.pyplot as plt
x = list(range(1984, 2021))
y = [item.get('ndwi') for item in water_stats]
plt.bar(x, y, align='center', alpha=0.5)
# plt.xticks(y_pos, objects)
plt.ylabel('Area (km2)')
plt.title('Surface water dynamics in Tennessee')
plt.show()
Map.addLayerControl()
Map
Â