Skip to content

Commit 6cb5587

Browse files
committed
update
1 parent 0630989 commit 6cb5587

10 files changed

Lines changed: 896 additions & 1315 deletions

figures/logo.svg

Lines changed: 758 additions & 1 deletion
Loading
Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,35 @@
11
# Introduction and motivation
22

3-
Ecology and forest management often require information across large areas and through time. Forests change because of seasonal phenology, growth, harvesting, fire, windthrow, insects, flooding, regeneration, and land-use change. Many of these processes leave spatial and temporal signals that can be explored with satellite imagery.
3+
Ecology and forest management often require information across large areas and through time. Forests change because of phenology, growth, harvesting, fire, windthrow, insects, flooding, regeneration, and land-use change. Many of these changes leave spatial and temporal signals that can be explored with satellite imagery.
44

5-
Google Earth Engine (GEE) provides access to large geospatial datasets and cloud-based processing tools. This makes it possible to explore forest and ecological questions without downloading and processing large image archives locally.
5+
Google Earth Engine (GEE) provides access to large geospatial datasets and cloud-based processing tools. This makes it possible to filter, analyze, visualize, and export satellite data without downloading large image archives locally.
66

77
## Why this workshop?
88

9-
This workshop introduces the potential of GEE through practical applications in ecology and forest management.
9+
This workshop introduces the potential of GEE through practical, beginner-friendly examples.
1010

11-
The goal is to show what kinds of analyses are possible, how typical GEE workflows are structured, and how satellite data can support ecological interpretation and forest monitoring.
11+
The goal is to show how GEE workflows are structured and how satellite data can support ecological analysis and forest monitoring.
1212

1313
We move from basic visualization to applied examples:
1414

15-
- terrain analysis using elevation data
16-
- seasonal vegetation dynamics using Sentinel-2 NDVI
17-
- long-term forest disturbance detection using Landsat NBR
18-
- supervised classification using Random Forest
15+
- terrain analysis with SRTM elevation data
16+
- seasonal vegetation monitoring with Sentinel-2 NDVI
17+
- forest disturbance detection with Landsat NBR
18+
- land-cover classification with Random Forest
1919

20-
These examples are not meant to cover every detail of GEE. They are designed to provide a clear starting point for understanding the platform and adapting similar workflows to other questions.
20+
These examples are not meant to cover every detail of GEE. They provide a starting point for adapting similar workflows to other ecological and forest management questions.
2121

2222
## Key concepts
2323

24-
- Ecological and forest processes often vary across both space and time.
25-
- Satellite imagery can help describe vegetation condition, terrain context, and landscape change.
2624
- GEE allows users to access, filter, analyze, visualize, and export large geospatial datasets in the cloud.
25+
- Satellite imagery can describe vegetation condition, terrain context, and landscape change.
2726
- Spectral indices such as NDVI and NBR are useful indicators, but they are not direct ecological measurements.
28-
- Interpretation requires field knowledge, reference data, and validation.
29-
- The same GEE workflow logic can be adapted to many applications in ecology and forest management.
27+
- Interpretation requires ecological knowledge, reference data, and validation.
28+
- The same GEE workflow logic can be adapted to many applications.
3029

3130
## Learning questions
3231

3332
1. What kinds of ecological and forest management questions can be explored with GEE?
34-
2. How can satellite imagery help us observe forest conditions and forest change through time?
35-
3. What is the difference between detecting a spatial pattern and explaining its ecological cause?
36-
4. How does cloud-based processing make large-scale geospatial analysis easier?
37-
5. What are the limits of using spectral indices such as NDVI or NBR to interpret ecological and management processes?
38-
33+
2. How does GEE make satellite image analysis easier?
34+
3. What is the difference between detecting a spatial pattern and explaining its cause?
35+
4. What are the limits of using indices such as NDVI or NBR?

modules/02_gee_fundamentals.md

Lines changed: 49 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,30 @@
1-
# Google Earth Engine fundamentals and potential
1+
# Fundamentals and potential
22

33
Google Earth Engine (GEE) is a cloud-based platform for geospatial analysis. It provides access to large satellite image archives, environmental datasets, and tools for processing data directly in the cloud.
44

5-
For ecology and forest management, GEE is useful because it allows users to explore spatial patterns, build time series, calculate spectral indices, summarize raster values, and export results without downloading large image collections locally.
6-
7-
This section introduces the basic objects and operations that appear throughout the hands-on activities.
5+
This section introduces the main Earth Engine objects and operations used throughout the workshop.
86

97
## Core Earth Engine objects
108

11-
### Image
9+
### `ee.Image`
1210

1311
An `ee.Image` is a raster dataset. It can contain one band or many bands.
1412

15-
For example, SRTM elevation is loaded as a single image:
16-
1713
```javascript
1814
var srtm = ee.Image("USGS/SRTMGL1_003");
1915
````
2016

21-
An image can represent elevation, reflectance, NDVI, NBR, classification results, or disturbance year.
17+
Images can represent elevation, reflectance, NDVI, NBR, classification results, or disturbance year.
2218

23-
### ImageCollection
19+
### `ee.ImageCollection`
2420

25-
An `ee.ImageCollection` is a set of images. Many satellite datasets are stored as image collections because they contain repeated observations through time.
21+
An `ee.ImageCollection` is a set of images, often representing repeated observations through time.
2622

2723
```javascript
2824
var s2 = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED");
2925
```
3026

31-
For example, a Sentinel-2 image collection contains many images acquired on different dates. We can filter the collection by location, date, cloud cover, and other properties.
27+
Image collections can be filtered by location, date, cloud cover, and other metadata.
3228

3329
### Geometry
3430

@@ -40,7 +36,7 @@ var point = ee.Geometry.Point([-79.3, 48.45]);
4036

4137
In this workshop, geometries are used to define the region of interest, select pixels, clip rasters, and summarize values.
4238

43-
### Feature and FeatureCollection
39+
### `ee.Feature` and `ee.FeatureCollection`
4440

4541
A feature is a geometry with attributes. A feature collection is a set of features.
4642

@@ -50,37 +46,27 @@ var waterbody = ee.FeatureCollection(
5046
);
5147
```
5248

53-
Feature collections can represent waterbodies, forest inventory polygons, training samples, roads, plots, or management units.
54-
55-
## Common operations
56-
57-
### Filter by region
58-
59-
```javascript
60-
.filterBounds(roi)
61-
```
62-
63-
This keeps images that intersect the region of interest.
49+
Feature collections can represent waterbodies, roads, plots, training samples, management units, or forest inventory polygons.
6450

65-
For example, if the ROI is around Forêt Duparquet, `.filterBounds(roi)` keeps only images that overlap that area.
51+
## Common GEE operations
6652

67-
### Filter by date
53+
### Filter an image collection
6854

6955
```javascript
70-
.filterDate("2023-01-01", "2023-12-31")
56+
var s2Filtered = s2
57+
.filterBounds(roi)
58+
.filterDate("2023-01-01", "2023-12-31");
7159
```
7260

73-
This keeps images acquired within a specific date range.
74-
75-
Date filters are essential for phenology, annual composites, disturbance detection, and before-after comparisons.
61+
Filtering keeps only the images needed for the study area and time period.
7662

7763
### Select bands
7864

7965
```javascript
8066
var nir = image.select("B8");
8167
```
8268

83-
Band selection keeps only the bands needed for analysis. For example, NDVI requires near-infrared and red bands, while NBR requires near-infrared and shortwave-infrared bands.
69+
Band selection keeps the variables needed for analysis. For example, NDVI uses near-infrared and red bands, while NBR uses near-infrared and shortwave-infrared bands.
8470

8571
### Calculate an index
8672

@@ -101,11 +87,9 @@ var withNDVI = s2.map(function(image) {
10187

10288
`.map()` applies the same function to every image in an image collection.
10389

104-
In this example, NDVI is calculated for every Sentinel-2 image.
105-
10690
### Reduce values
10791

108-
Reducers summarize many values into fewer values.
92+
Reducers summarize many pixel values into a smaller result.
10993

11094
```javascript
11195
var stats = image.reduceRegion({
@@ -115,29 +99,15 @@ var stats = image.reduceRegion({
11599
});
116100
```
117101

118-
This example calculates the mean value of an image inside the ROI.
119-
120-
Common reducers include:
121-
122-
```javascript
123-
ee.Reducer.mean()
124-
ee.Reducer.minMax()
125-
ee.Reducer.sum()
126-
ee.Reducer.stdDev()
127-
ee.Reducer.count()
128-
```
129-
130-
Reducers are used to summarize elevation, calculate mean NDVI, estimate disturbed area, and assess classification results.
102+
Reducers are used to calculate summary statistics, mean NDVI, disturbed area, and accuracy metrics.
131103

132104
### Display a layer
133105

134106
```javascript
135107
Map.addLayer(image, visParams, "Layer name");
136108
```
137109

138-
`Map.addLayer()` displays data in the Earth Engine Code Editor map. Visualization parameters control the displayed colors and value range.
139-
140-
Displaying a layer does not export or save the result. It only shows the data on the map.
110+
`Map.addLayer()` displays data in the Code Editor map. It does not export or save the result.
141111

142112
### Export a result
143113

@@ -152,111 +122,89 @@ Export.image.toDrive({
152122
});
153123
```
154124

155-
Exporting creates a task that saves a raster result to Google Drive. Exports are useful when you want to use the result in QGIS, ArcGIS, R, Python, or another workflow.
125+
Exporting creates a task that saves a raster result outside Earth Engine, for example to Google Drive.
156126

157127
## Client-side and server-side thinking
158128

159-
Most Earth Engine objects are server-side objects. This means they describe a computation that will be sent to Google’s servers, rather than a value stored directly in your browser. For more details, see the Earth Engine documentation on [client-side and server-side objects](https://developers.google.com/earth-engine/guides/client_server)
129+
Most Earth Engine objects are server-side objects. They describe computations that run on Google’s servers.
130+
131+
A normal JavaScript number is client-side. An `ee.Number` is server-side. A normal JavaScript list is client-side. An `ee.ImageCollection` is server-side.
160132

161133
The key rule is:
162134

163135
> Use Earth Engine methods for Earth Engine objects.
164136
165-
For example, an `ee.Number` is not the same as a normal JavaScript number. An `ee.ImageCollection` is not the same as a normal JavaScript list.
166-
167-
This is why direct JavaScript operations sometimes fail on Earth Engine objects. When working with Earth Engine objects, use Earth Engine functions such as `.map()`, `.filterDate()`, `.filterBounds()`, `.select()`, `.addBands()`, and `.reduceRegion()`.
137+
For example, use `.map()`, `.filterDate()`, `.filterBounds()`, `.select()`, `.addBands()`, and `.reduceRegion()` with Earth Engine objects.
168138

169139
## Lazy evaluation
170140

171-
Earth Engine uses lazy evaluation. This means it does not immediately run every operation when a line of code is written.
141+
Earth Engine uses lazy evaluation. This means it does not run every operation immediately.
172142

173-
Instead, the script builds a processing plan. Earth Engine executes that plan when a result is requested, such as when you display a layer, print a value, create a chart, or start an export.
143+
Instead, the script builds a processing plan. Earth Engine executes that plan when an output is requested, such as a map layer, printed value, chart, or export.
174144

175-
This makes it possible to describe large computations without downloading or processing everything locally.
145+
## Why `system:time_start` matters?
176146

177-
## Why `system:time_start` matters
147+
Time series charts need a date for each image. Earth Engine usually stores this date in the `system:time_start` property.
178148

179-
Time series charts need a date for each image. Earth Engine usually stores that date in the `system:time_start` property.
180-
181-
For derived composites, such as monthly NDVI or annual NBR images, we often assign this property manually:
149+
For derived composites, such as monthly NDVI or annual NBR images, we often assign it manually:
182150

183151
```javascript
184152
.set("system:time_start", ee.Date.fromYMD(year, month, 15).millis())
185153
```
186154

187-
This places the composite at a specific date in the chart.
188-
189-
The date is converted to milliseconds because Earth Engine stores time as milliseconds since 1970-01-01 UTC, also called the Unix epoch.
190-
155+
This places each composite correctly on a chart.
191156

192157
## Visualizing versus exporting
193158

194-
It is important to separate map visualization from data export.
159+
Map visualization and data export are different.
195160

196161
```javascript
197162
Map.addLayer(image, visParams, "Layer name");
198163
```
199164

200-
This displays an image on the map.
165+
This displays an image using colors and value ranges.
201166

202167
```javascript
203168
Export.image.toDrive({...});
204169
```
205170

206-
This saves an image as a raster file.
207-
208-
A layer may look good on the map because of the visualization parameters, but the exported raster contains the original data values unless you explicitly export a visualized image.
171+
This saves raster values to a file.
209172

210-
## Why this matters for the hands-on activities
173+
A layer may look good on the map because of the visualization settings, but the exported raster contains the original data values unless you explicitly export a visualized image.
211174

212-
The same GEE logic appears throughout the workshop:
175+
## Basic GEE workflow
213176

214-
* define an ROI
215-
* load an image or image collection
216-
* filter by date and region
217-
* mask unwanted pixels
218-
* calculate indices or terrain products
219-
* summarize values with reducers
220-
* display maps and charts
221-
* export final outputs
177+
Most workshop examples follow the same structure:
222178

223-
Once this workflow is clear, it can be adapted to many ecological and forest management applications.
179+
1. define a region of interest
180+
2. load an image or image collection
181+
3. filter by date and region
182+
4. mask unwanted pixels
183+
5. calculate indices or terrain products
184+
6. summarize values with reducers
185+
7. display maps and charts
186+
8. export final outputs
224187

225188
## Questions
226189

227190
1. What is the difference between an `ee.Image` and an `ee.ImageCollection`?
228191
2. Why do we filter image collections by date and region?
229192
3. What does `.map()` do in Earth Engine?
230-
4. Why is cloud masking important before analysis?
231-
5. What does a reducer do?
232-
6. What is the difference between client-side and server-side objects?
233-
7. Why does Earth Engine use lazy evaluation?
234-
8. What is the purpose of `system:time_start` in time series analysis?
235-
9. What is the difference between visualizing a layer and exporting a result?
236-
10. Why should we define a clear region of interest before analysis?
193+
4. What does a reducer do?
194+
5. What is the difference between visualizing a layer and exporting a result?
237195

238196
<details>
239197
<summary>Answers</summary>
240198

241199
1. An `ee.Image` is one raster dataset. An `ee.ImageCollection` is a set of images, often representing repeated observations through time.
242200

243-
2. Filtering by date and region keeps only the images relevant to the question and study area. This reduces unnecessary processing and focuses the analysis.
201+
2. Filtering keeps only the images relevant to the study area and time period.
244202

245203
3. `.map()` applies the same function to every image in a collection.
246204

247-
4. Cloud masking removes cloud, shadow, snow, or other poor-quality pixels that can distort indices, composites, charts, and change detection.
205+
4. A reducer summarizes many values into fewer values, such as a mean, sum, minimum, maximum, or count.
248206

249-
5. A reducer summarizes many values into fewer values. For example, it can calculate the mean NDVI inside an ROI or the total disturbed area in hectares.
250-
251-
6. Client-side objects exist in the browser as normal JavaScript values. Server-side Earth Engine objects describe computations that run on Google’s servers.
252-
253-
7. Lazy evaluation allows Earth Engine to build a processing plan and run it only when an output is requested. This makes large-scale analysis more efficient.
254-
255-
8. `system:time_start` stores the date of an image. Time series charts use it to place images correctly on the x-axis.
256-
257-
9. Visualization displays data on the map using colors and value ranges. Export saves raster data to a file for use outside Earth Engine.
258-
259-
10. A clear ROI limits the analysis to the area of interest, reduces unnecessary processing, and makes summaries and exports more meaningful.
207+
5. Visualization displays data on the map. Export saves raster data to a file for use outside Earth Engine.
260208

261209
</details>
262210

@@ -280,8 +228,6 @@ var s2 = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED");
280228
.filterDate("2023-01-01", "2023-12-31")
281229
```
282230

283-
4. Why is this not the same as downloading data to your computer?
284-
285231
<details>
286232
<summary>Answers</summary>
287233

@@ -291,7 +237,5 @@ var s2 = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED");
291237

292238
3. It keeps only images acquired between January 1 and December 31, 2023.
293239

294-
4. The data remain in Earth Engine’s cloud environment. The script describes and runs computations on the server. Data are only downloaded if you explicitly export or download a result.
295-
296240
</details>
297241

0 commit comments

Comments
 (0)