From 9eb020dab7065a7768002d7025b8a9ad72937243 Mon Sep 17 00:00:00 2001 From: Ollie Ballinger <58981760+oballinger@users.noreply.github.com> Date: Mon, 17 Apr 2023 11:46:07 +0100 Subject: [PATCH] fixed image paths --- .DS_Store | Bin 10244 -> 10244 bytes chapters/A2_Remote_Sensing.qmd | 8 +- chapters/A3_Data_Acquisition.qmd | 20 +- chapters/B1_Getting_Started.qmd | 110 ++-- chapters/B2_Interpreting_Images.qmd | 86 +-- chapters/B3_Image_Series.qmd | 160 ++--- chapters/B4_Vectors_Tables.qmd | 80 +-- chapters/C1_Lights.qmd | 6 +- chapters/C3_Blast.qmd | 38 +- chapters/C5_Object_Detection.qmd | 2 +- chapters/index.log | 2 +- chapters/index.tex | 713 +++++++++++----------- docs/.DS_Store | Bin 0 -> 6148 bytes docs/A2_Remote_Sensing.html | 84 ++- docs/A3_Data_Acquisition.html | 124 ++-- docs/A3_Data_acquisition.qmd | 20 +- docs/B1_Getting_Started.html | 360 ++++++----- docs/B2_Interpreting_Images.html | 212 +++---- docs/B3_Image_Series.html | 500 ++++++++------- docs/B4_Vectors_Tables.html | 366 ++++++----- docs/C1_Lights.html | 6 +- docs/C2_Refineries.html | 84 ++- docs/C3_Blast.html | 154 +++-- docs/C4_Ships.html | 122 ++-- docs/C5_Object_Detection.html | 86 ++- docs/chapters/C5_Object_Detection.html | 2 +- {images => docs/images}/revisit_chart.png | Bin images/.DS_Store | Bin 8196 -> 8196 bytes revisit_chart.png | Bin 0 -> 49620 bytes 29 files changed, 1611 insertions(+), 1734 deletions(-) create mode 100644 docs/.DS_Store rename {images => docs/images}/revisit_chart.png (100%) create mode 100644 revisit_chart.png diff --git a/.DS_Store b/.DS_Store index 8aa54ebb91bfe058f3871397d36efcd7b64cd880..d08f98e17d603dba42994167a331d56d23b53924 100644 GIT binary patch delta 540 zcmZn(XbG6$¥U^hRb!e$d9m%1G4oQ!hzyN4B0?dD1$SD50Lf)ikAab zIRj-%fpW!QbwLcl3?>ZzK++SaA_S<8fq{@4{Ge{&^8h;%hhy;=RLGFakTSrYfw=+h z86O;;0V@Q0h7%ZRpg4iV2UyfICqFqUCqD@&E5N|Ol+M7w$oC%%CKhho%&zd49RMN^ Bbz%Sj delta 50 zcmZn(XbG6$&nUGqU^hRb)Mg%mk4%gVoBs(dV+2x5MW(P%u9qpB94)_QW5XJz&Fl() F*#WjV5!e6# diff --git a/chapters/A2_Remote_Sensing.qmd b/chapters/A2_Remote_Sensing.qmd index fa8c2bc..3613a8a 100644 --- a/chapters/A2_Remote_Sensing.qmd +++ b/chapters/A2_Remote_Sensing.qmd @@ -11,7 +11,7 @@ Before learning how to load, process, and analyze satellite imagery in Google Ea [Remote sensing](https://www.sciencedirect.com/topics/medicine-and-dentistry/remote-sensing) is the science of obtaining information about an object or phenomenon without making physical contact with the object. Remote sensing can be done with various types of electromagnetic radiation such as visible, infrared or microwave. The electromagnetic radiation is either emitted or reflected from the object being sensed. The reflected radiation is then collected by a sensor and processed to obtain information about the object. -![](../images/diagram.png) +![](images/diagram.png) @@ -32,9 +32,9 @@ Spatial resolution governs how "sharp" an image looks. The Google Maps satellite Most of the optical imagery that is freely available has relatively low spatial resolution (it looks more grainy than, for example, the Google satellite basemap), -![](../images/Landsat.png) -![](../images/Sentinel2.png) -![](../images/Maxar.png) +![](images/Landsat.png) +![](images/Sentinel2.png) +![](images/Maxar.png) ### Spectral Resolution diff --git a/chapters/A3_Data_Acquisition.qmd b/chapters/A3_Data_Acquisition.qmd index 4994651..03b83c3 100644 --- a/chapters/A3_Data_Acquisition.qmd +++ b/chapters/A3_Data_Acquisition.qmd @@ -11,7 +11,7 @@ This section highlights ten categories of geospatial data available natively in ## Optical Imagery -![Automatic detection of vehicles using artificial intelligence in high resolution optical imagery. See the [object detection](C5_Object_Detection.qmd) tutorial.](../images/obj_det3.jpg) +![Automatic detection of vehicles using artificial intelligence in high resolution optical imagery. See the [object detection](C5_Object_Detection.qmd) tutorial.](images/obj_det3.jpg) Optical satellite imagery is the bread and butter of many open source investigations. It would be tough to list off all of the possible use cases, so here's a handy flowchart: @@ -83,7 +83,7 @@ There are several different types of optical satellite imagery available in the ## Radar Imagery -![Ships and interference from a radar system are visible in Zhuanghe Wan, near North Korea.](../images/radar%20ships.jpg) +![Ships and interference from a radar system are visible in Zhuanghe Wan, near North Korea.](images/radar%20ships.jpg) Synthetic Aperture Radar imagery (SAR) is a type of remote sensing that uses radio waves to detect objects on the ground. SAR imagery is useful for detecting objects that are small, or that are obscured by clouds or other weather phenomena. SAR imagery is also useful for detecting objects that are moving, such as ships or cars. @@ -109,7 +109,7 @@ Synthetic Aperture Radar imagery (SAR) is a type of remote sensing that uses rad ## Nighttime Lights -![A timelapse of nighttime lights over Northern Iraq showing the capture and liberation of Mosul by ISIS.](../images/Figure_1.gif) +![A timelapse of nighttime lights over Northern Iraq showing the capture and liberation of Mosul by ISIS.](images/Figure_1.gif) Satellite images of the Earth at night are a useful proxy for human activity. The brightness of a given area at night is a function of the number of people living there and the nature of their activities. The effects of conflict, natural disasters, and economic development can all be inferred from changes in nighttime lights. @@ -144,7 +144,7 @@ The timelapse above reveals a number of interesting things: The capture of Mosul -![Sulphur Dioxide plume resulting from ISIS attack on the Al-Mishraq Sulphur Plant in Iraq](../images/mishraq_small.gif){width=100%} +![Sulphur Dioxide plume resulting from ISIS attack on the Al-Mishraq Sulphur Plant in Iraq](images/mishraq_small.gif){width=100%} Climate and atmospheric data can be used to track the effects of conflict on the environment. The European Space Agency's Sentinel-5p satellites measure the concentration of a number of atmospheric gasses, including nitrogen dioxide, methane and ozone. Measurements are available on a daily basis at a fairly high resolution (1km), allowing for the detection of localized sources of pollution such as oil refineries or power plants. For example, see this [Bellingcat article](https://www.bellingcat.com/resources/2021/04/15/what-oil-satellite-technology-and-iraq-can-tell-us-about-pollution/) in which Wim Zwijnenburg and I trace pollution to specific facilities operated by multinational oil companies in Iraq. @@ -175,7 +175,7 @@ The Copernicus Atmosphere Monitoring Service (CAMS) provides similar data at a l ## Mineral Deposits -![Zinc deposits across Central Africa](../images/mining.jpg) +![Zinc deposits across Central Africa](images/mining.jpg) Mining activities often play an important role in conflict. According to an influential [study](https://www.aeaweb.org/articles?id=10.1257/aer.20150774), "the historical rise in mineral prices might explain up to one-fourth of the average level of violence across African countries" between 1997 and 2010. Data on the location of mineral deposits can be used to identify areas where mining activities are likely to be taking place, and several such datasets are available in Google Earth Engine. @@ -204,7 +204,7 @@ Mining activities often play an important role in conflict. According to an infl ## Fires -![Detected fires over Ukraine since 27/02/2022 showing the frontline of the war](../images/fires.jpg) +![Detected fires over Ukraine since 27/02/2022 showing the frontline of the war](images/fires.jpg) Earth-observing satellites can detect "thermal anomalies" (fires) from space. NASA's Fire Information for Resource Management System (FIRMS) provides daily data on active fires in near real time, going back to the year 2000. Carlos Gonzales wrote a comprehensive [Bellingcat article](https://www.bellingcat.com/resources/2022/10/04/scorched-earth-using-nasa-fire-data-to-monitor-war-zones/) on the use of FIRMS to monitor war zones from Ukraine to Ethiopia. The map above shows that FIRMS detected fires over Eastern Ukraine trace the frontline of the war. @@ -234,7 +234,7 @@ FIRMS data are derived from the MODIS satellite, but only show the central locat ## Population Density Estimates -![Population density estimates around Pyongyang, North Korea](../images/pop.jpg) +![Population density estimates around Pyongyang, North Korea](images/pop.jpg) Sometimes, we may want to get an estimate of the population in a specific area to ballpark how many people might be affected by a natural disaster, a counteroffensive or a missile strike. You can't really Google "what is the population in this rectangle I've drawn in Northeastern Syria?" and get a good answer. Luckily, there are several spatial population datasets hosted in GEE that let you do just that. Some, such as WorldPop, provide estimated breakdowns by age and sex as well. However, it is extremely important to bear in mind that these are **estimates**, and will **not** take into account things like conflict-induced displacement. For example, Oak Ridge National Laboratory's LandScan program has released high-resolution population data for Ukraine, but this pertains to the pre-war population distribution. The war has radically changed this distribution, so these estimates no longer reflect where people *are*. Still, this dataset could be used to roughly estimate displacement or the number of people who will need new housing. @@ -261,7 +261,7 @@ Sometimes, we may want to get an estimate of the population in a specific area t ## Building Footprints -![Building footprints in Mariupol, Ukraine colored by whether the building is damaged](../images/footprints.png) +![Building footprints in Mariupol, Ukraine colored by whether the building is damaged](images/footprints.png) A building footprint dataset contains the two dimensional outlines of buildings in a given area. Currently, GEE hosts one building footprint dataset which covers all of Africa. In 2022, Microsoft released a free [global building footprint dataset](https://www.microsoft.com/en-us/maps/building-footprints), though to use it in Earth Engine you'll have to download it from their [GitHub page](https://github.com/Microsoft/USBuildingFootprints) and upload it manually to GEE. The same goes for OpenStreetMap (OSM), a public database of building footprints, roads, and other features that also contains useful annotations for many buildings indicating their use. [Benjamin Strick](https://www.youtube.com/watch?v=bJkV3l5Haq0) has a great youtube video on conducting investigations using OSM data. @@ -284,7 +284,7 @@ A building footprint dataset contains the two dimensional outlines of buildings ## Administrative Boundaries -![Second-level administrative boundaries in Yemen](../images/fao_gaul.jpg) +![Second-level administrative boundaries in Yemen](images/fao_gaul.jpg) Spatial analysis often has to aggregate information over a defined area; we may want to assess the total burned area by province in Ukraine, or count the number of Saudi airstrikes by district in Yemen. For that, we need data on these administrative boundaries. GEE hosts several such datasets at the country, province, and district (or equivalent) level. @@ -308,7 +308,7 @@ Spatial analysis often has to aggregate information over a defined area; we may ## Global Power Plant Database -![Power plants in Ukraine colored by type](../images/power.jpg) +![Power plants in Ukraine colored by type](images/power.jpg) The Global Power Plant Database is a comprehensive, open source database of power plants around the world. It centralizes power plant data to make it easier to navigate, compare and draw insights. Each power plant is geolocated and entries contain information on plant capacity, generation, ownership, and fuel type. As of June 2018, the database includes around 28,500 power plants from 164 countries. The database is curated by the [World Resources Institute (WRI)](https://datasets.wri.org/dataset/globalpowerplantdatabase). diff --git a/chapters/B1_Getting_Started.qmd b/chapters/B1_Getting_Started.qmd index ba33d93..f56e0ca 100644 --- a/chapters/B1_Getting_Started.qmd +++ b/chapters/B1_Getting_Started.qmd @@ -63,7 +63,7 @@ If you have not already done so, be sure to add the book’s code repository to The Code Editor is an integrated development environment for the Earth Engine JavaScript API. It offers an easy way to type, debug, run, and manage code. Once you have followed Google’s documentation on registering for an Earth Engine account, you should follow the documentation to open the Code Editor. When you first visit the Code Editor, you will see a screen such as the one shown in Fig. F1.0.1. -![Fig. F1.0.1 The Earth Engine Code Editor](../images/F1/image41.png) +![Fig. F1.0.1 The Earth Engine Code Editor](images/F1/image41.png) @@ -75,7 +75,7 @@ print('Hello World'); The line of code above uses the JavaScript print function to print the text “Hello World” to the screen. Once you enter the code, click the “Run” button. The output will be displayed on the upper right-hand panel under the Console tab (Fig. F1.0.2.). -![Fig. F1.0.2 Typing and running code](../images/F1/image57.png) +![Fig. F1.0.2 Typing and running code](images/F1/image57.png) @@ -83,31 +83,31 @@ The line of code above uses the JavaScript print function to print the text “H You now know where to type your code, how to run it, and where to look for the output. You just wrote your first Earth Engine script and may want to save it. Click the “Save” button (Fig. F1.0.3). -![Fig. F1.0.3 Saving a script](../images/F1/image5.png) +![Fig. F1.0.3 Saving a script](images/F1/image5.png) If this is your first time using the Code Editor, you will be prompted to create a home folder. This is a folder in the cloud where all your code will be saved. You can pick a name of your choice, but remember that it cannot be changed and will forever be associated with your account. A good choice for the name would be your Google Account username (Fig. F1.0.4). -![Fig. F1.0.4 Creating a home folder](../images/F1/image64.png) +![Fig. F1.0.4 Creating a home folder](images/F1/image64.png) Once your home folder is created, you will be prompted to enter a new repository. A repository can help you organize and share code. Your account can have multiple repositories and each repository can have multiple scripts inside it. To get started, you can create a repository named “default” (Fig. F1.0.5). -![Fig. F1.0.5 Creating a new repository](../images/F1/image33.png) +![Fig. F1.0.5 Creating a new repository](images/F1/image33.png) Finally, you will be able to save your script inside the newly created repository. Enter the name “hello_world” and click OK (Fig. F1.0.6). -![Fig. F1.0.6 Saving a file](../images/F1/image37.png) +![Fig. F1.0.6 Saving a file](images/F1/image37.png) Once the script is saved, it will appear in the script manager panel (Fig. F1.0.7). The scripts are saved in the cloud and will always be available to you when you open the Code Editor. -![Fig. F1.0.7 The script manager](../images/F1/image24.png) +![Fig. F1.0.7 The script manager](images/F1/image24.png) @@ -150,7 +150,7 @@ print(cities); If you look at the output in the Console, you will see “List” with an expander arrow (▹) next to it. Clicking on the arrow will expand the list and show you its content. You will notice that along with the four items in the list, there is a number next to each value. This is the index of each item. It allows you to refer to each item in the list using a numeric value that indicates its position in the list. -![Fig. F1.0.8 A JavaScript list](../images/F1/image10.png) +![Fig. F1.0.8 A JavaScript list](images/F1/image10.png) @@ -174,7 +174,7 @@ print(cityData); We can use multiple lines to define the object. Only when we put in the semicolon (;) is the command considered complete. The object will be printed in the Console. You can see that instead of a numeric index, each item has a label. This is known as the key and can be used to retrieve the value of an item. -![Fig. F1.0.9 A JavaScript object](../images/F1/image40.png) +![Fig. F1.0.9 A JavaScript object](images/F1/image40.png) #### Functions {.unnumbered} @@ -191,7 +191,7 @@ print(greet('Readers')); ``` -![Fig. F1.0.10 JavaScript function output](../images/F1/image54.png) +![Fig. F1.0.10 JavaScript function output](images/F1/image54.png) #### Comments {.unnumbbered} @@ -219,7 +219,7 @@ Code Checkpoint F10a. The book’s repository contains a script that shows what The Earth Engine API is vast and provides objects and methods to do everything from simple math to advanced algorithms for image processing. In the Code Editor, you can switch to the Docs tab to see the API functions grouped by object types. The API functions have the prefix ee (for Earth Engine). -![Fig. F1.0.12 Earth Engine API docs](../images/F1/image59.png) +![Fig. F1.0.12 Earth Engine API docs](images/F1/image59.png) Let’s learn to use the API. Suppose you want to add two numbers, represented by the variables a and b, as below. Make a new script and enter the following: @@ -233,7 +233,7 @@ In Sect. 1, you learned how to store numbers in variables, but not how to do any Looking at the Docs tab, you will find a group of methods that can be called on an ee.Number. Expand it to see the various functions available to work with numbers. You will see the ee.Number function that creates an Earth Engine number object from a value. In the list of functions, there is an add function for adding two numbers. That’s what you use to add a and b. -![Fig. F1.0.13 ee.Number module](../images/F1/image13.png) +![Fig. F1.0.13 ee.Number module](images/F1/image13.png) To add a and b, we first create an ee.Number object from variable a with ee.Number(a). And then we can use the add(b) call to add the value of b to it. The following code shows the syntax and prints the result which, of course, is the value 3. @@ -249,7 +249,7 @@ By now you may have realized that when learning to program in Earth Engine, you Here’s another example to drive this point home. Let’s say you are working on a task that requires you to create a list of years from 1980 to 2020 with a five-year interval. If you are faced with this task, the first step is to switch to the Docs tab and open the ee.List module. Browse through the functions and see if there are any functions that can help. You will notice a function ee.List.sequence. Clicking on it will bring up the documentation of the function. -![Fig. F1.0.14 The ee.List.sequence function](../images/F1/image65.png) +![Fig. F1.0.14 The ee.List.sequence function](images/F1/image65.png) The function ee.List.sequence is able to generate a sequence of numbers from a given start value to the end value. It also has an optional parameter step to indicate the increment between each number. We can create a ee.List of numbers representing years from 1980 to 2020, counting by 5, by calling this predefined function with the following values: start = 1980, end = 2020, and step = 5. @@ -260,7 +260,7 @@ print(yearList); The output printed in the Console will show that the variable yearList indeed contains the list of years with the correct interval. -![Fig. F1.0.15 Output of ee.List.sequence function](../images/F1/image29.png) +![Fig. F1.0.15 Output of ee.List.sequence function](images/F1/image29.png) You just accomplished a moderately complex programming task with the help of Earth Engine API. @@ -344,7 +344,7 @@ print(first_image); In the Console panel, you may need to click the expander arrows to show the information. You should be able to read that this image consists of 19 different bands. For each band, the metadata lists four properties, but for now let’s simply note that the first property is a name or label for the band enclosed in quotation marks. For example, the name of the first band is “SR_B1” (Fig. F1.1.1). -![Fig. F1.1.1 Image metadata printed to Console panel](../images/F1/image66.png) +![Fig. F1.1.1 Image metadata printed to Console panel](images/F1/image66.png) A satellite sensor like Landsat 5 measures the magnitude of radiation in different portions of the electromagnetic spectrum. The first six bands in our image ("SR_B1" through "SR_B7") contain measurements for six different portions of the spectrum. The first three bands measure visible portions of the spectrum, or quantities of blue, green, and red light. The other three bands measure infrared portions of the spectrum that are not visible to the human eye. @@ -389,7 +389,7 @@ Can you recognize any features in the image? By comparing it to the standard Goo Let’s explore this image with the Inspector tool. When you click on the Inspector tab on the right side of the Code Editor (Fig. F1.1.2, area A), your cursor should now look like crosshairs. When you click on a location in the image, the Inspector panel will report data for that location under three categories as follows: -![Fig. F1.1.2 Image data reported through the Inspector panel](../images/F1/image69.png) +![Fig. F1.1.2 Image data reported through the Inspector panel](images/F1/image69.png) @@ -430,7 +430,7 @@ Map.addLayer( In the code above, notice that we included two additional parameters to the Map.addLayer call. One parameter controls whether or not the layer is shown on the screen when the layer is drawn. It may be either 1 (shown) or 0 (not shown). The other parameter defines the opacity of the layer, or your ability to “see through” the map layer. The opacity value can range between 0 (transparent) and 1 (opaque). -![Fig. F1.1.3 Three bands from the Landsat image, drawn as three different grayscale layers](../images/F1/image36.png) +![Fig. F1.1.3 Three bands from the Landsat image, drawn as three different grayscale layers](images/F1/image36.png) Do you see how these new parameters influence the map layer displays (Fig. F1.1.3)? For Layer 2, we set the shown parameter as 0. For Layer 3, we set the opacity parameter as 0. As a result, neither layer is visible to us when we first run the code. We can make each layer visible with controls in the Layers manager checklist on the map (at top right). Expand this list and you should see the names that we gave each layer when we added them to the map. Each name sits between a checkbox and an opacity slider. To make Layer 2 visible, click the checkbox (Fig. F1.1.3, area A). To make Layer 3 visible, move the opacity slider to the right (Fig. F1.1.3, area B). @@ -463,7 +463,7 @@ Map.addLayer( The result (Fig. F1.1.4) looks like the world we see, and is referred to as a natural-color composite, because it naturally pairs the spectral ranges of the image bands to display colors. Also called a true-color composite, this image shows the red spectral band with shades of red, the green band with shades of green, and the blue band with shades of blue. We specified the pairing simply through the order of the bands in the list: B3, B2, B1. Because bands 3, 2, and 1 of Landsat 5 correspond to the real-world colors of red, green, and blue, the image resembles the world that we would see outside the window of a plane or with a low-flying drone. -![Fig. F1.1.4 True-color composite](../images/F1/image39.png) +![Fig. F1.1.4 True-color composite](images/F1/image39.png) ### False-Color Composites @@ -481,7 +481,7 @@ Map.addLayer( In this false-color composite (Fig. F1.1.5), the display colors no longer pair naturally with the bands. This particular example, which is more precisely referred to as a color-infrared composite, is a scene that we could not observe with our eyes, but that you can learn to read and interpret. Its meaning can be deciphered logically by thinking through what is passed to the red, green, and blue color channels. -![Fig. F1.1.5 Color-infrared image (a false-color composite)](../images/F1/image21.png) +![Fig. F1.1.5 Color-infrared image (a false-color composite)](images/F1/image21.png) @@ -489,7 +489,7 @@ In this false-color composite (Fig. F1.1.5), the display colors no longer pair n Notice how the land on the northern peninsula appears bright red (Fig. F1.1.5, area A). This is because for that area, the pixel value of the first band (which is drawing the near-infrared brightness) is much higher relative to the pixel value of the other two bands. You can check this by using the Inspector tool. Try zooming into a part of the image with a red patch (Fig. F1.1.5, area B) and clicking on a pixel that appears red. Then expand the “False Color” layer in the Inspector panel (Fig. F1.1.6, area A), click the blue icon next to the layer name (Fig. F1.1.6, area B), and read the pixel value for the three bands of the composite (Fig. F1.1.6, area C). The pixel value for B4 should be much greater than for B3 or B2. -![Fig. F1.1.6 Values of B4, B3, B2 bands for a pixel that appears bright red](../images/F1/image22.png) +![Fig. F1.1.6 Values of B4, B3, B2 bands for a pixel that appears bright red](images/F1/image22.png) In the bottom left corner of the image (Fig. F1.1.5, area C), rivers and lakes appear very dark, which means that the pixel value in all three bands is low. However, sediment plumes fanning from the river into the sea appear with blue and cyan tints (Fig. F1.1.5, area D). If they look like primary blue, then the pixel value for the second band (B3) is likely higher than the first (B4) and third (B2) bands. If they appear more like cyan, an additive color, it means that the pixel values of the second and third bands are both greater than the first. @@ -503,16 +503,16 @@ Map.addLayer( min: 8000, max: 17000}, 'Short wave false color'); ``` -![Fig. F1.1.7 Shortwave infrared false-color composite](../images/F1/image4.png) +![Fig. F1.1.7 Shortwave infrared false-color composite](images/F1/image4.png) To compare the two false-color composites, zoom into the area shown in the two pictures of Fig. F1.1.8. You should notice that bright red locations in the left composite appear bright green in the right composite. Why do you think that is? Does the image on the right show new distinctions not seen in the image on the left? If so, what do you think they are? -![](../images/F1/image25.png) +![](images/F1/image25.png) -![Fig. F1.1.8 Near-infrared versus shortwave infrared false-color composites](../images/F1/image8.png) +![Fig. F1.1.8 Near-infrared versus shortwave infrared false-color composites](images/F1/image8.png) ::: {.callout-note} @@ -547,7 +547,7 @@ The global nighttime lights image represents the average brightness of nighttime With the zoom controls on the map, you can zoom out to see the bright spot of Shanghai, the large blob of Seoul to the north and east, the darkness of North Korea except for the small dot of Pyongyang, and the dense strips of lights of Japan and the west coast of Taiwan (Fig. F1.1.10). -![Fig. F1.1.10 Stable nighttime lights in 1993](../images/F1/image34.png) +![Fig. F1.1.10 Stable nighttime lights in 1993](images/F1/image34.png) @@ -585,7 +585,7 @@ Next, the code uses the addBands method to create a new, three-band image that w Finally, the code prints metadata to the Console and adds the layer to the map as an RGB composite using Map.addLayer. If you look at the printed metadata, you should see under the label “change image” that our image is composed of three bands, with each band named after a year. You should also notice the order of the bands in the image: 2013, 2003, 1993. This order determines the color channels used to represent each slice of time in the composite: 2013 as red, 2003 as green, and 1993 as blue (Fig. F1.1.11). -![Fig. F1.1.11 RGB composite of stable nighttime lights (2013, 2003, 1993)](../images/F1/image51.png) +![Fig. F1.1.11 RGB composite of stable nighttime lights (2013, 2003, 1993)](images/F1/image51.png) We can now read the colors displayed on the layer to interpret different kinds of changes in nighttime lights across the planet over two decades. Pixels that appear white have high brightness in all three years. You can use the Inspector panel to confirm this. Click on the Inspector panel to change the cursor to a crosshair and then click on a pixel that appears white. Look under the Pixel category of the Inspector panel for the “Change composite” layer. The pixel value for each band should be high (at or near 63). @@ -600,13 +600,13 @@ When you zoom out from Shanghai, you will likely notice that each map layer redr In addition to urban change, the layer also shows changes in resource extraction activities that produce bright lights. Often, these activities produce lights that are stable over the span of a year (and therefore included in the “stable lights” band), but are not sustained over the span of a decade or more. For example, in the Korea Strait (between South Korea and Japan), you can see geographic shifts of fishing fleets that use bright halogen lights to attract squid and other sea creatures towards the water surface and into their nets. Bluish pixels were likely fished more heavily in 1993 and became used less frequently by 2003, while greenish pixels were likely fished more heavily in 2003 and less frequently by 2013 (Fig. F1.1.11). -![Fig. F1.1.12 Large red blobs in North Dakota and Texas from fossil fuel extraction in specific years](../images/F1/image52.png) +![Fig. F1.1.12 Large red blobs in North Dakota and Texas from fossil fuel extraction in specific years](images/F1/image52.png) Similarly, fossil fuel extraction produces nighttime lights through gas flaring. If you pan out to North America (Fig. F1.1.12), red blobs in Alberta and North Dakota and a red swath in southeastern Texas all represent places where oil and gas extraction were absent in 1993 and 2003 but booming by 2013. Pan over to the Persian Gulf and you will see changes that look like holiday lights with dots of white, red, green, and blue appearing near each other; these distinguish stable and shifting locations of oil production. Blue lights in Syria near the border with Iraq signify the abandonment of oil fields after 1993 (Fig. F1.1.13). Pan further north and you will see another “holiday lights” display from oil and gas extraction around Surgut, Russia. In many of these places, you can check for oil and gas infrastructure by zooming in to a colored spot, making the lights layer not visible, and selecting the Satellite base layer (upper right). -![Fig. F1.1.13 Nighttime light changes in the Middle East](../images/F1/image48.png) +![Fig. F1.1.13 Nighttime light changes in the Middle East](images/F1/image48.png) As you explore this image, remember to check your interpretations with the Inspector panel by clicking on a pixel and reading the pixel value for each band. Refer back to the additive color figure to remember how the color system works. If you practice this, you should be able to read any RGB composite by knowing how colors relate to the relative pixel value of each band. This will empower you to employ false-color composites as a flexible and powerful method to explore and interpret geographic patterns and changes on Earth’s surface. @@ -710,7 +710,7 @@ Map.addLayer(landsat8, First, let’s examine the map output (Fig. F1.2.1). -![Fig. F1.2.1 USGS Landsat 8 Collection 2 Tier 1 Raw Scenes collection](../images/F1/image18.png) +![Fig. F1.2.1 USGS Landsat 8 Collection 2 Tier 1 Raw Scenes collection](images/F1/image18.png) Notice the high amount of cloud cover, and the “layered” look. Zoom out if needed. This is because Earth Engine is drawing each of the images that make up the ImageCollection one on top of the other. The striped look is the result of how the satellite collects imagery. The overlaps between images and the individual nature of the images mean that these are not quite ready for analysis; we will address this issue in future chapters. @@ -719,13 +719,13 @@ Notice the high amount of cloud cover, and the “layered” look. Zoom out if n Now examine the printed size on the Console. It will indicate that there are more than a million images in the dataset (Fig. F1.2.2). If you return to this lab in the future, the number will be even larger, since this active collection is continually growing as the satellite gathers more imagery. For the same reason, Fig. F1.2.1 might look slightly different on your map because of this. -![Fig. F1.2.2 Size of the entire Landsat 8 collection. Note that this number is constantly growing.](../images/F1/image9.png) +![Fig. F1.2.2 Size of the entire Landsat 8 collection. Note that this number is constantly growing.](images/F1/image9.png) Note that printing the ImageCollection returned an error message (Fig. F1.2.3), because calling print on an ImageCollection will write the name of every image in the collection to the Console. This is the result of an intentional safeguard within Earth Engine. We don’t want to see a million image names printed to the Console! -![Fig. F1.2.3. Error encountered when trying to print the names and information to the screen for too many elements](../images/F1/image71.png) +![Fig. F1.2.3. Error encountered when trying to print the names and information to the screen for too many elements](images/F1/image71.png) ::: {.callout-note} @@ -766,7 +766,7 @@ print('The size of the Winter Landsat 8 image collection is:', Examine the mapped landsatWinter (Fig. F1.2.4). As described in the previous chapter, the 5000 and the 15000 values in the visualization parameters of the Map.addLayer function of the code above refer to the minimum and maximum of the range of display values. -![Fig. F1.2.4 Landsat 8 Winter Collection](../images/F1/image38.png) +![Fig. F1.2.4 Landsat 8 Winter Collection](images/F1/image38.png) Now look at the size of the winter Landsat 8 collection. The number is significantly lower than the number of images in the entire collection. This is the result of filtering the dates to three months in the winter of 2020–2021. @@ -798,7 +798,7 @@ print('The size of the Minneapolis Winter Landsat 8 image collection is: ', If we uncheck the Winter Landsat 8 layer under Layers, we can see that only images that intersect our point have been selected (Fig. F1.2.5). Zoom in or out as needed. Note the printed size of the Minneapolis winter collection—we only have seven images. -![Fig. F1.2.5 Minneapolis Winter Collection filtered by bounds.](../images/F1/image62.png) +![Fig. F1.2.5 Minneapolis Winter Collection filtered by bounds.](images/F1/image62.png) The first still represents the map without zoom applied. The collection is shown inside the red circle. The second still represents the map after zoom was applied to the region. The red arrow indicates the point (in black) used to filter by bounds. @@ -828,7 +828,7 @@ Map.addLayer( The first command takes our stack of location-filtered images and selects the first image. When the layer is added to the Map area, you can see that only one image is returned—remember to uncheck the other layers to be able to visualize the full image (Fig. F1.2.6). We used the Map.centerObject to center the map on the landsatFirst image with a zoom level of 7 (zoom levels go from 0 to 24). -![Fig. F1.2.6 First Landsat image from the filtered set](../images/F1/image43.png) +![Fig. F1.2.6 First Landsat image from the filtered set](images/F1/image43.png) ::: {.callout-note} @@ -870,7 +870,7 @@ var landsat8SRimage = landsat8SR.filterDate('2014-03-18', '2014-03-19') print('Landsat 8 Surface Reflectance image', landsat8SRimage); ``` -![Fig. F1.2.7 Landsat 8 Surface Reflectance image bands and date](../images/F1/image30.png) +![Fig. F1.2.7 Landsat 8 Surface Reflectance image bands and date](images/F1/image30.png) Copy and paste the code below to add this image to the map with adjusted R,G, and B bands in the “bands” parameter for true-color display (see previous chapter). @@ -887,7 +887,7 @@ Map.addLayer(landsat8SRimage, max: 13000}, 'Landsat 8 SR'); ``` -![Fig. F1.2.8 Landsat 8 Surface Reflectance scene from March 18, 2014](../images/F1/image15.png) +![Fig. F1.2.8 Landsat 8 Surface Reflectance scene from March 18, 2014](images/F1/image15.png) Compare this image (Fig. F1.2.8) with the raw Landsat 8 images from the previous section (Fig. F1.2.6). Zoom in and out and pan the screen as needed. What do you notice? Save your script but don’t start a new one—we will keep adding code to this script. @@ -920,7 +920,7 @@ Map.addLayer(modisMonthlyRecent, {}, 'MODIS Monthly Burn'); Uncheck the other layers, and then pan and zoom around the map. Areas that have burned in the past month will show up as red (Fig. F1.2.11). Can you see where fires burned areas of California, USA? In Southern and Central Africa? Northern Australia? -![Fig. F1.2.11. MODIS Monthly Burn image over California](../images/F1/image19.png) +![Fig. F1.2.11. MODIS Monthly Burn image over California](images/F1/image19.png) ::: {.callout-note} @@ -970,7 +970,7 @@ Map.addLayer(methane2018, methaneVis, 'Methane'); Notice the different levels of methane over the African continent (Fig. F1.2.12). -![Fig. F1.2.12. Methane levels over the African continent on November 28, 2018](../images/F1/image56.png) +![Fig. F1.2.12. Methane levels over the African continent on November 28, 2018](images/F1/image56.png) ### Global Forest Change @@ -999,7 +999,7 @@ Map.addLayer(globalForest, treeCoverViz, 'Hansen 2000 Tree Cover'); Notice how areas with high tree cover (e.g., the Amazon) are greener and areas with low tree cover are darker (Fig. F1.2.15). In case you see an error on the Console such as “Cannot read properties of null,” don’t worry. Sometimes Earth Engine will show these transient errors, but they won’t affect the script in any way. -![Fig. F1.2.15 Global Forest Change 2000 tree cover layer](../images/F1/image68.png) +![Fig. F1.2.15 Global Forest Change 2000 tree cover layer](images/F1/image68.png) Copy and paste the code below to visualize the tree cover loss over the past 20 years. @@ -1018,7 +1018,7 @@ Map.addLayer(globalForest, treeLossYearViz, '2000-2020 Year of Loss'); Leave the previous 2000 tree cover layer checked and analyze the loss layer on top of it—yellow, orange, and red areas (Fig. F1.2.16). Pan and zoom around the map. Where has there been recent forest loss (which is shown in red)? -![Fig. F1.2.16 Global Forest Change 2000–2020 tree cover loss (yellow-red) and 2000 tree cover (black-green)](../images/F1/image16.png) +![Fig. F1.2.16 Global Forest Change 2000–2020 tree cover loss (yellow-red) and 2000 tree cover (black-green)](images/F1/image16.png) ::: {.callout-note} @@ -1048,7 +1048,7 @@ Map.addLayer(nasaDEM, { Uncheck the population layer and zoom in to examine the patterns of topography (Fig. F1.2.18). Can you see where a mountain range is located? Where is a river located? Try changing the minimum and maximum in order to make these features more visible. Save your script. -![](../images/F1/image61.png) +![](images/F1/image61.png) Fig. F1.2.18. NASADEM elevation @@ -1128,13 +1128,13 @@ Images and image collections form the basis of many remote sensing analyses in E Earth Engine’s search bar can be used to find imagery and to locate important information about datasets in Earth Engine. Let’s use the search bar, located above the Earth Engine code, to find out information about the Landsat 7 Collection 2 Raw Scenes. First, type “landsat 7 collection 2” into the search bar (Fig. F1.3.1). Without hitting Enter, matches to that search term will appear. -![Fig. F1.3.1 Searching for Landsat 7 in the search bar](../images/F1/image67.png) +![Fig. F1.3.1 Searching for Landsat 7 in the search bar](images/F1/image67.png) Now, click on USGS Landsat 7 Collection 2 Tier 1 Raw Scenes. A new inset window will appear (Fig. F1.3.2). -![Fig. F1.3.2 Inset window with information about the Landsat 7 dataset](../images/F1/image2.png) +![Fig. F1.3.2 Inset window with information about the Landsat 7 dataset](images/F1/image2.png) The inset window has information about the dataset, including a description, bands that are available, image properties, and terms of use for the data across the top. Click on each of these tabs and read the information provided. While you may not understand all of the information right now, it will set you up for success in future chapters. @@ -1146,19 +1146,19 @@ On the left-hand side of this window, you will see a range of dates when the dat For now, click on the small “pop out” button in the upper right corner of the window. This will open a new window with the same information (Fig. F1.3.3); you can keep this new window open and use it as a reference as you proceed. -![Fig. F1.3.3 The Data Catalog page for Landsat 7 with information about the dataset](../images/F1/image31.png) +![Fig. F1.3.3 The Data Catalog page for Landsat 7 with information about the dataset](images/F1/image31.png) Switch back to your code window. Your “landsat 7 collection 2” search term should still be in the search bar. This time, click the “Enter” key or click on the search magnifying glass icon. This will open a Search results inset window (Fig. F1.3.4). -![Fig. F1.3.4 Search results matching “landsat 7 collection 2”](../images/F1/image11.png) +![Fig. F1.3.4 Search results matching “landsat 7 collection 2”](images/F1/image11.png) This more complete search results inset window contains short descriptions about each of the datasets matching your search, to help you choose which dataset you want to use. Click on the Open in Catalog button to view these search results in the Earth Engine Data Catalog (Fig. F1.3.5). Note that you may need to click Enter in the data catalog search bar with your phrase to bring up the results in this new window. -![Fig. F1.3.5 Earth Engine Data Catalog results for the “landsat 7 collection 2” search term](../images/F1/image44.png) +![Fig. F1.3.5 Earth Engine Data Catalog results for the “landsat 7 collection 2” search term](images/F1/image44.png) Now that we know how to view this information, let’s dive into some important remote sensing terminology. @@ -1192,7 +1192,7 @@ Map.addLayer(tmImage, { bands: ['B4', 'B3', 'B2'], min: 0, max: 100}, 'TM'); ``` -![Fig. F1.3.10 Visualizing the TM imagery from the Landsat 5 satellite](../images/F1/image20.png) +![Fig. F1.3.10 Visualizing the TM imagery from the Landsat 5 satellite](images/F1/image20.png) #### Sentinel-2 MultiSpectral Instrument @@ -1222,7 +1222,7 @@ Map.addLayer(msiImage, { Compare the Sentinel imagery with the Landsat imagery, using the opacity slider. Notice how much more detail you can see on the airport terminal and surrounding landscape. The 10 m spatial resolution means that each pixel covers approximately 100 m2 of the Earth’s surface, a much smaller area than the TM imagery (900 m2). -![Fig. F1.3.11 Visualizing the MSI imagery](../images/F1/image1.png) +![Fig. F1.3.11 Visualizing the MSI imagery](images/F1/image1.png) #### National Agriculture Imagery Program (NAIP) @@ -1249,7 +1249,7 @@ Map.addLayer(naipImage, { The NAIP imagery is even more spatially detailed than the Sentinel-2 MSI imagery. However, we can see that our one NAIP image doesn’t totally cover the San Francisco airport. If you like, zoom out to see the boundaries of the NAIP image as we did for the Sentinel-2 MSI imagery. -![Fig. F1.3.13 NAIP color-IR composite over the San Francisco airport](../images/F1/image32.png) +![Fig. F1.3.13 NAIP color-IR composite over the San Francisco airport](images/F1/image32.png) @@ -1293,7 +1293,7 @@ var tmChart = ui.Chart.image.series({ Expand the features property of the printed ImageCollection in the Console output to see a List of all the images in the collection. Observe that the date of each image is part of the filename (e.g., LANDSAT/LT05/C02/T1/LT05_044034_19870628). -![Fig. F1.3.14 Landsat image name and feature properties](../images/F1/image3.png) +![Fig. F1.3.14 Landsat image name and feature properties](images/F1/image3.png) However, viewing this list doesn’t make it easy to see the temporal resolution of the dataset. We can use Earth Engine’s plotting functionality to visualize the temporal resolution of different datasets. For each of the different temporal resolutions, we will create a per-pixel chart of the NIR band that we mapped previously. To do this, we will use the ui.Chart.image.series function. @@ -1330,7 +1330,7 @@ print('TM Chart', tmChart); When you print the chart, it will have a point each time an image was collected by the TM instrument (Fig. F1.3.15). In the Console, you can move the mouse over the different points and see more information. Also note that you can expand the chart using the button in the upper right-hand corner. We will see many more examples of charts, particularly in the chapters in Part F4. -![Fig. F1.3.15 A chart showing the temporal cadence, or temporal resolution of the Landsat 5 TM instrument at the San Francisco airport](../images/F1/image47.png) +![Fig. F1.3.15 A chart showing the temporal cadence, or temporal resolution of the Landsat 5 TM instrument at the San Francisco airport](images/F1/image47.png) #### Sentinel-2 @@ -1350,7 +1350,7 @@ msiChart.setOptions(chartStyle); // Print the chart. print('MSI Chart', msiChart); ``` -![Fig. F1.3.16 A chart showing the t temporal resolution of the Sentinel-2 MSI instrument at the San Francisco airport](../images/F1/image60.png) +![Fig. F1.3.16 A chart showing the t temporal resolution of the Sentinel-2 MSI instrument at the San Francisco airport](images/F1/image60.png) Compare this Sentinel-2 graph (Fig. F1.3.16) with the Landsat graph you just produced (Fig. F1.3.15). Both cover a period of six months, yet there are many more points through time for the Sentinel-2 satellite, reflecting the greater temporal resolution. @@ -1422,7 +1422,7 @@ print(modisReflectanceChart); The resulting chart is shown in Fig. F1.3.17. Use the expand button in the upper right to see a larger version of the chart than the one printed to the Console. -![Fig. F1.3.17 Plot of TOA reflectance for MODIS](../images/F1/image50.png) +![Fig. F1.3.17 Plot of TOA reflectance for MODIS](images/F1/image50.png) #### EO-1 @@ -1471,13 +1471,13 @@ print(eo1Chart); The resulting chart is seen in Fig. F1.3.18. There are so many bands that their names only appear as “...”! -![Fig. F1.3.18 Plot of TOA reflectance for EO-1 as displayed in the Console. Note the button to expand the plot in the upper right hand corner.](../images/F1/image23.png) +![Fig. F1.3.18 Plot of TOA reflectance for EO-1 as displayed in the Console. Note the button to expand the plot in the upper right hand corner.](images/F1/image23.png) If we click on the expand icon in the top right corner of the chart, it’s a little easier to see the band identifiers, as shown in Fig. F1.3.19. -![Fig. F1.3.19 Expanded plot of TOA reflectance for EO-1](../images/F1/image70.png) +![Fig. F1.3.19 Expanded plot of TOA reflectance for EO-1](images/F1/image70.png) Compare this hyperspectral instrument chart with the multispectral chart we plotted above for MODIS. @@ -1544,7 +1544,7 @@ print('MSI Image Metadata', msiImage); Examine the object you’ve created in the Console (Fig. F1.3.20). Expand the image name, then the properties object. -![](../images/F1/image35.png) +![](images/F1/image35.png) Fig. F1.3.20 Checking the “CLOUDY_PIXEL_PERCENTAGE” property in the metadata for Sentinel-2 diff --git a/chapters/B2_Interpreting_Images.qmd b/chapters/B2_Interpreting_Images.qmd index 56dc581..8af84f9 100644 --- a/chapters/B2_Interpreting_Images.qmd +++ b/chapters/B2_Interpreting_Images.qmd @@ -55,7 +55,7 @@ Once images have been identified in Earth Engine, they can be viewed in a wide a Spectral indices are based on the fact that different objects and land covers on the Earth’s surface reflect different amounts of light from the Sun at different wavelengths. In the visible part of the spectrum, for example, a healthy green plant reflects a large amount of green light while absorbing blue and red light — which is why it appears green to our eyes. Light also arrives from the Sun at wavelengths outside what the human eye can see, and there are large differences in reflectances between living and nonliving land covers, and between different types of vegetation, both in the visible and outside the visible wavelengths. We visualized this earlier, in Chaps. F1.1 and F1.3 when we mapped color-infrared images (Fig. F2.0.1). -![Fig. F2.0.1 Mapped color-IR images from multiple satellite sensors that we mapped in Chap. F1.3. The near infrared spectrum is mapped as red, showing where there are high amounts of healthy vegetation.](../images/F2/image39.png) +![Fig. F2.0.1 Mapped color-IR images from multiple satellite sensors that we mapped in Chap. F1.3. The near infrared spectrum is mapped as red, showing where there are high amounts of healthy vegetation.](images/F2/image39.png) @@ -63,7 +63,7 @@ Spectral indices are based on the fact that different objects and land covers on If we graph the amount of light (reflectance) at different wavelengths that an object or land cover reflects, we can visualize this more easily (Fig. F2.0.2). For example, look at the reflectance curves for soil and water in the graph below. Soil and water both have relatively low reflectance at wavelengths around 300 nm (ultraviolet and violet light). Conversely, at wavelengths above 700 nm (red and infrared light) soil has relatively high reflectance, while water has very low reflectance. Vegetation, meanwhile, generally reflects large amounts of near infrared light, relative to other land covers. -![Fig. F2.0.2 A graph of the amount of reflectance for different objects on the Earth’s surface at different wavelengths in the visible and infrared portions of the electromagnetic spectrum. 1 micrometer (µm) = 1,000 nanometers (nm).](../images/F2/image32.png) +![Fig. F2.0.2 A graph of the amount of reflectance for different objects on the Earth’s surface at different wavelengths in the visible and infrared portions of the electromagnetic spectrum. 1 micrometer (µm) = 1,000 nanometers (nm).](images/F2/image32.png) @@ -94,7 +94,7 @@ The red and near-infrared bands provide a lot of information about vegetation du Soon after the launch of Landsat 1 in 1972, analysts worked to devise a robust single value that would convey the health of vegetation along a scale of −1 to 1. This yielded the NDVI, using the formula: -![](../images/F2/image1.png) (F2.0.1) +![](images/F2/image1.png) (F2.0.1) where NIR and red refer to the brightness of each of those two bands. As seen in Chaps. F1.1 and F1.2, this brightness might be conveyed in units of reflectance, radiance, or digital number (DN); the NDVI is intended to give nearly equivalent values across platforms that use these wavelengths. The general form of this equation is called a “normalized difference”—the numerator is the “difference” and the denominator “normalizes” the value. Outputs for NDVI vary between −1 and 1. High amounts of green vegetation have values around 0.8–0.9. Absence of green leaves gives values near 0, and water gives values near −1. @@ -129,7 +129,7 @@ Map.addLayer(sfoImage, { ``` -![Fig. F2.0.3 False color Sentinel-2 imagery of San Francisco and surroundings](../images/F2/image46.png) +![Fig. F2.0.3 False color Sentinel-2 imagery of San Francisco and surroundings](images/F2/image46.png) @@ -162,7 +162,7 @@ Map.addLayer(ndvi, { Examine the resulting index, using the Inspector to pick out pixel values in areas of vegetation and non-vegetation if desired. -![Fig. F2.0.4 NDVI calculated using Sentinel-2. Remember that outputs for NDVI vary between −1 and 1. High amounts of green vegetation have values around 0.8–0.9. Absence of green leaves gives values near 0, and water gives values near −1.](../images/F2/image50.png) +![Fig. F2.0.4 NDVI calculated using Sentinel-2. Remember that outputs for NDVI vary between −1 and 1. High amounts of green vegetation have values around 0.8–0.9. Absence of green leaves gives values near 0, and water gives values near −1.](images/F2/image50.png) @@ -199,7 +199,7 @@ As mentioned, the normalized difference approach is used for many different indi The Normalized Difference Water Index (NDWI) was developed by Gao (1996) as an index of vegetation water content. The index is sensitive to changes in the liquid content of vegetation canopies. This means that the index can be used, for example, to detect vegetation experiencing drought conditions or differentiate crop irrigation levels. In dry areas, crops that are irrigated can be differentiated from natural vegetation. It is also sometimes called the Normalized Difference Moisture Index (NDMI). NDWI is formulated as follows: -![(F2.0.2)](../images/F2/image2.png) +![(F2.0.2)](images/F2/image2.png) where NIR is near-infrared, centered near 860 nm (0.86 μm), and SWIR is short-wave infrared, centered near 1,240 nm (1.24 μm). @@ -223,7 +223,7 @@ Map.addLayer(ndwi, { Examine the areas of the map that NDVI identified as having a lot of vegetation. Notice which are more blue. This is vegetation that has higher water content. -![Fig. F2.0.5 NDWI displayed for Sentinel-2 over San Francisco](../images/F2/image40.png) +![Fig. F2.0.5 NDWI displayed for Sentinel-2 over San Francisco](images/F2/image40.png) @@ -265,7 +265,7 @@ Map.addLayer(seaNDVI, ``` -![Fig. F2.0.6 NDVI image of Sentinel-2 imagery over Seattle, Washington, USA](../images/F2/image30.png) +![Fig. F2.0.6 NDVI image of Sentinel-2 imagery over Seattle, Washington, USA](images/F2/image30.png) @@ -293,7 +293,7 @@ Map.addLayer(seaVeg, The gt method is from the family of Boolean operators — that is, gt is a function that performs a test in each pixel and returns the value 1 if the test evaluates to true, and 0 otherwise. Here, for every pixel in the image, it tests whether the NDVI value is greater than 0.5. When this condition is met, the layer seaVeg gets the value 1. When the condition is false, it receives the value 0. -![Fig. F2.0.7 Thresholded forest and non-forest image based on NDVI for Seattle, Washington, USA](../images/F2/image47.png) +![Fig. F2.0.7 Thresholded forest and non-forest image based on NDVI for Seattle, Washington, USA](images/F2/image47.png) @@ -337,7 +337,7 @@ Map.addLayer(seaWhere, There are a few interesting things to note about this code that you may not have seen before. First, we’re not defining a new variable for each where call. As a result, we can perform many where calls without creating a new variable each time and needing to keep track of them. Second, when we created the starting image, we set the value to 1. This means that we could easily set the bottom and top values with one where clause each. Finally, while we did not do it here, we can combine multiple where clauses using and and or. For example, we could identify pixels with an intermediate level of NDVI using seaNDVI.gte(-0.1).and(seaNDVI.lt(0.5)). -![Fig. F2.0.8 Thresholded water, forest, and non-forest image based on NDVI for Seattle, Washington, USA.](../images/F2/image37.png) +![Fig. F2.0.8 Thresholded water, forest, and non-forest image based on NDVI for Seattle, Washington, USA.](images/F2/image37.png) @@ -356,7 +356,7 @@ Map.addLayer(seaVeg.mask(), {}, 'seaVeg Mask'); ``` -![Fig. F2.0.9 The existing mask for the seaVeg layer we created previously](../images/F2/image23.png) +![Fig. F2.0.9 The existing mask for the seaVeg layer we created previously](images/F2/image23.png) @@ -393,7 +393,7 @@ Map.addLayer(maskedVeg, Turn off all of the other layers. You can see how the maskedVeg layer now has masked out all non-forested areas. -![Fig. F2.0.10 An updated mask now displays only the forested areas. Non-forested areas are masked out and transparent.](../images/F2/image26.png) +![Fig. F2.0.10 An updated mask now displays only the forested areas. Non-forested areas are masked out and transparent.](images/F2/image26.png) @@ -407,7 +407,7 @@ Map.addLayer(maskedVeg.mask(), {}, 'maskedVeg Mask'); ``` -![Fig. F2.0.11 The updated mask. Areas of non-forest are now masked out as well (black areas of the image).](../images/F2/image33.png) +![Fig. F2.0.11 The updated mask. Areas of non-forest are now masked out as well (black areas of the image).](images/F2/image33.png) @@ -438,7 +438,7 @@ Map.addLayer(seaRemap, Use the inspector to compare values between our original seaWhere (displayed as Water, Non-Forest, Forest) and the seaRemap, marked as “Remapped Values.” Click on a forested area and you should see that the Remapped Values should be 10, instead of 2 (Fig. F2.0.12). -![Fig. F2.0.12 For forested areas, the remapped layer has a value of 10, compared with the original layer, which has a value of 2. You may have more layers in your Inspector.](../images/F2/image28.png) +![Fig. F2.0.12 For forested areas, the remapped layer has a value of 10, compared with the original layer, which has a value of 2. You may have more layers in your Inspector.](images/F2/image28.png) @@ -567,7 +567,7 @@ Classification is addressed in a broad range of fields, including mathematics, s In remote sensing, image classification is an attempt to categorize all pixels in an image into a finite number of labeled land cover and/or land use classes. The resulting classified image is a simplified thematic map derived from the original image (Fig. F2.1.1). Land cover and land use information is essential for many environmental and socioeconomic applications, including natural resource management, urban planning, biodiversity conservation, agricultural monitoring and carbon accounting. -![Fig. F2.1.1 Image classification concept](../images/F2/image48.png) +![Fig. F2.1.1 Image classification concept](images/F2/image48.png) @@ -622,7 +622,7 @@ Map.addLayer(landsat, visParams, 'Landsat 8 image'); ``` -![Fig. F2.1.2 Landsat image](../images/F2/image44.png) +![Fig. F2.1.2 Landsat image](images/F2/image44.png) @@ -639,7 +639,7 @@ Using the Geometry Tools, we will create points on the Landsat image that repres In the Geometry Tools, click on the marker option (Fig. F2.1.3). This will create a point geometry which will show up as an import named “geometry”. Click on the gear icon to configure this import. -![Fig. F2.1.3 Creating a new layer in the Geometry Imports](../images/F2/image22.png) +![Fig. F2.1.3 Creating a new layer in the Geometry Imports](images/F2/image22.png) @@ -653,7 +653,7 @@ Hexadecimal values are used throughout the digital world to represent specific c Returning to the coloring of the forest points, the hexadecimal value “589400” is a little bit of red, about twice as much green and no blue: the deep green seen in Figure F2.1.4. Enter that value, with or without the “#” in front, and click OK after finishing the configuration. -![Fig. F2.1.4 Edit geometry layer properties](../images/F2/image36.png) +![Fig. F2.1.4 Edit geometry layer properties](images/F2/image36.png) @@ -661,7 +661,7 @@ Returning to the coloring of the forest points, the hexadecimal value “589400 Now, in the Geometry Imports, we will see that the import has been renamed forest. Click on it to activate the drawing mode (Fig. F2.1.5) in order to start collecting forest points. -![Fig. F2.1.5 Activate forest layer to start collection](../images/F2/image29.png) +![Fig. F2.1.5 Activate forest layer to start collection](images/F2/image29.png) @@ -669,7 +669,7 @@ Now, in the Geometry Imports, we will see that the import has been renamed fores Now, start collecting points over forested areas (Fig. F2.1.6). Zoom in and out as needed. You can use the satellite basemap to assist you, but the basis of your collection should be the Landsat image. Remember that the more points you collect, the more the classifier will learn from the information you provide. For now, let’s set a goal to collect 25 points per class. Click Exit next to Point drawing (Fig. F2.1.5) when finished. -![Fig. F2.1.6 Forest points](../images/F2/image38.png) +![Fig. F2.1.6 Forest points](images/F2/image38.png) @@ -677,7 +677,7 @@ Now, start collecting points over forested areas (Fig. F2.1.6). Zoom in and out Repeat the same process for the other classes by creating new layers (Fig. F2.1.7). Don’t forget to import using the FeatureCollection option as mentioned above. For the developed class, collect points over urban areas. For the water class, collect points over the Ligurian Sea, and also look for other bodies of water, like rivers. For the herbaceous class, collect points over agricultural fields. Remember to set the “class” property for each class to its corresponding code (see Table 2.1.1) and click Exit once you finalize collecting points for each class as mentioned above. We will be using the following hexadecimal colors for the other classes: #FF0000 for developed, #1A11FF for water, and #D0741E for herbaceous. -![Fig. F2.1.7 New layer option in Geometry Imports](../images/F2/image41.png) +![Fig. F2.1.7 New layer option in Geometry Imports](images/F2/image41.png) @@ -685,7 +685,7 @@ Repeat the same process for the other classes by creating new layers (Fig. F2.1. You should now have four FeatureCollection imports named forest, developed, water, and herbaceous (Fig. F2.1.8). -![Fig. F2.1.8 Example of training points](../images/F2/image42.png) +![Fig. F2.1.8 Example of training points](images/F2/image42.png) @@ -733,7 +733,7 @@ var classifierTraining = landsat.select(predictionBands) You can check whether the classifierTraining object extracted the properties of interest by printing it and expanding the first feature. You should see the band and class information (Fig. F2.1.9). -![Fig. F2.1.9 Example of extracted band information for one point of class 0 (forest)](../images/F2/image20.png) +![Fig. F2.1.9 Example of extracted band information for one point of class 0 (forest)](images/F2/image20.png) @@ -741,7 +741,7 @@ You can check whether the classifierTraining object extracted the properties of Now we can choose a classifier. The choice of classifier is not always obvious, and there are many options from which to pick — you can quickly expand the ee.Classifier object under Docs to get an idea of how many options we have for image classification. Therefore, we will be testing different classifiers and comparing their results. We will start with a Classification and Regression Tree (CART) classifier, a well-known classification algorithm (Fig. F2.1.10) that has been around for decades. -![Fig. F2.1.10 Example of a decision tree for satellite image classification. Values and classes are hypothetical.](../images/F2/image25.png) +![Fig. F2.1.10 Example of a decision tree for satellite image classification. Values and classes are hypothetical.](images/F2/image25.png) @@ -796,7 +796,7 @@ Inspect the result: Activate the Landsat composite layer and the satellite basem * Add more predictors. We can try adding spectral indices to the input variables; this way, we are feeding the classifier new, unique information about each class. For example, there is a good chance that a vegetation index specialized for detecting vegetation health (e.g., NDVI) would improve the developed versus herbaceous classification. -![Fig. F2.1.11 CART classification](../images/F2/image21.png) +![Fig. F2.1.11 CART classification](images/F2/image21.png) @@ -804,7 +804,7 @@ Inspect the result: Activate the Landsat composite layer and the satellite basem For now, we will try another supervised learning classifier that is widely used: Random Forests (RF). The RF algorithm (Breiman 2001, Pal 2005) builds on the concept of decision trees, but adds strategies to make them more powerful. It is called a “forest” because it operates by constructing a multitude of decision trees. As mentioned previously, a decision tree creates the rules which are used to make decisions. A Random Forest will randomly choose features and make observations, build a forest of decision trees and then use the full set of trees to estimate the class. It is a great choice when you do not have a lot of insight about the training data. -![Fig. F2.1.12 General concept of Random Forests](../images/F2/image27.png) +![Fig. F2.1.12 General concept of Random Forests](images/F2/image27.png) @@ -837,7 +837,7 @@ Note that in the ee.Classifier.smileRandomForest documentation (Docs tab), there Inspect the result (Fig. F2.1.13). How does this classified image differ from the CART one? Is the classifications better or worse? Zoom in and out and change the transparency of layers as needed. In Chap. F2.2, you will see more systematic ways to assess what is better or worse, based on accuracy metrics. -![Fig. F2.1.13 Random Forest classified image](../images/F2/image34.png) +![Fig. F2.1.13 Random Forest classified image](images/F2/image34.png) @@ -880,7 +880,7 @@ var training = landsat.sample({ Now we can instantiate a clusterer and train it. As with the supervised algorithms, there are many unsupervised algorithms to choose from. We will use the k-means clustering algorithm, which is a commonly used approach in remote sensing. This algorithm identifies groups of pixels near each other in the spectral space (image x bands) by using an iterative regrouping strategy. We define a number of clusters, k, and then the method randomly distributes that number of seed points into the spectral space. A large sample of pixels is then grouped into its closest seed, and the mean spectral value of this group is calculated. That mean value is akin to a center of mass of the points, and is known as the centroid. Each iteration recalculates the class means and reclassifies pixels with respect to the new means. This process is repeated until the centroids remain relatively stable and only a few pixels change from class to class on subsequent iterations. -![Fig. F2.1.14 K-means visual concept](../images/F2/image35.png) +![Fig. F2.1.14 K-means visual concept](images/F2/image35.png) @@ -906,7 +906,7 @@ Map.addLayer(Kclassified.randomVisualizer(), {}, 'K-means classified - random ``` -![Fig. F2.1.15 K-means classification](../images/F2/image31.png) +![Fig. F2.1.15 K-means classification](images/F2/image31.png) @@ -1135,10 +1135,10 @@ In this case, the classifier correctly identified 307 forest pixels, wrongly cla The overall accuracy tells us what proportion of the reference data was classified correctly, and is calculated as the total number of correctly identified pixels divided by the total number of pixels in the sample. -![](../images/F2/image6.png) +![](images/F2/image6.png) -In this case, the overall accuracy is 96.8%, calculated using (![](../images/F2/image7.png). +In this case, the overall accuracy is 96.8%, calculated using (![](images/F2/image7.png). Two other important accuracy metrics are the producer’s accuracy and the user’s accuracy, also referred to as the “recall” and the “precision,” respectively. Importantly, these metrics quantify aspects of per-class accuracy. @@ -1147,31 +1147,31 @@ Two other important accuracy metrics are the producer’s accuracy and the user The producer’s accuracy is the accuracy of the map from the point of view of the map maker (the “producer”), and is calculated as the number of correctly identified pixels of a given class divided by the total number of pixels actually in that class. The producer’s accuracy for a given class tells us the proportion of the pixels in that class that were classified correctly. -![](../images/F2/image8.png) +![](images/F2/image8.png) -![](../images/F2/image9.png) +![](images/F2/image9.png) -In this case, the producer’s accuracy for the forest class is 95.6%, calculated using ![](../images/F2/image10.png)). The producer’s accuracy for the non-forest class is 97.3%, calculated from ![](../images/F2/image11.png)). +In this case, the producer’s accuracy for the forest class is 95.6%, calculated using ![](images/F2/image10.png)). The producer’s accuracy for the non-forest class is 97.3%, calculated from ![](images/F2/image11.png)). The user’s accuracy (also called the “consumer’s accuracy”) is the accuracy of the map from the point of view of a map user, and is calculated as the number of correctly identified pixels of a given class divided by the total number of pixels claimed to be in that class. The user’s accuracy for a given class tells us the proportion of the pixels identified on the map as being in that class that are actually in that class on the ground. -![](../images/F2/image12.png) +![](images/F2/image12.png) -![](../images/F2/image13.png) +![](images/F2/image13.png) -In this case, the user’s accuracy for the forest class is 94.5%, calculated using ![](../images/F2/image14.png)). The user’s accuracy for the non-forest class is 97.9%, calculated from ![](../images/F2/image15.png)). +In this case, the user’s accuracy for the forest class is 94.5%, calculated using ![](images/F2/image14.png)). The user’s accuracy for the non-forest class is 97.9%, calculated from ![](images/F2/image15.png)). Fig. F2.2.1 helps visualize the rows and columns used to calculate each accuracy. -![Fig. F2.2.1 Confusion matrix for a binary classification where the classes are “positive” (forest) and “negative” (non-forest), with accuracy metrics](../images/F2/image43.png) +![Fig. F2.2.1 Confusion matrix for a binary classification where the classes are “positive” (forest) and “negative” (non-forest), with accuracy metrics](images/F2/image43.png) @@ -1179,25 +1179,25 @@ Fig. F2.2.1 helps visualize the rows and columns used to calculate each accuracy It is very common to talk about two types of error when addressing remote-sensing classification accuracy: omission errors and commission errors. Omission errors refer to the reference pixels that were left out of (omitted from) the correct class in the classified map. In a two-class system, an error of omission in one class will be counted as an error of commission in another class. Omission errors are complementary to the producer’s accuracy. -![](../images/F2/image16.png) +![](images/F2/image16.png) Commission errors refer to the class pixels that were erroneously classified in the map and are complementary to the user’s accuracy. -![](../images/F2/image17.png) +![](images/F2/image17.png) Finally, another commonly used accuracy metric is the kappa coefficient, which evaluates how well the classification performed as compared to random. The value of the kappa coefficient can range from −1 to 1: a negative value indicates that the classification is worse than a random assignment of categories would have been; a value of 0 indicates that the classification is no better or worse than random; and a positive value indicates that the classification is better than random. -![](../images/F2/image18.png) +![](images/F2/image18.png) The chance agreement is calculated as the sum of the product of row and column totals for each class, and the observed accuracy is the overall accuracy. Therefore, for our example, the kappa coefficient is 0.927. -![](../images/F2/image19.png) +![](images/F2/image19.png) Now, let’s go back to the script. In Earth Engine, there are API calls for these operations. Note that our confusion matrix will be a 4 x 4 table, since we have four different classes. @@ -1270,7 +1270,7 @@ print(ui.Chart.array.values({ ``` -![Fig. F2.2.2 Chart showing accuracy per number of Random Forest trees](../images/F2/image45.png) +![Fig. F2.2.2 Chart showing accuracy per number of Random Forest trees](images/F2/image45.png) diff --git a/chapters/B3_Image_Series.qmd b/chapters/B3_Image_Series.qmd index 01bc072..7c24c6d 100644 --- a/chapters/B3_Image_Series.qmd +++ b/chapters/B3_Image_Series.qmd @@ -77,7 +77,7 @@ This counterexample would also have other complications—such as the need to tr The first part of the filter, map, reduce paradigm is “filtering” to get a smaller ImageCollection from a larger one. As in the milk example, filters take a large set of items, limit it by some criterion, and return a smaller set for consideration. Here, filters take an ImageCollection, limit it by some criterion of date, location, or image characteristics, and return a smaller ImageCollection (Fig. F4.0.1). -![Fig. 4.0.1 Filter, map, reduce as applied to image collections in Earth Engine](../images/F4/image66.png) +![Fig. 4.0.1 Filter, map, reduce as applied to image collections in Earth Engine](images/F4/image66.png) As described first in Chap. F1.2, the Earth Engine API provides a set of filters for the ImageCollection type. The filters can limit an ImageCollection based on spatial, temporal, or attribute characteristics. Filters were used in Parts F1, F2, and F3 without much context or explanation, to isolate an image from an ImageCollection for inspection or manipulation. The information below should give perspective on that work while introducing some new tools for filtering image collections. @@ -235,9 +235,9 @@ Map.addLayer(L5EVImedian, { palette: ['red', 'white', 'green'] }, 'Median EVI'); ``` -![](../images/F4/image43.png) +![](images/F4/image43.png) -![Fig. 4.0.2 The effects of two reducers on mapped EVI values in a filtered ImageCollection: mean image (above), and median image (below)](../images/F4/image67.png) +![Fig. 4.0.2 The effects of two reducers on mapped EVI values in a filtered ImageCollection: mean image (above), and median image (below)](images/F4/image67.png) There are many more reducers that work with an ImageCollection to produce a wide range of summary statistics. Reducers are not limited to returning only one item from the reduction. The minMax reducer, for example, returns a two-band image for each band it is given, one for the minimum and one for the maximum. @@ -317,7 +317,7 @@ Map.addLayer(filteredIC, {}, 'TOA image collection'); ``` The three selected bands (which correspond to SWIR1, NIR, and Red) display a false-color image that accentuates differences between different land covers (e.g., concrete, vegetation) in Lisbon. With the Inspector tab highlighted (Fig. F4.1.1), clicking on a point will bring up the values of bands 6, 5, and 4 from each of the images. If you open the Series option, you’ll see the values through time. For the specified point and for all other points in Lisbon (since they are all enclosed in the same Landsat scene), there are 16 images gathered in 2020. By following one of the graphed lines (in blue, yellow, or red) with your finger, you should be able to count that many distinct values. Moving the mouse along the lines will show the specific values and the image dates. -![Fig. F4.1.1 Inspect values in an ImageCollection at a selected point by making use of the Inspector tool in the Code Editor](../images/F4/image22.png) +![Fig. F4.1.1 Inspect values in an ImageCollection at a selected point by making use of the Inspector tool in the Code Editor](images/F4/image22.png) We can also show this kind of chart automatically by making use of the ui.Chart function of the Earth Engine API. The following code snippet should result in the same chart as we could observe in the Inspector tab, assuming the same pixel is clicked. @@ -368,7 +368,7 @@ Map.centerObject(lisbonPoint, 5); ``` Run the command and zoom out. If the count of images over the entire Earth is viewed, the resulting map should look like Fig. F4.1.2. The created map data may take a few minutes to fully load in. -![Fig. F4.1.2 The number of Landsat 8 images acquired during 2020](../images/F4/image27.png) +![Fig. F4.1.2 The number of Landsat 8 images acquired during 2020](images/F4/image27.png) Note the checkered pattern, somewhat reminiscent of a Mondrian painting. To understand why the image looks this way, it is useful to consider the overlapping image footprints. As Landsat passes over, each image is wide enough to produce substantial “sidelap” with the images from the adjacent paths, which are collected at different dates according to the satellite’s orbit schedule. In the north-south direction, there is also some overlap to ensure that there are no gaps in the data. Because these are served as distinct images and stored distinctly in Earth Engine, you will find that there can be two images from the same day with the same value for points in these overlap areas. Depending on the purposes of a study, you might find a way to ignore the duplicate pixel values during the analysis process. @@ -419,7 +419,7 @@ Map.addLayer(p30, { max: 0.35}, '30%'); ``` -![Fig. F4.1.3 Landsat 8 TOA reflectance 30th percentile image computed for ImageCollection with images acquired during 2020 ](../images/F4/image74.png) +![Fig. F4.1.3 Landsat 8 TOA reflectance 30th percentile image computed for ImageCollection with images acquired during 2020 ](images/F4/image74.png) We can see that the resulting composite image (Fig. 4.1.3) has almost no cloudy pixels present for this area. This happens because cloudy pixels usually have higher reflectance values. At the lowest end of the values, other unwanted effects like cloud or hill shadows typically have very low reflectance values. This is why this 30th percentile composite image looks so much cleaner than the mean composite image (meanFilteredIC) calculated earlier. Note that the reducers operate per pixel: adjacent pixels are drawn from different images. This means that one pixel’s value could be taken from an image from one date, and the adjacent pixel’s value drawn from an entirely different period. Although, like the mean and median images, percentile images such as that seen in Fig. F4.1.3 never existed on a single day, composite images allow us to view Earth’s surface without the noise that can make analysis difficult. @@ -438,7 +438,7 @@ percentiles.map(function(p) { var image = filteredIC.reduce(ee.Reducer.percent ``` Note that the code adds every percentile image as a separate map layer, so you need to go to the Layers control and show/hide different layers to explore differences. Here, we can see that low-percentile composite images depict darker, low-reflectance land features, such as water and cloud or hill shadows, while higher-percentile composite images (>70% in our example) depict clouds and any other atmospheric or land effects corresponding to bright reflectance values. -![Fig. F4.1.4 Landsat 8 TOA reflectance percentile composite images](../images/F4/image55.png) +![Fig. F4.1.4 Landsat 8 TOA reflectance percentile composite images](images/F4/image55.png) Earth Engine provides a very rich API, allowing users to explore image collections to better understand the extent and variability of data in space, time, and across bands, as well as tools to analyze values stored in image collections in a frequency domain. Exploring these values in different forms should be the first step of any study before developing data analysis algorithms. @@ -524,7 +524,7 @@ print(yearFiltered, 'Date-filtered CHIRPS images'); The CHIRPS collection contains one image for every pentad. The filtered collection above is filtered to contain one year, which equates to 72 global images. If you expand the printed collection in the Console, you will be able to see the metadata for individual images; note that their date stamps indicate that they are spaced evenly every five days (Fig. F4.2.1). -![Fig. F4.2.1 CHIRPS time series for one year](../images/F4/image25.png) +![Fig. F4.2.1 CHIRPS time series for one year](images/F4/image25.png) Each image’s pixel values store the total precipitation during the pentad. Without aggregation to a period that matches other datasets, these layers are not very useful. For hydrological analysis, we typically need the total precipitation for each month or for a season. Let’s aggregate this collection so that we have 12 images—one image per month, with pixel values that represent the total precipitation for that month. @@ -608,7 +608,7 @@ print(monthlyCollection); ``` We have now successfully computed an aggregated collection from the source ImageCollection by filtering, mapping, and reducing, as described in Chaps. F4.0 and F4.1. Expand the printed collection in the Console and you can verify that we now have 12 images in the newly created ImageCollection (Fig. F4.2.2). -![Fig. F4.2.2 Aggregated time series](../images/F4/image90.png) +![Fig. F4.2.2 Aggregated time series](images/F4/image90.png) :::{.callout-note} @@ -660,7 +660,7 @@ print(chart); ``` The customized chart (Fig. F4.2.3) shows the typical rainfall pattern in the city of Bengaluru, India. Bengaluru has a temperate climate, with pre-monsoon rains in April and May cooling down the city and a moderate monsoon season lasting from June to September. -![Fig. F4.2.3 Monthly rainfall chart](../images/F4/image32.png) +![Fig. F4.2.3 Monthly rainfall chart](images/F4/image32.png) :::{.callout-note} @@ -795,7 +795,7 @@ var visParams = { Map.addLayer(composite, visParams, 'L8 Composite'); ``` -![Fig. F4.3.1 Landsat 8 surface reflectance 2019 median composite of Colombia](../images/F4/image12.png) +![Fig. F4.3.1 Landsat 8 surface reflectance 2019 median composite of Colombia](images/F4/image12.png) The resulting composite (Fig. F4.3.1) has lots of clouds, especially in the western, mountainous regions of Colombia. In tropical regions, it is very challenging to generate a high-quality, cloud-free composite without first filtering images for cloud cover, even if our collection is constrained to only include images acquired during the dry season. Therefore, let’s filter our collection by the CLOUD_COVER parameter to avoid cloudy images. We will start with images that have less than 50% cloud cover. @@ -817,14 +817,14 @@ print('Size landsat8 collection', landsat8.size()); print('Size landsat8FiltClouds collection', landsat8FiltClouds.size()); ``` -![Fig. F4.3.2 Landsat 8 surface reflectance 2019 median composite of Colombia filtered by cloud cover less than 50%](../images/F4/image50.png) +![Fig. F4.3.2 Landsat 8 surface reflectance 2019 median composite of Colombia filtered by cloud cover less than 50%](images/F4/image50.png) This new composite (Fig. F4.3.2) looks slightly better than the previous one, but still very cloudy. Remember to turn off the first layer or adjust the transparency to visualize only this new composite. The code prints the size of these collections, using the size function) to see how many images were left out after we applied the cloud cover threshold. (There are 1201 images in the landsat8 collection, compared to 493 in the landsat8FiltClouds collection—a lot of scenes with cloud cover greater than or equal to 50%.) Try adjusting the CLOUD_COVER threshold in the landsat8FiltClouds variable to different percentages and checking the results. For example, with 20% set as the threshold (Fig. F4.3.3), you can see that many parts of the country have image gaps. (Remember to turn off the first layer or adjust its transparency; you can also set the shown parameter in the Map.addLayer function to false so the layer does not automatically load). So there is a trade-off between a stricter cloud cover threshold and data availability. Additionally, even with a cloud filter, some tiles still present a large area cover of clouds. -![Fig. F4.3.3 Landsat 8 surface reflectance 2019 median composite of Colombia filtered by cloud cover less than 20%](../images/F4/image42.png) +![Fig. F4.3.3 Landsat 8 surface reflectance 2019 median composite of Colombia filtered by cloud cover less than 20%](images/F4/image42.png) This is due to persistent cloud cover in some regions of Colombia. However, a cloud mask can be applied to improve the results. The Landsat 8 Collection 2 contains a quality assessment (QA) band called QA_PIXEL that provides useful information on certain conditions within the data, and allows users to apply per-pixel filters. Each pixel in the QA band contains unsigned integers that represent bit-packed combinations of surface, atmospheric, and sensor conditions. @@ -848,14 +848,14 @@ var landsat8compositeMasked = landsat8FiltMasked.median().clip(country); Map.addLayer(landsat8compositeMasked, visParams, 'L8 composite masked'); ``` -![Fig. F4.3.4 Landsat 8 surface reflectance 2019 median composite of Colombia filtered by cloud cover less than 50% and with cloud mask applied](../images/F4/image39.png) +![Fig. F4.3.4 Landsat 8 surface reflectance 2019 median composite of Colombia filtered by cloud cover less than 50% and with cloud mask applied](images/F4/image39.png) Because we are dealing with bits, in the maskSrClouds function we utilized the bitwiseAnd and parseInt functions. These are functions that serve the purpose of unpacking the bit information. A bitwise AND is a binary operation that takes two equal-length binary representations and performs the logical AND operation on each pair of corresponding bits. Thus, if both bits in the compared positions have the value 1, the bit in the resulting binary representation is 1 (1 × 1 = 1); otherwise, the result is 0 (1 × 0 = 0 and 0 × 0 = 0). The parseInt function parses a string argument (in our case, five-character string '11111') and returns an integer of the specified numbering system, base 2. The resulting composite (Fig. F4.3.4) shows masked clouds, and is more spatially exhaustive in coverage compared to previous composites (don’t forget to uncheck the previous layers). This is because, when compositing all the images into one, we are not taking cloudy pixels into account anymore; therefore, the resulting pixel is not cloud covered but an actual representation of the landscape. However, data gaps are still an issue due to cloud cover. If you do not specifically need an annual composite, a first approach is to create a two-year composite to try to mitigate the missing data issue, or to have a series of rules that allows for selecting pixels for that particular year (as in Sect. 3 below). Change the startDate variable to 2018-01-01 to include all images from 2018 and 2019 in the collection. How does the cloud-masked composite (Fig. F4.3.5) compare to the 2019 one? -![Fig. F4.3.5 One-year, startDate variable set to 2019-01-01, (left) and two-year, startDate variable set to 2018-01-01, (right) median composites with 50% cloud cover threshold and cloud mask applied](../images/F4/image85.png) +![Fig. F4.3.5 One-year, startDate variable set to 2019-01-01, (left) and two-year, startDate variable set to 2018-01-01, (right) median composites with 50% cloud cover threshold and cloud mask applied](images/F4/image85.png) The resulting image has substantially fewer data gaps (you can zoom in to better see them). Again, if the time period is not a constraint for the creation of your composite, you can incorporate more images from a third year, and so on. @@ -900,14 +900,14 @@ Map.addLayer(landsat7compositeMasked, max: 0.2 }, 'L7 composite masked'); ``` -![Fig. F4.3.6 One-year Landsat 7 median composite with 50% cloud cover threshold and cloud mask applied](../images/F4/image73.png) +![Fig. F4.3.6 One-year Landsat 7 median composite with 50% cloud cover threshold and cloud mask applied](images/F4/image73.png) Note that we used bands: ['SR_B3', 'SR_B2', 'SR_B1'] to visualize the composite because Landsat 7 has different band designations. The sensors aboard each of the Landsat satellites were designed to acquire data in different ranges of frequencies along the electromagnetic spectrum. Whereas for Landsat 8, the red, green, and blue bands are B4, B3, and B2, respectively, for Landsat 7, these same bands are B3, B2, and B1, respectively. You should see an image with systematic gaps like the one shown in Fig. F4.3.6 (remember to turn off the other layers, and zoom in to better see the data gaps). Landsat 7 was launched in 1999, but since 2003, the sensor has acquired and delivered data with data gaps caused by a scan line corrector (SLC) failure. Without an operating SLC, the sensor’s line of sight traces a zig-zag pattern along the satellite ground track, and, as a result, the imaged area is duplicated and some areas are missed. When the Level 1 data are processed, the duplicated areas are removed, leaving data gaps (Fig. F4.3.7). For more information about Landsat 7 and SLC error, please refer to the USGS Landsat 7 page. However, even with the SLC error, we can still use the Landsat 7 data in our composite. Now, let’s combine the Landsat 7 and 8 collections. -![Fig. F4.3.7 Landsat 7’s SLC-off condition. Source: USGS](../images/F4/image54.png) +![Fig. F4.3.7 Landsat 7’s SLC-off condition. Source: USGS](images/F4/image54.png) Since Landsat 7 and 8 have different band designations, first we create a function to rename the bands from Landsat 7 to match the names used for Landsat 8 and map that function over our Landsat 7 collection. @@ -926,7 +926,7 @@ var landsat7FiltMaskedRenamed = landsat7FiltMasked.map(rename); ``` If you print the first images of both the landsat7FiltMasked and landsat7FiltMaskedRenamed collections (Fig. F4.3.8), you will see that the bands got renamed, and not all bands got copied over (SR_ATMOS_OPACITY, SR_CLOUD_QA, SR_B6, etc.). To copy these additional bands, simply add them to the rename function. You will need to rename SR_B6 so it does not have the same name as the new band 5. -![Fig. F4.3.8 First images of landsat7FiltMasked and landsat7FiltMaskedRenamed, respectively](../images/F4/image15.png) +![Fig. F4.3.8 First images of landsat7FiltMasked and landsat7FiltMaskedRenamed, respectively](images/F4/image15.png) Now we merge the two collections using the merge function for ImageCollection and mapping over a function to cast the Landsat 7 input values to a 32-bit float using the toFloat function for consistency. To merge collections, the number and names of the bands must be the same in each collection. We use the select function (Chap. F1.1) to select the Landsat 8 bands to be the same as Landsat 7’s. When creating the new Landsat 7 and 8 composite, if we did not select these 6 bands, we would get an error message for trying to composite a collection that has 6 bands (Landsat 7) with a collection that has 19 bands (Landsat 8). @@ -951,7 +951,7 @@ Map.addLayer(landsat78composite, visParams, 'L7 and L8 composite'); ``` Comparing the composite generated considering both Landsat 7 and 8 to the Landsat 8-only composite, it is evident that there is a reduction in the amount of data gaps in the final result (Fig. F4.3.9). The resulting Landsat 7 and 8 image composite still has data gaps due to the presence of clouds and Landsat 7’s SLC-off data. You can try setting the center of the map to the point with latitude 3.6023 and longitude −75.0741 to see the inset example of Fig. F4.3.9. -![Fig. F4.3.9 Landsat 8-only composite (left) and Landsat 7 and 8 composite (right) for 2019. Inset centered at latitude 3.6023, longitude −75.0741.](../images/F4/image30.png) +![Fig. F4.3.9 Landsat 8-only composite (left) and Landsat 7 and 8 composite (right) for 2019. Inset centered at latitude 3.6023, longitude −75.0741.](images/F4/image30.png) :::{.callout-note} @@ -964,7 +964,7 @@ This section presents an Earth Engine application that enables the generation of :::{.callout-note} Code Checkpoint F43c. The book’s repository contains information about accessing the GEE-BAP interface and its related functions. ::: -![Fig. F4.3.10 GEE-BAP user interface controls](../images/F4/image70.png)![Fig. F4.3.10 GEE-BAP user interface controls](../images/F4/image81.png)![Fig. F4.3.10 GEE-BAP user interface controls](../images/F4/image83.png) +![Fig. F4.3.10 GEE-BAP user interface controls](images/F4/image70.png)![Fig. F4.3.10 GEE-BAP user interface controls](images/F4/image81.png)![Fig. F4.3.10 GEE-BAP user interface controls](images/F4/image83.png) Once you have loaded the GEE-BAP interface (Fig. F4.3.10) using the instructions in the Code Checkpoint, you will notice that it is divided into three sections: (1) Input/Output options, (2) Pixel scoring options, and (3) Advanced parameters. Users indicate the study area, the time period for generating annual BAP composites (i.e., start and end years), and the path to store the results in the Input/Output options. Users have three options to define the study area. The Draw study area option uses the Draw a shape and Draw a rectangle tools to define the area of interest. The Upload image template option utilizes an image template uploaded by the user in TIFF format. This option is well suited to generating BAP composites that match the projection, pixel size, and extent to existing raster datasets. The Work globally option generates BAP composites for the entire globe; note that when this option is selected, complete data download is not available due to the Earth’s size. With Start year and End year, users can indicate the beginning and end of the annual time series of BAP image composites to be generated. Multiple image composites are then generated—one composite for each year—resulting in a time series of annual composites. For each year, composites are uniquely generated utilizing images acquired on the days within the specified Date range. Produced BAP composites can be saved in the indicated (Path) Google Drive folder using the Tasks tab. Results are generated in a tiled, TIFF format, accompanied by a CSV file that indicates the parameters used to construct the composite. @@ -981,7 +981,7 @@ Finally, there is a Landsat 7 ETM+ SLC-off penalty scoring function that de-emph By default, the GEE-BAP application produces image composites using all the visible bands. The Spectral index option enables the user to produce selected spectral indices from the resulting BAP image composites. Available spectral indices include: Normalized Difference Vegetation Index (NDVI, Fig. F4.3.11), Enhanced Vegetation Index (EVI), and Normalized Burn Ratio (NBR), as well as several indices derived from the Tasseled Cap transformation: Wetness (TCW), Greenness (TCG), Brightness (TCB), and Angle (TCA). Composited indices are able to be downloaded as well as viewed on the map. -![Fig. F4.3.11 Example of a global BAP image composite showing NDVI values generated using the GEE-BAP user interface](../images/F4/image60.png) +![Fig. F4.3.11 Example of a global BAP image composite showing NDVI values generated using the GEE-BAP user interface](images/F4/image60.png) GEE-BAP functions can be accessed programmatically, including pixel scoring parameters, as well as BAP image compositing (BAP), de-spiking (despikeCollection), data-gap infilling (infill), and displaying (ShowCollection) functions. The following code sets the scoring parameter values, then generates and displays the compositing results (Fig. F4.3.12) for a BAP composite that is de-spiked, with data gaps infilled using temporal interpolation. Copy and paste the code below into a new script. @@ -1023,7 +1023,7 @@ library.ShowCollection(BAPCS, startYear, endYear, colombia, false, null); library.AddSLider(startYear, endYear); ``` -![Fig. F4.3.12 Outcome of the compositing code](../images/F4/image11.png) +![Fig. F4.3.12 Outcome of the compositing code](images/F4/image11.png) :::{.callout-note} @@ -1123,19 +1123,19 @@ Change detection is the process of assessing how landscape conditions are changi a) -![](../images/F4/image80.png) +![](images/F4/image80.png) b) -![](../images/F4/image21.png) +![](images/F4/image21.png) c) -![](../images/F4/image75.png) +![](images/F4/image75.png) d) -![Fig. F4.4.1 Before and after images of (a) the eruption of Mount St. Helens in Washington State, USA, in 1980 (before, July 10, 1979; after, September 5, 1980); (b) the Camp Fire in California, USA, in 2018 (before, October 7, 2018; after, March 16, 2019); (c) illegal gold mining in the Madre de Dios region of Peru (before, March 31, 2001; after, August 22, 2020); and (d) shoreline changes in Incheon, South Korea (before, May 29, 1981; after, March 11, 2020)](../images/F4/image87.png) +![Fig. F4.4.1 Before and after images of (a) the eruption of Mount St. Helens in Washington State, USA, in 1980 (before, July 10, 1979; after, September 5, 1980); (b) the Camp Fire in California, USA, in 2018 (before, October 7, 2018; after, March 16, 2019); (c) illegal gold mining in the Madre de Dios region of Peru (before, March 31, 2001; after, August 22, 2020); and (d) shoreline changes in Incheon, South Korea (before, May 29, 1981; after, March 11, 2020)](images/F4/image87.png) Many change detection techniques use the same basic premise: that most changes on the landscape result in spectral values that differ between pre-event and post-event images. The challenge can be to separate the real changes of interest—those due to activities on the landscape—from noise in the spectral signal, which can be caused by seasonal variation and phenology, image misregistration, clouds and shadows, radiometric inconsistencies, variability in illumination (e.g., sun angle, sensor position), and atmospheric effects. @@ -1147,7 +1147,7 @@ For land cover changes that occur abruptly over large areas on the landscape and For the practicum, you will select pre-event and post-event image scenes and investigate the conditions in these images in a false-color composite display. Next, you will calculate the NBR index for each scene and create a difference image using the two NBR maps. Finally, you will apply a threshold to the difference image to establish categories of changed versus stable areas (Fig. F4.4.2). -![Fig. F4.4.2 Change detection workflow for this practicum](../images/F4/image68.png) +![Fig. F4.4.2 Change detection workflow for this practicum](images/F4/image68.png) ### Preparing Imagery @@ -1198,7 +1198,7 @@ Map.addLayer(preImage, visParam, 'pre'); Map.addLayer(postImage, visParam, 'post'); ``` -![Fig. F4.4.3 False-color composite using SWIR2, NIR, and red. Vegetation shows up vividly in the green channel due to vegetation being highly reflective in the NIR band. Shades of green can be indicative of vegetation density; water typically shows up as black to dark blue; and burned or barren areas show up as brown.](../images/F4/image31.png) +![Fig. F4.4.3 False-color composite using SWIR2, NIR, and red. Vegetation shows up vividly in the green channel due to vegetation being highly reflective in the NIR band. Shades of green can be indicative of vegetation density; water typically shows up as black to dark blue; and burned or barren areas show up as brown.](images/F4/image31.png) ### Calculating NBR @@ -1246,7 +1246,7 @@ The color ramp has dark blues for the lowest values, greens and oranges in the m a) b) c) -![Fig. F4.4.4 (a) Two-date NBR difference; (b) pre-event image (June 2013) false-color composite; (c) post-event image (June 2020) false-color composite. In the change map (a), areas on the lower range of values (blue) depict areas where vegetation has been negatively affected, and areas on the higher range of values (pink) depict areas where there has been vegetation gain; the green/orange areas have experienced little change. In the pre-event and post-event images (b and c), the green areas indicate vegetation, while the brown regions are barren ground.](../images/F4/image4.png) +![Fig. F4.4.4 (a) Two-date NBR difference; (b) pre-event image (June 2013) false-color composite; (c) post-event image (June 2020) false-color composite. In the change map (a), areas on the lower range of values (blue) depict areas where vegetation has been negatively affected, and areas on the higher range of values (pink) depict areas where there has been vegetation gain; the green/orange areas have experienced little change. In the pre-event and post-event images (b and c), the green areas indicate vegetation, while the brown regions are barren ground.](images/F4/image4.png) ### Classifying Change @@ -1279,11 +1279,11 @@ Map.addLayer(diffClassified.selfMask(), ``` a) -![](../images/F4/image77.png)![](../images/F4/image77.png) +![](images/F4/image77.png)![](images/F4/image77.png) b) -![Fig. F4.4.5 (a) Change detection in timber forests of southern Oregon, including maps of the (left to right) pre-event false-color composite, post-event false-color composite, difference image, and classified change using NBR; (b) the same map types for an example of change caused by fire in southern Oregon. The false-color maps highlight vegetation in green and barren ground in brown. The difference images show NBR gain in pink to NBR loss in blue. The classified change images show NBR gain in blue and NBR loss in red.](../images/F4/image17.png)![Fig. F4.4.5 (a) Change detection in timber forests of southern Oregon, including maps of the (left to right) pre-event false-color composite, post-event false-color composite, difference image, and classified change using NBR; (b) the same map types for an example of change caused by fire in southern Oregon. The false-color maps highlight vegetation in green and barren ground in brown. The difference images show NBR gain in pink to NBR loss in blue. The classified change images show NBR gain in blue and NBR loss in red.](../images/F4/image17.png) +![Fig. F4.4.5 (a) Change detection in timber forests of southern Oregon, including maps of the (left to right) pre-event false-color composite, post-event false-color composite, difference image, and classified change using NBR; (b) the same map types for an example of change caused by fire in southern Oregon. The false-color maps highlight vegetation in green and barren ground in brown. The difference images show NBR gain in pink to NBR loss in blue. The classified change images show NBR gain in blue and NBR loss in red.](images/F4/image17.png)![Fig. F4.4.5 (a) Change detection in timber forests of southern Oregon, including maps of the (left to right) pre-event false-color composite, post-event false-color composite, difference image, and classified change using NBR; (b) the same map types for an example of change caused by fire in southern Oregon. The false-color maps highlight vegetation in green and barren ground in brown. The difference images show NBR gain in pink to NBR loss in blue. The classified change images show NBR gain in blue and NBR loss in red.](images/F4/image17.png) Chapters F4.5 through F4.9 present more-advanced change detection algorithms that go beyond differencing and thresholding between two images, instead allowing you to analyze changes indicated across several images as a time series. @@ -1381,14 +1381,14 @@ Second, can you identify fitting parameters that allow the algorithm to capture The best way to begin assessing these questions is to look at the time series of individual pixels. In Earth Engine, open and run the script that generates the GUI we have developed to easily deploy the LandTrendr algorithms. Run the script, and you should see an interface that looks like the one shown in Fig. 4.5.1. -![Fig. 4.5.1 The LandTrendr GUI interface, with the control panel on the left, the Map panel in the center, and the reporting panel on the right](../images/F4/image29.png) +![Fig. 4.5.1 The LandTrendr GUI interface, with the control panel on the left, the Map panel in the center, and the reporting panel on the right](images/F4/image29.png) The LandTrendr GUI consists of three panels: a control panel on the left, a reporting panel on the right, and a Map panel in the center. The control panel is where all of the functionality of the interface resides. There are several modules,and each is accessed by clicking on the double arrow to the right of the title. The Map panel defaults to a location in Oregon but can be manually moved anywhere in the world. The reporting panel shows messages about how to use functions, as well as providing graphical outputs. Next, expand the “Pixel Time Series Options” function. For now, simply use your mouse to click somewhere on the map. Wait a few seconds even though it looks like nothing is happening – be patient!! The GUI has sent information to Earth Engine to run the LandTrendr algorithms at the location you have clicked, and is waiting for the results. Eventually you should see a chart appear in the reporting panel on the right. Fig. 4.5.2 shows what one pixel looks like in an area where the forest burned and began regrowth. Your chart will probably look different. -![Fig. 4.5.2 A typical trajectory for a single pixel. The x-axis shows the year, the y-axis the spectral index value, and the title the index chosen. The gray line represents the original spectral values observed by Landsat, and the red line the result of the LandTrendr temporal segmentation algorithms.](../images/F4/image88.png) +![Fig. 4.5.2 A typical trajectory for a single pixel. The x-axis shows the year, the y-axis the spectral index value, and the title the index chosen. The gray line represents the original spectral values observed by Landsat, and the red line the result of the LandTrendr temporal segmentation algorithms.](images/F4/image88.png) The key to success with the LandTrendr algorithm is interpreting these time series. First, let’s examine the components of the chart. The x-axis shows the year of observation. With LandTrendr, only one observation per year is used to describe the history of a pixel; later, we will cover how you control that value. The y-axis shows the spectral value of the index that is chosen. In the default mode, the Normalized Burn Ratio (as described in Chap. F4.4). Note that you also have the ability to pick more indices using the checkboxes on the control panel on the left. Note that we scale floating point (decimal) indices by 1000. Thus, an NBR value of 1.0 would be displayed as 1000. @@ -1401,7 +1401,7 @@ Next, translate that change into the changes of interest for the change processe In the case of Fig. 4.5.2, we interpret the abrupt drop as a disturbance, and the subsequent rise of the index as regrowth or recovery (though not necessarily to the same type of vegetation). -![Fig. 4.5.3 For the trajectory in Fig. 4.5.2, we can identify a segment capturing disturbance based on its abrupt drop in the NBR index, and the subsequent vegetative recovery](../images/F4/image71.png) +![Fig. 4.5.3 For the trajectory in Fig. 4.5.2, we can identify a segment capturing disturbance based on its abrupt drop in the NBR index, and the subsequent vegetative recovery](images/F4/image71.png) Tip: LandTrendr is able to accept any index, and advanced users are welcome to use indices of their own design. An important consideration is knowing which direction indicates “recovery” and “disturbance” for the topic you are interested in. The algorithms favor detection of disturbance and can be controlled to constrain how quickly recovery is assumed to occur (see parameters below). @@ -1412,7 +1412,7 @@ One option is to change the index. Any single index is simply one view of the la Another option is to change the date range. LandTrendr uses one value per year, but the value that is chosen can be controlled by the user. It’s possible that the change of interest is better identified in some seasons than others. We use a medoid image compositing approach, which picks the best single observation each year from a date range of images in an ImageCollection. In the GUI, you can change the date range of imagery used for compositing in the Image Collection portion of the LandTrendr Options menu (Fig. F4.5.4). -![Fig. 4.5.4 The LandTrendr options menu. Users control the year and date range in the Image Collection section, the index used for temporal segmentation in the middle section, and the parameters controlling the temporal segmentation in the bottom section](../images/F4/image7.png) +![Fig. 4.5.4 The LandTrendr options menu. Users control the year and date range in the Image Collection section, the index used for temporal segmentation in the middle section, and the parameters controlling the temporal segmentation in the bottom section](images/F4/image7.png) Change the Start Date and End Date to find a time of year when the distinction between cover conditions before and during the change process of interest is greatest. @@ -1449,7 +1449,7 @@ There are three post-processing steps to convert a segmented trajectory to a map Theory: We’ll start with a single pixel to learn how to Interpret a disturbance pixel time series in terms of the dominant disturbance segment. For the disturbance time series we have used in figures above, we can identify the key parameters of the segment associated with the disturbance. For the example above, we have extracted the actual NBR values of the fitted time series and noted them in a table (Fig. 4.5.5). This is not part of the GUI – it is simply used here to work through the concepts. -![Fig. 4.5.5 Tracking actual values of fitted trajectories to learn how we focus on quantification of disturbance. Because we know that the NBR index drops when vegetation is lost and soil exposure is increased, we know that a precipitous drop suggests an abrupt loss of vegetation. Although some early segments show very subtle change, only the segment between vertex 4 and 5 shows large-magnitude vegetation loss.](../images/F4/image84.png) +![Fig. 4.5.5 Tracking actual values of fitted trajectories to learn how we focus on quantification of disturbance. Because we know that the NBR index drops when vegetation is lost and soil exposure is increased, we know that a precipitous drop suggests an abrupt loss of vegetation. Although some early segments show very subtle change, only the segment between vertex 4 and 5 shows large-magnitude vegetation loss.](images/F4/image84.png) From the table shown in Fig. 4.5.5, we can infer several key things about this pixel: @@ -1466,7 +1466,7 @@ If we wanted to map the magnitude of the disturbance, we would follow the same f The LandTrendr GUI provides a set of tools to easily apply the same logic rules to all pixels of interest and create maps. Click on the Change Filter Options menu. The interface shown in Fig. 4.5.6 appears. -![Fig. 4.5.6 The menu used to post-process disturbance trajectories into maps. Select vegetation change type and sort to hone in on the segment type of interest, then check boxes to apply selective filters to eliminate uninteresting changes. ](../images/F4/image49.png) +![Fig. 4.5.6 The menu used to post-process disturbance trajectories into maps. Select vegetation change type and sort to hone in on the segment type of interest, then check boxes to apply selective filters to eliminate uninteresting changes. ](images/F4/image49.png) The first two sections are used to identify the segments of interest. @@ -1479,12 +1479,12 @@ Each filter (magnitude, duration, etc.) is used to further winnow the possible s If you’re following along and making changes, or if you’re just using the default location and parameters, click the Add Filtered Disturbance Imagery to add this to the map. You should see something like Fig. 4.5.7. -![Fig. 4.5.7 The basic output from a disturbance mapping exercise ](../images/F4/image16.png) +![Fig. 4.5.7 The basic output from a disturbance mapping exercise ](images/F4/image16.png) There are multiple layers of disturbance added to the map. Use the map layers checkboxes to change which is shown. Magnitude of disturbance, for example, is a map of the delta change between beginning and endpoints of the segments (Fig. 4.5.8). -![Fig. 4.5.8 Magnitude of change for the same area](../images/F4/image14.png) +![Fig. 4.5.8 Magnitude of change for the same area](images/F4/image14.png) ### Conclusion {.unnumbered} @@ -1567,7 +1567,7 @@ Higher-dimension band values: array images. That more complex conception of the First, we will give some very basic notation (Fig. F4.6.1). A scalar pixel at time t is given by pt, and a pixel vector by pt. A variable with a “hat” represents an estimated value: in this context, p̂t is the estimated pixel value at time t. A time series is a collection of pixel values, usually sorted chronologically: {pt; t = t0...tN}, where t might be in any units, t0 is the smallest, and tN is the largest such t in the series. -![Fig. F4.6.1 Time series representation of pixel p ](../images/F4/image38.png) +![Fig. F4.6.1 Time series representation of pixel p ](images/F4/image38.png) ### Data Preparation and Preprocessing @@ -1648,7 +1648,7 @@ var landsat8Chart = ui.Chart.image.series(landsat8sr.select('NDVI'), roi) print(landsat8Chart); ``` -![Fig. F4.6.2 Time series representation of pixel p ](../images/F4/image3.png) +![Fig. F4.6.2 Time series representation of pixel p ](images/F4/image3.png) We can add a linear trend line to our chart using the trendlines parameters in the setOptions function for image series charts. Copy and paste the code below to print the same chart but with a linear trend line plotted (Fig. F4.6.3). In the next section, you will learn how to estimate linear trends over time. @@ -1669,7 +1669,7 @@ var landsat8ChartTL = ui.Chart.image.series(landsat8sr.select('NDVI'), roi) print(landsat8ChartTL); ``` -![Fig. F4.6.3 Time series representation of pixel p with the trend line in red](../images/F4/image82.png) +![Fig. F4.6.3 Time series representation of pixel p with the trend line in red](images/F4/image82.png) Now that we have plotted and visualized the data, lots of interesting analyses can be done to the time series by harnessing Earth Engine tools for fitting curves through this data. We will see a couple of examples in the following sections. @@ -1716,7 +1716,7 @@ Map.addLayer(coefficients, {}, 'coefficients image'); ``` If you click over a point using the Inspector tab, you will see the pixel values for the array image (coefficients “t” and “constant”, and residuals) and two-band image (coefficients “t” and “constant”) (Fig. F4.6.4). -![Fig. F4.6.4 Pixel values of array image and coefficients image](../images/F4/image53.png) +![Fig. F4.6.4 Pixel values of array image and coefficients image](images/F4/image53.png) Now, copy and paste the code below to use the model to detrend the original NDVI time series and plot the time series chart with the trendlines parameter (Fig. F4.6.5). @@ -1742,7 +1742,7 @@ var detrendedChart = ui.Chart.image.series(detrended, roi, null, 30) });print(detrendedChart); ``` -![Fig. F4.6.5 Detrended NDVI time series](../images/F4/image20.png) +![Fig. F4.6.5 Detrended NDVI time series](images/F4/image20.png) :::{.callout-note} @@ -1804,14 +1804,14 @@ print(ui.Chart.image.series( })); ``` -![Fig. F4.6.6 Harmonic model of NDVI time series](../images/F4/image86.png) +![Fig. F4.6.6 Harmonic model of NDVI time series](images/F4/image86.png) Returning to the mind-bending nature of curve-fitting, it is worth remembering that the harmonic waves seen in Fig. F4.6.6 are the fit of the data to a single point across the image. Next, we will map the outcomes of millions of these fits, pixel by pixel, across the entire study area. We’ll compute and map the phase and amplitude of the estimated harmonic model for each pixel. Phase and amplitude (Fig. F4.6.7) can give us additional information to facilitate remote sensing applications such as agricultural mapping and land use and land cover monitoring. Agricultural crops with different phenological cycles can be distinguished with phase and amplitude information, something that perhaps would not be possible with spectral information alone. -![Fig. F4.6.7 Example of phase and amplitude in harmonic model](../images/F4/image8.png) +![Fig. F4.6.7 Example of phase and amplitude in harmonic model](images/F4/image8.png) Copy and paste the code below to compute phase and amplitude from the coefficients and add this image to the map (Fig. F4.6.8). @@ -1841,7 +1841,7 @@ var rgb = ee.Image.cat([ Map.addLayer(rgb, {}, 'phase (hue), amplitude (sat), ndvi (val)'); ``` -![Fig. F4.6.8 Phase, amplitude, and NDVI concatenated image](../images/F4/image63.png) +![Fig. F4.6.8 Phase, amplitude, and NDVI concatenated image](images/F4/image63.png) The code uses the HSV to RGB transformation hsvToRgb for visualization purposes (Chap. F3.1). We use this transformation to separate color components from intensity for a better visualization. Without this transformation, we would visualize a very colorful image that would not look as intuitive as the image with the transformation. With this transformation, phase, amplitude, and mean NDVI are displayed in terms of hue (color), saturation (difference from white), and value (difference from black), respectively. Therefore, darker pixels are areas with low NDVI. For example, water bodies will appear as black, since NDVI values are zero or negative. The different colors are distinct phase values, and the saturation of the color refers to the amplitude: whiter colors mean amplitude closer to zero (e.g., forested areas), and the more vivid the colors, the higher the amplitude (e.g., croplands). Note that if you use the Inspector tool to analyze the values of a pixel, you will not get values of phase, amplitude, and NDVI, but the transformed values into values of blue, green, and red colors. @@ -1875,9 +1875,9 @@ Map.addLayer(anotherView, max: 0.03 }, 'Another combination of fit characteristics'); ``` -![](../images/F4/image61.png) +![](images/F4/image61.png) -![Fig. F4.6.9 Two views of the harmonic fits for NDVI for the Modesto, California area](../images/F4/image45.png) +![Fig. F4.6.9 Two views of the harmonic fits for NDVI for the Modesto, California area](images/F4/image45.png) The upper image in Fig. F4.6.9 is a closer view of Fig. F4.6.8, showing an image that transforms the sine and cosine coefficient values, and incorporates information from the mean NDVI. The lower image draws the sine and cosine in the red and blue bands, and extracts the slope of the linear trend that you calculated earlier in the chapter, placing that in the green band. The two views of the fit are similarly structured in their spatial pattern—both show fields to the west and the city to the east. But the pixel-by-pixel variability emphasizes a key point of this chapter: that a fit to the NDVI data is done independently in each pixel in the image. Using different elements of the fit, these two views, like other combinations of the data you might imagine, can reveal the rich variability of the landscape around Modesto. @@ -1894,11 +1894,11 @@ Code Checkpoint F46e. The book’s repository contains a script to use to begin ::: Beginning with the repository script, changing the value of the harmonics variable will change the complexity of the harmonic curve fit by superimposing more or fewer harmonic waves on each other. While fitting higher-order functions improves the goodness-of-fit of the model to a given set of data, many of the coefficients may be close to zero at higher numbers or harmonic terms. Fig. F4.6.10 shows the fit through the example point using one, two, and three harmonic curves. -![](../images/F4/image24.png) +![](images/F4/image24.png) -![](../images/F4/image35.png) +![](images/F4/image35.png) -![Fig. F4.6.10 Fit with harmonic curves of increasing complexity, fitted for data at a given point ](../images/F4/image64.png) +![Fig. F4.6.10 Fit with harmonic curves of increasing complexity, fitted for data at a given point ](images/F4/image64.png) ### Conclusion {.unnumbered} @@ -1975,7 +1975,7 @@ Once you have loaded the CCDC interface (Fig. F4.7.1), you will be able to navig Pay special attention to the characteristics of each segment. For example, look at the average surface reflectance value for each segment. The presence of a pronounced slope may be indicative of phenomena like vegetation regrowth or degradation. The number of harmonics used in each segment may represent seasonality in vegetation (either natural or due to agricultural practices) or landscape dynamics (e.g., seasonal flooding). -![Fig. 4.7.1 Landsat time series for the SWIR1 band (blue dots) and CCDC time segments (colored lines) showing a forest loss event circa 2006 for a place in Rondônia, Brazil](../images/F4/image6.png) +![Fig. 4.7.1 Landsat time series for the SWIR1 band (blue dots) and CCDC time segments (colored lines) showing a forest loss event circa 2006 for a place in Rondônia, Brazil](images/F4/image6.png) Question 1. While still using the SWIR1 band, click on a pixel that is forested. What do the time series and time segments look like? @@ -2175,14 +2175,14 @@ Map.addLayer(selectedMag, magVisParams, 'Max mag'); Map.addLayer(selectedTbreak, timeVisParams, 'Time of max mag'); ``` -![](../images/F4/image69.png) +![](images/F4/image69.png) -![Fig. F4.7.2 First (top) and last (bottom) detected breaks for the study area. Darker colors represent more recent dates, while brighter colors represent older dates. The first change layer shows the clear patterns of original agricultural expansion closer to the year 2000. The last change layer shows the more recently detected and noisy breaks in the same areas. The thin areas in the center of the image have only one time of change, corresponding to a single deforestation event. Pixels with no detected breaks are masked and therefore show the basemap underneath, set to show satellite imagery.](../images/F4/image1.png) +![Fig. F4.7.2 First (top) and last (bottom) detected breaks for the study area. Darker colors represent more recent dates, while brighter colors represent older dates. The first change layer shows the clear patterns of original agricultural expansion closer to the year 2000. The last change layer shows the more recently detected and noisy breaks in the same areas. The thin areas in the center of the image have only one time of change, corresponding to a single deforestation event. Pixels with no detected breaks are masked and therefore show the basemap underneath, set to show satellite imagery.](images/F4/image1.png) We first take the absolute value because the magnitudes can be positive or negative, depending on the direction of the change and the band used. For example, a positive value in the SWIR1 may show a forest loss event, where surface reflectance goes from low to higher values. Brighter values in Fig. 4.7.3 represent events of that type. Conversely, a flooding event would have a negative value, due to the corresponding drop in reflectance. Once we find the maximum absolute value, we find its position on the array and then use that index to extract the original magnitude value, as well as the time when that break occurred. -![Fig. F4.7.3 Maximum magnitude of change for the SWIR1 band for the selected study period](../images/F4/image44.png) +![Fig. F4.7.3 Maximum magnitude of change for the SWIR1 band for the selected study period](images/F4/image44.png) :::{.callout-note} @@ -2257,7 +2257,7 @@ Map.addLayer(intercept.arrayFlatten([ ]), intVisParams, 'INTP_SWIR1'); ``` -![Fig. F4.7.4 Values for the intercept coefficient of the segments that start before and end after the midpoint of 2005](../images/F4/image78.png) +![Fig. F4.7.4 Values for the intercept coefficient of the segments that start before and end after the midpoint of 2005](images/F4/image78.png) Since we run the CCDC algorithm on Landsat surface reflectance images, intercept values should represent the average reflectance of a segment. However, if you click on the image, you will see that the values are outside of the 0–1 range. This is because the intercept is calculated by the CCDC algorithm for the origin (e.g., time 0), and not for the year we requested. In order to retrieve the adjusted intercept, as well as other coefficients, we will use a different approach. @@ -2353,14 +2353,14 @@ Map.addLayer(coefs, rgbVisParams, 'RGB 2005-09-25'); ``` The slope and RMSE images are shown in Fig. 4.7.5. For the slopes, high positive values are bright, while large negative values are very dark. Most of the remaining forest is stable and has a slope close to zero, while areas that have experienced transformation and show agricultural activity tend to have positive slopes in the RED band, appearing bright in the image. Similarly, for the RMSE image, stable forests present more predictable time series of surface reflectance that are captured more faithfully by the time segments, and therefore present lower RMSE values, appearing darker in the image. Agricultural areas present noisier time series that are more challenging to model, and result in higher RMSE values, appearing brighter. -![](../images/F4/image18.png) +![](images/F4/image18.png) -![Fig. F4.7.5 Image showing the slopes (top) and RMSE (bottom) of the segments that intersect the requested date](../images/F4/image28.png) +![Fig. F4.7.5 Image showing the slopes (top) and RMSE (bottom) of the segments that intersect the requested date](images/F4/image28.png) Finally, the RGB image we created is shown in Fig. 4.7.6. The intercepts are calculated for the middle point of the time segment intercepting the date we requested, representing the average reflectance for the span of the selected segment. In that sense, when shown together as an RGB image, they are similar to a composite image for the selected date, with the advantage of always being cloud-free. -![Fig. F4.7.6 RGB image created using the time segment intercepts for the requested date](../images/F4/image76.png) +![Fig. F4.7.6 RGB image created using the time segment intercepts for the requested date](images/F4/image76.png) :::{.callout-note} @@ -2479,7 +2479,7 @@ Code Checkpoint F48a. The book’s repository contains a script that shows what To see if BULC can successfully sift through these Events, we will use BULC’s GUI (Fig. F4.8.1), which makes interacting with the functionality straightforward. :::{.callout-note} Code Checkpoint F48b in the book’s repository contains information about accessing that interface. ::: -![Fig. F4.8.1 BULC interface](../images/F4/image5.png) +![Fig. F4.8.1 BULC interface](images/F4/image5.png) After you have run the script, BULC’s interface requires that a few parameters be set; these are specified using the left panel. Here, we describe and populate each of the required parameters, which are shown in red. As you proceed, the default red color will change to green when a parameter receives a value. @@ -2500,7 +2500,7 @@ BULC makes relatively small demands on memory since its arithmetic uses only mul When you have finished setting the required parameters, the interface will look like Fig. 4.8.2. -![Fig. 4.8.2 Initial settings for the key driving parameters of BULC ](../images/F4/image62.png) +![Fig. 4.8.2 Initial settings for the key driving parameters of BULC ](images/F4/image62.png) Beneath the required parameters is a set of optional parameters that affect which intermediate results are stored during a run for later inspection. We are also given a choice of returning intermediate results for closer inspection. At this stage, you can leave all optional parameters out of the BULC call by leaving them blanked or unchecked. @@ -2511,9 +2511,9 @@ The BULC interpretation of the landscape looks roughly like the Event inputs, bu Meanwhile, below the Console, the rest of the interface changes when BULC is run. The Map panel displays BULC’s classification for the final date: that is, after considering the evidence from each of the input classifications. We can use the Satellite background to judge whether BULC is accurately capturing the state of LULC. This can be done by unselecting the drawn layers in the map layer set and selecting Satellite from the choices in the upper-right part of the Map panel. Earth Engine’s background satellite images are often updated, so you should see something like the right side of Fig. F4.8.3, though it may differ slightly. -![](../images/F4/image57.png) +![](images/F4/image57.png) -![Fig. 4.8.3 BULC estimation of the state of LULC at the end of 2021 (left). Satellite backdrop for Earth Engine (right), which may differ from what you see due to updates. ](../images/F4/image65.png) +![Fig. 4.8.3 BULC estimation of the state of LULC at the end of 2021 (left). Satellite backdrop for Earth Engine (right), which may differ from what you see due to updates. ](images/F4/image65.png) Question 1. When comparing the BULC classification for 2021 against the current Earth Engine satellite view, what are the similarities and differences? Note that in Earth Engine, the copyrighted year numbers at the bottom of the screen may not coincide with the precise date of the image shown. @@ -2531,9 +2531,9 @@ Question 2. Select the BULC option, then select the Movie tool to view the resul BULC results can be viewed interactively, allowing you to view more detailed estimations of the LULC around the study area. We will zoom into a specific area where change did occur after 2016. To do that, turn on the Satellite view and zoom in. Watching the scale bar in the lower right of the Map panel, continue zooming until the scale bar says 5 km. Then, enter "-60.742, -9.844" in the Earth Engine search tool, located above the code. The text will be interpreted as a longitude/latitude value and will offer you a nearby coordinate, indicated with a value for the degrees West and the degrees South. Click that entry and Earth Engine will move to that location, while keeping at the specified zoom level. Let’s compare the BULC result in this sector against the image from Earth Engine’s satellite view that is underneath it (Fig. 4.8.4). -![](../images/F4/image51.png) +![](images/F4/image51.png) -![Fig. 4.8.4 Comparison of the final classification of the northern part of the study area to the satellite view](../images/F4/image10.png) +![Fig. 4.8.4 Comparison of the final classification of the northern part of the study area to the satellite view](images/F4/image10.png) BULC captured the changes between 2016 and 2021 with a classification series that suggests agricultural development (Fig. 4.8.4, left). Given the appearance of BULC’s 2021 classification, it suggests that the satellite backdrop at the time of this writing (Fig. 4.8.4, right) came from an earlier time period. @@ -2542,7 +2542,7 @@ Now, in the Results panel, select BULC, then Movie. Set your desired frame speed With this finer-scale access to the results of BULC, you can select individual pixels to inspect. Move the horizontal divider downward to expose the Inspector tab and Console tab. Use the Inspector to click on several pixels to learn their history as expressed in the inputted Events and in BULC’s interpretation of the noise and signal in the Event series. In a chosen pixel, you might see output that looks like Fig. 4.8.5. It indicates a possible conversion in the Event time series after a few classifications of the pixel as Forest. This decreases the confidence that the pixel is still Forest (Fig. 4.8.5, lower panel), but not enough for the Active Agriculture class (class 3) to become the dominant probability. After the subsequent Event labels the pixel as Forest, the confidence (lower panel) recovers slightly, but not to its former level. The next Event classifies the pixel as Active Agriculture, confidently, by interpreting that second Active Agriculture classification, in a setting where change was already somewhat suspected after the first non-Forest classification. BULC’s label (middle panel) changes to be Active Agriculture at that point in the sequence. Subsequent Event classifications as Active Agriculture creates a growing confidence that its proper label at the end of the sequence was indeed Active Agriculture. -![Fig. 4.8.5 History for 2016-2020 for a pixel that appeared to have been newly cultivated during that period. (above): the input classifications, which s](../images/F4/image23.png)![Fig. 4.8.5 History for 2016-2020 for a pixel that appeared to have been newly cultivated during that period. (above): the input classifications, which s](../images/F4/image72.png)![Fig. 4.8.5 History for 2016-2020 for a pixel that appeared to have been newly cultivated during that period. (above): the input classifications, which s](../images/F4/image58.png) +![Fig. 4.8.5 History for 2016-2020 for a pixel that appeared to have been newly cultivated during that period. (above): the input classifications, which s](images/F4/image23.png)![Fig. 4.8.5 History for 2016-2020 for a pixel that appeared to have been newly cultivated during that period. (above): the input classifications, which s](images/F4/image72.png)![Fig. 4.8.5 History for 2016-2020 for a pixel that appeared to have been newly cultivated during that period. (above): the input classifications, which s](images/F4/image58.png) Question 3. Run the code again with the same data, but adjust the three levelers, then view the results presented in the Map window and the Results panel. How do each of the three parameters affect the behavior of BULC in its results? Use the thumbnail to assess your subjective satisfaction with the results, and use the Inspector to view the BULC behavior in individual pixels. Can you produce an optimal outcome for this given set of input classifications? @@ -2573,7 +2573,7 @@ After you have run the script to initialize the interface, BULC-D’s interface Run BULC-D for this area. As a reminder, you should first zoom in enough that the scale bar reads “5 km” or finer. Then, search for the location "-60.7624, -9.8542". When you run BULC-D, a result like Fig. F4.8.6 is shown for the layer of probabilities. -![](../images/F4/image48.png) +![](images/F4/image48.png) Fig. 4.8.6 Result for BULC-D for the Roosevelt River area, depicting estimated probability of change and stability for 2021 @@ -2583,7 +2583,7 @@ Each pixel experiences its own NBR history in both the expectation period and th Figure F4.8.7 shows the NBR history for the red balloon in the southern part of the study area in Fig. F4.8.4. If you click on that pixel or one like it, you can see that, whereas the values were quite stable throughout the growing season for the years used to create the pixel’s expectation, they were persistently lower in the target year. This is flagged as a likely meaningful drop in the NBR by BULC-D, for consideration by the analyst. -![](../images/F4/image79.png) +![](images/F4/image79.png) Fig. 4.8.7 NBR history for a pixel with an apparent drop in NBR in the target year (below) as compared to the expectation years (above). Pixel is colored a shade of red in Fig. 4.8.6. @@ -2591,12 +2591,12 @@ Figure F4.8.8 shows the NBR history for the blue balloon in the southern part of Question 4. Experiment with turning off one of the satellite sensor data sources used to create the expectation collection. For example, do you get the same results if the Sentinel-2 data stream is not used, or is the outcome different. You might make screen captures of the results to compare with Fig. 4.8.4. How strongly does each satellite stream affect the outcome of the estimate? Do differences in the resulting estimate vary across the study area? -![Fig. 4.8.8 NBR history for a pixel with an apparent increase in NBR in the target year (below) as compared to the expectation years (above). Pixel is colored a shade of blue in Fig. 4.8.6.](../images/F4/image52.png) +![Fig. 4.8.8 NBR history for a pixel with an apparent increase in NBR in the target year (below) as compared to the expectation years (above). Pixel is colored a shade of blue in Fig. 4.8.6.](images/F4/image52.png) Figure F4.8.8 also shows that, for that pixel, the fit of values for the years used to build the expectation showed a sine wave (shown in blue), but with a fit that was not very strong. When data for the target year was assembled (Fig. F4.8.8, bottom), the values were persistently above expectation throughout the growing season. Note that this pixel was identified as being different in the target year as compared to earlier years, which does not rule out the possibility that the LULC of the area was changed (for example, from Forest to Agriculture) during the years used to build the expectation collection. BULC-D is intended to be run steadily over a long period of time, with the changes marked as they occur, after which point the expectation would be recalculated. -![Fig. 4.8.9 NBR history for a pixel with no apparent increase or decrease in NBR in the target year (below) as compared to the expectation years (above). Pixel is colored a shade of green in Fig. 4.8.6.](../images/F4/image56.png) +![Fig. 4.8.9 NBR history for a pixel with no apparent increase or decrease in NBR in the target year (below) as compared to the expectation years (above). Pixel is colored a shade of green in Fig. 4.8.6.](images/F4/image56.png) Fig. F4.8.9 shows the NBR history for the green balloon in the southern part of the study area in Fig. F4.8.4. For that pixel, the values in the expectation collection formed a sine wave, and the values in the target collection deviated only slightly from the expectation during the target year. @@ -2621,12 +2621,12 @@ Next, BULC will need to know which years of Dynamic World you are interested in. When you have finished, select Apply Parameters at the bottom of the input panel. When it runs, BULC subsets the Dynamic World dataset to clip out according to the dates and location, identifying images from more than 40 distinct dates. The area covers two of the tiles in which Dynamic World classifications are partitioned to be served, so BULC receives more than 90 classifications. When BULC finishes its run, the Map panel will look like Fig. F4.8.10, BULC’s estimate of the final state of the landscape at the end of the classification sequence. -![Fig. F4.8.10 BULC classification using default settings for Roosevelt River area for late 2021](../images/F4/image37.png)![Fig. F4.8.10 BULC classification using default settings for Roosevelt River area for late 2021](../images/F4/image41.png) +![Fig. F4.8.10 BULC classification using default settings for Roosevelt River area for late 2021](images/F4/image37.png)![Fig. F4.8.10 BULC classification using default settings for Roosevelt River area for late 2021](images/F4/image41.png) Let’s explore the suite of information returned by BULC about this time period in Dynamic World. Enter “Muiraquitã” in the search bar and view the results around that area to be able to see the changing LULC classifications within farm fields. Then, begin to inspect the results by viewing a Movie of the Events, with a data frame rate of 6 frames per second. Because the study area spans multiple Dynamic World tiles, you will find that many Event frames are black, meaning that there was no data in your sector on that particular image. Because of this, and also perhaps because of the very aggressive cloud masking built into Dynamic World, viewing Events (which, as a reminder, are the individual classified images directly from Dynamic World) can be a very challenging way to look for change and stability. BULC’s goal is to sift through those classifications to produce a time series that reflects, according to its estimation, the most likely LULC value at each time step. View the Movie of the BULC results and ask yourself whether each class is equally well replicated across the set of classifications. A still from midway through the Movie sequence of the BULC results can be seen in Fig. F4.8.11. -![Fig. F4.8.11 Still frame (right image) from the animation of BULC’s adjusted estimate of LULC through time near Muiraquitã](../images/F4/image13.png) +![Fig. F4.8.11 Still frame (right image) from the animation of BULC’s adjusted estimate of LULC through time near Muiraquitã](images/F4/image13.png) As BULC uses the classification inputs to estimate the state of the LULC at each time step, it also tracks its confidence in those estimates. This is shown in several ways in the interface. @@ -2636,7 +2636,7 @@ As BULC uses the classification inputs to estimate the state of the LULC at each * Another way of viewing BULC’s confidence is through the Inspector tab. You can click on individual pixels to view their values in the Event time series and in the BULC time series, and see BULC’s corresponding confidence value changing through time in response to the relative stability of each pixel’s classification. * Another way to view BULC’s confidence estimation is as a hillshade enhancement of the final BULC classification. If you select the Probability Hillshade in the set of Map layers, it shows the final BULC classification as a textured surface, in which you can see where lower-confidence pixels are classified. -![Fig. F4.8.12 Still frame from the animation of changing confidence through time, near Muiraquitã.](../images/F4/image40.png) +![Fig. F4.8.12 Still frame from the animation of changing confidence through time, near Muiraquitã.](images/F4/image40.png) #### 5.2. Using BULC To Visualize Uncertainty of Dynamic World in Simplified Categories @@ -2659,7 +2659,7 @@ Before continuing, think for a moment about how many classes you have now. From The confidence image shown in the main Map panel is instructive (Fig. 4.8.13). Using data from 2020, 2021, and 2022, It indicates that much of the uncertainty among the original Dynamic World classifications was in distinguishing labels within agricultural fields. When that uncertainty is removed by combining classes, the BULC result indicates that a substantial part of the remaining uncertainty is at the edges of distinct covers. For example, in the south-central and southern part of the frame, much of the uncertainty among classifications in the original Dynamic World classifications was due to distinction among the highly similar, easily confused classes. Much of what remained (right) after remapping (right) formed outlines of the river and the edges between farmland and forest: a graphic depiction of the “spatial uncertainty” discussed earlier. Yet not all of the uncertainty was spatial; the thicker, darker areas of uncertainty even after remapping (right, at the extreme eastern edge for example) indicates a more fundamental disagreement in the classifications. In those pixels, even when the Agriculture-like classes were compressed, there was still considerable uncertainty (likely between Forest and Active Agriculture) in the true state of these areas. These might be of further interest: were they places newly deforested in 2020-2022? Were they abandoned fields regrowing? Were they degraded at some point? The mapping of uncertainty may hold promise for a better understanding of uncertainty as it is encountered in real classifications, thanks to Dynamic World. -![Fig. F4.8.13 Final confidence layer from the run with (left) and without (right) remapping to combine similar LULC classes to distinguish Forest, Water, and Active Agriculture near -60.696W, -9.826S](../images/F4/image47.png)![Fig. F4.8.13 Final confidence layer from the run with (left) and without (right) remapping to combine similar LULC classes to distinguish Forest, Water, and Active Agriculture near -60.696W, -9.826S](../images/F4/image89.png) +![Fig. F4.8.13 Final confidence layer from the run with (left) and without (right) remapping to combine similar LULC classes to distinguish Forest, Water, and Active Agriculture near -60.696W, -9.826S](images/F4/image47.png)![Fig. F4.8.13 Final confidence layer from the run with (left) and without (right) remapping to combine similar LULC classes to distinguish Forest, Water, and Active Agriculture near -60.696W, -9.826S](images/F4/image89.png) Given the tools and approaches presented in this lab, you should now be able to import your own classifications for BULC (Sects. 1–3), detect changes in sets of raw imagery (Sect. 4), or use Dynamic World’s pre-created classifications (Sect. 5). The following exercises explore this potential. @@ -2922,7 +2922,7 @@ Map.addLayer(covariance17.arrayGet([0, 1]), ``` Inspect the pixel values of the resulting covariance image (Fig. F4.9.1). The covariance is positive when the greater values of one variable (at time t) mainly correspond to the greater values of the other variable (at time h), and the same holds for the lesser values, therefore, the values tend to show similar behavior. In the opposite case, when the greater values of a variable correspond to the lesser values of the other variable, the covariance is negative. -![Fig. F4.9.1 Autocovariance image](../images/F4/image2.png) +![Fig. F4.9.1 Autocovariance image](images/F4/image2.png) The diagonal elements of the variance-covariance array are variances. Copy and paste the code below to define and map a function to compute correlation (Fig. F4.9.2) from the variance-covariance array. @@ -2946,7 +2946,7 @@ Map.addLayer(correlation17, }, 'correlation (lag = 17 days)'); ``` -![Fig. F4.9.2 Autocorrelation image](../images/F4/image33.png) +![Fig. F4.9.2 Autocorrelation image](images/F4/image33.png) Higher positive values indicate higher correlation between the elements of the dataset, and lower negative values indicate the opposite. @@ -2985,7 +2985,7 @@ Map.addLayer(corr1PrecipNDVI, { ``` What do you observe from this result? Looking at the cross-correlation image (Fig. F4.9.3), do you observe high values where you would expect high NDVI values (vegetated areas)? One possible drawback of this computation is that it's only based on five days of precipitation, whichever five days came right before the NDVI image. -![Fig. F4.9.3 Cross-correlation image of NDVI and precipitation with a five-day lag.](../images/F4/image46.png) +![Fig. F4.9.3 Cross-correlation image of NDVI and precipitation with a five-day lag.](images/F4/image46.png) Perhaps precipitation in the month before the observed NDVI is relevant? Copy and paste the code below to test the 30-day lag idea. @@ -3017,7 +3017,7 @@ Observe that the only change is to the merge method. Instead of merging the band Which changes do you notice between the cross-correlation images—5 days lag vs. 30 days lag (Fig. F4.9.4)?. You can use the Inspector tool to assess if the correlation increased or not at vegetated areas. -![Fig. F4.9.4 Cross-correlation image of NDVI and precipitation with a 30-day lag.](../images/F4/image34.png) +![Fig. F4.9.4 Cross-correlation image of NDVI and precipitation with a 30-day lag.](images/F4/image34.png) As long as there is sufficient temporal overlap between the time series, these techniques could be extended to longer lags and longer time series. @@ -3095,7 +3095,7 @@ print(ui.Chart.image.series( })); ``` -![Fig. F4.9.5 Observed NDVI and fitted values at selected point](../images/F4/image19.png) +![Fig. F4.9.5 Observed NDVI and fitted values at selected point](images/F4/image19.png) At this stage, note that the missing data has become a real problem. Any data point for which at least one of the previous points is masked or missing is also masked. diff --git a/chapters/B4_Vectors_Tables.qmd b/chapters/B4_Vectors_Tables.qmd index a9e2b5c..fab5c4d 100644 --- a/chapters/B4_Vectors_Tables.qmd +++ b/chapters/B4_Vectors_Tables.qmd @@ -64,7 +64,7 @@ To demonstrate how geometry tools in Earth Engine work, let’s start by creatin Click on the geometry tools in the top left of the Map pane and create a point feature. Place a new point where USF is located (see Fig. F5.0.1). -![Fig. F5.0.1 Location of the USF campus in San Francisco, California. Your first point should be in this vicinity. The red arrow points to the geometry tools.](../images/F5/image54.png) +![Fig. F5.0.1 Location of the USF campus in San Francisco, California. Your first point should be in this vicinity. The red arrow points to the geometry tools.](images/F5/image54.png) Use Google Maps to search for “Harney Science Center” or “Lo Schiavo Center for Science.” Hover your mouse over the Geometry Imports to find the +new layer menu item and add a new layer to delineate the boundary of a building on campus. @@ -73,7 +73,7 @@ Next, create another new layer to represent the entire campus as a polygon. After you create these layers, rename the geometry imports at the top of your script. Name the layers usf_point, usf_building, and usf_campus. These names are used within the script shown in Fig. F5.0.2. -![Fig. F5.0.2 Rename the default variable names for each layer in the Imports section of the code at the top of your script](../images/F5/image10.png) +![Fig. F5.0.2 Rename the default variable names for each layer in the Imports section of the code at the top of your script](images/F5/image10.png) :::{.callout-note} @@ -103,7 +103,7 @@ There are many image collections loaded in Earth Engine, and they can cover a ve Use your internet searching skills to locate the “Analysis Neighborhoods” dataset covering San Francisco. This data might be located in a number of places, including DataSF, the City of San Francisco’s public-facing data repository. -![Fig. F5.0.3 DataSF website neighborhood shapefile to download](../images/F5/image27.png) +![Fig. F5.0.3 DataSF website neighborhood shapefile to download](images/F5/image27.png) After you find the Analysis Neighborhoods layer, click Export and select Shapefile (Fig. F5.0.3). Keep track of where you save the zipped file, as we will load this into Earth Engine. Shapefiles contain vector-based data—points, lines, polygons—and include a number of files, such as the location information, attribute information, and others. @@ -114,14 +114,14 @@ Extract the folder to your computer. When you open the folder, you will see that Navigate to the Assets tab (near Scripts). Select New > Table Upload > Shape files (Fig. F5.0.4). -![Fig. F5.0.4 Import an asset as a zipped folder](../images/F5/image52.png) +![Fig. F5.0.4 Import an asset as a zipped folder](images/F5/image52.png) #### Select Files and Name Asset Click the Select button and then use the file navigator to select the component files of the shapefile structure (i.e., .shp, .dbf, .shx, and .prj) (Fig. F5.0.5). Assign an Asset Name so you can recognize this asset. -![Fig. F5.0.5 Select the four files extracted from the zipped folder. Make sure each file has the same name and that there are no spaces in the file names of the component files of the shapefile structure.](../images/F5/image43.png) +![Fig. F5.0.5 Select the four files extracted from the zipped folder. Make sure each file has the same name and that there are no spaces in the file names of the component files of the shapefile structure.](images/F5/image43.png) Uploading the asset may take a few minutes. The status of the upload is presented under the Tasks tab. After your asset has been successfully loaded, click on the asset in the Assets folder and find the collection ID. Copy this text and use it to import the file into your Earth Engine analysis. @@ -300,7 +300,7 @@ Export.table.toDrive({ ``` When you run this code, you will notice that you have the Tasks tab highlighted on the top right of the Earth Engine Code Editor (Fig. F5.0.6). You will be prompted to name the directory when exporting the data. -![Fig. F5.0.6 Under the Tasks tab, select Run to initiate download](../images/F5/image4.png) +![Fig. F5.0.6 Under the Tasks tab, select Run to initiate download](images/F5/image4.png) After you run the task, the file will be saved to your Google Drive. You have now brought a feature into Earth Engine and also exported data from Earth Engine. @@ -457,13 +457,13 @@ var elevationDrawn = elevationVector.draw({ Map.addLayer(elevationDrawn, {}, 'Elevation zone polygon'); ``` -![](../images/F5/image50.png) +![](images/F5/image50.png) -![](../images/F5/image33.png) +![](images/F5/image33.png) -![](../images/F5/image36.png) +![](images/F5/image36.png) -![Fig. F5.1.1 Raster-based elevation (top left) and zones (top right), vectorized elevation zones overlaid on the raster (bottom-left) and vectorized elevation zones only (bottom-right)](../images/F5/image7.png) +![Fig. F5.1.1 Raster-based elevation (top left) and zones (top right), vectorized elevation zones overlaid on the raster (bottom-left) and vectorized elevation zones only (bottom-right)](images/F5/image7.png) You may have realized that polygons consist of complex lines, including some small polygons with just one pixel. That happens when there are no surrounding pixels of the same elevation zone. You may not need a vector map with such details—if, for instance, you want to produce a regional or global map. We can use a morphological reducer focalMode to simplify the shape by defining a neighborhood size around a pixel. In this example, we will set the kernel radius as four pixels. This operation makes the resulting polygons look much smoother, but less precise (Fig. F5.1.2). @@ -501,18 +501,18 @@ Map.addLayer(smoothDrawn, {}, 'Elevation zone polygon (smooth)'); We can see now that the polygons have more distinct shapes with many fewer small polygons in the new map (Fig. F5.1.2). It is important to note that when you use methods like focalMode (or other, similar methods such as connectedComponents and connectedPixelCount), you need to reproject according to the original image in order to display properly with zoom using the interactive Code Editor. -![](../images/F5/image20.png) +![](images/F5/image20.png) -![Fig. F5.1.2 Before (left) and after (right) applying focalMode](../images/F5/image37.png) +![Fig. F5.1.2 Before (left) and after (right) applying focalMode](images/F5/image37.png) #### Raster to Points Lastly, we will convert a small part of this elevation image into a point vector dataset. For this exercise, we will use the same example and build on the code from the previous subsection. This might be useful when you want to use geospatial data in a tabular format in combination with other conventional datasets such as economic indicators (Fig. F5.1.3). -![](../images/F5/image24.png) +![](images/F5/image24.png) -![Fig. F5.1.3 Elevation point values with latitude and longitude](../images/F5/image11.png) +![Fig. F5.1.3 Elevation point values with latitude and longitude](images/F5/image11.png) The easiest way to do this is to use sample while activating the geometries parameter. This will extract the points at the centroid of the elevation pixel. @@ -571,7 +571,7 @@ Map.addLayer(elevationSamplesStratified, {}, 'Stratified samples'); ``` -![Fig. F5.1.4 Stratified sampling over different elevation zones](../images/F5/image23.png) +![Fig. F5.1.4 Stratified sampling over different elevation zones](images/F5/image23.png) :::{.callout-note} @@ -637,7 +637,7 @@ Map.setOptions('SATELLITE'); ``` This will display the boundary of the La Paya protected area and deforestation in the region (Fig. F5.1.5). -![Fig. F5.1.5 View of the La Paya protected area in the Colombian Amazon (in white), and deforestation over the period 2001–2020 (in yellows and reds, with darker colors indicating more recent changes)](../images/F5/image55.png) +![Fig. F5.1.5 View of the La Paya protected area in the Colombian Amazon (in white), and deforestation over the period 2001–2020 (in yellows and reds, with darker colors indicating more recent changes)](images/F5/image55.png) We can use Earth Engine to convert the deforestation raster to a set of polygons. The deforestation data are appropriate for this transformation as each deforestation event is labeled categorically by year, and change events are spatially contiguous. This is performed in Earth Engine using the ee.Image.reduceToVectors method, as described earlier in this section. @@ -668,9 +668,9 @@ Map.addLayer(deforestationVectorOutline, { ``` Fig. F5.1.6 shows a comparison of the raster versus vector representations of deforestation within the protected area. -![](../images/F5/image42.png) +![](images/F5/image42.png) -![Fig. F5.1.6 Raster (left) versus vector (right) representations of deforestation data of the La Paya protected area](../images/F5/image13.png) +![Fig. F5.1.6 Raster (left) versus vector (right) representations of deforestation data of the La Paya protected area](images/F5/image13.png) Having converted from raster to vector, a new set of operations becomes available for post-processing the deforestation data. We might, for instance, be interested in the number of individual change events each year (Fig. F5.1.7): @@ -690,7 +690,7 @@ var chart = ui.Chart.feature });print(chart); ``` -![Fig. F5.1.7 Plot of the number of deforestation events in La Paya for the years 2001–2020](../images/F5/image15.png) +![Fig. F5.1.7 Plot of the number of deforestation events in La Paya for the years 2001–2020](images/F5/image15.png) There might also be interest in generating point locations for individual change events (e.g., to aid a field campaign): @@ -911,11 +911,11 @@ Map.addLayer(distance.updateMask(protectedAreaRaster.unmask() max: 20000}, 'Distance outside protected area'); ``` -![](../images/F5/image56.png) +![](images/F5/image56.png) -![](../images/F5/image9.png) +![](images/F5/image9.png) -![Fig. F5.1.8 Distance from the La Paya boundary (left), distance within the La Paya (middle), and distance outside the La Paya (right)](../images/F5/image25.png) +![Fig. F5.1.8 Distance from the La Paya boundary (left), distance within the La Paya (middle), and distance outside the La Paya (right)](images/F5/image25.png) Sometimes it makes sense to work with objects in raster imagery. This is an unusual case of vector-like operations conducted with raster data. There is a good reason for this where the vector equivalent would be computationally burdensome. @@ -950,13 +950,13 @@ Map.addLayer(deforestation5km, { ``` -![](../images/F5/image22.png) +![](images/F5/image22.png) -![](../images/F5/image6.png) +![](images/F5/image6.png) -![](../images/F5/image21.png) +![](images/F5/image21.png) -![Fig. F5.1.9 Distance zones (top left) and deforestation by zone (<1 km, <3 km, and <5 km)](../images/F5/image26.png) +![Fig. F5.1.9 Distance zones (top left) and deforestation by zone (<1 km, <3 km, and <5 km)](images/F5/image26.png) Lastly, we can estimate the deforestation area within 1 km of the protected area but only outside of the boundary. @@ -1254,10 +1254,10 @@ Map.addLayer(ptsTopo, { ``` The result is a copy of the buffered point feature collection with new properties added for the region reduction of each selected image band according to the given reducer. A part of the FeatureCollection is shown in Fig. F5.2.1. The data in that FeatureCollection corresponds to a table containing the information of Table F5.2.3. See Fig. F5.2.2 for a graphical representation of the points and the topographic data being summarized. -![Fig. F5.2.1 A part of the FeatureCollection produced by calculating the zonal statistics](../images/F5/image29.png) +![Fig. F5.2.1 A part of the FeatureCollection produced by calculating the zonal statistics](images/F5/image29.png) -![Fig. F5.2.2 Sample points and topographic slope. Elevation and slope values for regions intersecting each buffered point are reduced and attached as properties of the points.](../images/F5/image5.png) +![Fig. F5.2.2 Sample points and topographic slope. Elevation and slope values for regions intersecting each buffered point are reduced and attached as properties of the points.](images/F5/image5.png) Table F5.2.3 Example output from zonalStats organized as a table. Rows correspond to collection features and columns are feature properties. Note that elevation and slope values in this table are rounded to the nearest tenth for brevity. @@ -1553,7 +1553,7 @@ Map.addLayer(pixelsFc, { ``` -![Fig. F5.2.3 Identifying pixels used in zonal statistics. By mapping the image and vector together, you can see which pixels are included in the unweighted statistic. For this example, three pixels would be included in the statistic because the polygon covers the center point of three pixels.](../images/F5/image44.png) +![Fig. F5.2.3 Identifying pixels used in zonal statistics. By mapping the image and vector together, you can see which pixels are included in the unweighted statistic. For this example, three pixels would be included in the statistic because the polygon covers the center point of three pixels.](images/F5/image44.png) :::{.callout-note} @@ -1645,7 +1645,7 @@ Map.addLayer(sfBlocks, { color: '#de2d26'}, 'Census Blocks (single color)'); ``` -![Fig. F5.3.1 San Francisco census blocks](../images/F5/image34.png) +![Fig. F5.3.1 San Francisco census blocks](images/F5/image34.png) The census blocks table has a property named 'pop10' containing the population totals as of the 2010 census. We can use this to create a choropleth map showing population density. We first need to compute the population density for each feature and add it as a property. To add a new property to each feature, we can map a function over the FeatureCollection and calculate the new property called 'pop_density'. Earth Engine provides the area function, which can calculate the area of a feature in square meters. We convert it to square miles and calculate the population density per square mile. @@ -1685,7 +1685,7 @@ var visParams = { Map.addLayer(sfBlocksPaint.clip(geometry), visParams, 'Population Density'); ``` -![Fig. F5.3.2 San Francisco population density](../images/F5/image41.png) +![Fig. F5.3.2 San Francisco population density](images/F5/image41.png) #### Creating a Categorical Map @@ -1713,9 +1713,9 @@ var sfRoadsDraw = sfRoads.draw({ Map.addLayer(sfRoadsDraw, {}, 'Roads (Draw)'); ``` -![](../images/F5/image28.png) +![](images/F5/image28.png) -![Fig. F5.3.3 San Francisco roads rendered with a line width of 2 pixels (left) and and a line width of 1 pixel (right)](../images/F5/image31.png) +![Fig. F5.3.3 San Francisco roads rendered with a line width of 2 pixels (left) and and a line width of 1 pixel (right)](images/F5/image31.png) The road layer has a column called “MTFCC” (standing for the MAF/TIGER Feature Class Code). This contains the road priority codes, representing the various types of roads, such as primary and secondary. We can use this information to render each road segment according to its priority. The draw function doesn’t allow us to specify different styles for each feature. Instead, we need to make use of the style function. @@ -1748,7 +1748,7 @@ var sfRoadsStyle = sfRoads.style({ Map.addLayer(sfRoadsStyle.clip(geometry), {}, 'Roads (Style)'); ``` -![Fig. F5.3.4 San Francisco roads rendered according to road priority](../images/F5/image46.png) +![Fig. F5.3.4 San Francisco roads rendered according to road priority](images/F5/image46.png) :::{.callout-note} @@ -1807,7 +1807,7 @@ var interstateRoadsDrawn = interstateRoads.draw({ Map.addLayer(interstateRoadsDrawn, {}, 'Interstate Roads'); ``` -![Fig. F5.3.5 San Francisco blocks and interstate highways](../images/F5/image2.png) +![Fig. F5.3.5 San Francisco blocks and interstate highways](images/F5/image2.png) Let’s define a join that will select all the features from the sfBlocks layer that are within 1 km of any feature from the interstateRoads layer. We start by defining a filter using the ee.Filter.withinDistance filter. We want to compare the geometries of features in both layers, so we use a special property called '.geo' to compare the collections. By default, the filter will work with exact distances between the geometries. If your analysis does not require a very precise tolerance of spatial uncertainty, specifying a small non-zero maxError distance value will help speed up the spatial operations. A larger tolerance also helps when testing or debugging code so you can get the result quickly instead of waiting longer for a more precise output. @@ -1841,7 +1841,7 @@ var closeBlocksDrawn = closeBlocks.draw({ Map.addLayer(closeBlocksDrawn, {}, 'Blocks within 1km'); ``` -![Fig. F5.3.6 Selected blocks within 1 km of an interstate highway](../images/F5/image40.png) +![Fig. F5.3.6 Selected blocks within 1 km of an interstate highway](images/F5/image40.png) #### Spatial Joins @@ -1874,7 +1874,7 @@ var sfTreesStyled = sfTrees.style({ Map.addLayer(sfTreesStyled, {}, 'SF Trees'); ``` -![Fig. F5.3.7 San Francisco neighborhoods and trees](../images/F5/image35.png) +![Fig. F5.3.7 San Francisco neighborhoods and trees](images/F5/image35.png) To find the tree points in each neighborhood polygon, we will use an ee.Filter.intersects filter. @@ -1904,7 +1904,7 @@ print(joined.first()); ``` -![Fig. F5.3.8 Result of the save-all join](../images/F5/image1.png) +![Fig. F5.3.8 Result of the save-all join](images/F5/image1.png) You will see that each feature of the sfNeighborhoods collection now has an additional property called trees. This contains all the features from the sfTrees collection that were matched using the intersectFilter. We can now map a function over the results and post-process the collection. As our analysis requires the computation of the total number of trees in each neighborhood, we extract the matching features and use the size function to get the count (Fig. F5.3.9). @@ -1917,7 +1917,7 @@ var sfNeighborhoods = joined.map(function(f) { var treesWithin = ee.List(f.get print(sfNeighborhoods.first()); ``` -![Fig. F5.3.9 Final FeatureCollection with the new property](../images/F5/image18.png) +![Fig. F5.3.9 Final FeatureCollection with the new property](images/F5/image18.png) The results now have a property called total_trees containing the count of intersecting trees in each neighborhood polygon. @@ -1938,7 +1938,7 @@ Export.table.toDrive({ ``` The final result is a CSV file with the neighborhood names and total numbers of trees counted using the join (Fig. F5.3.10). -![Fig. F5.3.10 Exported CSV file with tree counts for San Francisco neighborhoods](../images/F5/image3.png) +![Fig. F5.3.10 Exported CSV file with tree counts for San Francisco neighborhoods](images/F5/image3.png) :::{.callout-note} diff --git a/chapters/C1_Lights.qmd b/chapters/C1_Lights.qmd index d5d4af8..7668b8a 100644 --- a/chapters/C1_Lights.qmd +++ b/chapters/C1_Lights.qmd @@ -89,7 +89,7 @@ Map.setOptions('HYBRID') Map.centerObject(AOI) Map.addLayer(VIIRS.first(),VIIRSvis,'Nighttime Lights') ``` -![](../images/iraq_check.png) +![](images/iraq_check.png) If we decrease the opacity of the VIIRS layer, we can see the cities of Mosul, Erbil and Kirkuk shining brightly at night. We can also see a string of bright lights between Kirkuk and Erbil -- these are methane flares from oil wells. @@ -180,7 +180,7 @@ The function returns a timelapse of nighttime lights over Northern Iraq: ``` js gif(VIIRS, VIIRSvis, AOI); ``` -![I've done a bit of post-processing to this gif, adding more annotations and blending between frames to make it a bit smoother. I typically use [ffmpeg](https://ffmpeg.org/) and [ezgif](https://ezgif.com/) for the finishing touches. ](../images/Figure_1.gif) +![I've done a bit of post-processing to this gif, adding more annotations and blending between frames to make it a bit smoother. I typically use [ffmpeg](https://ffmpeg.org/) and [ezgif](https://ezgif.com/) for the finishing touches. ](images/Figure_1.gif) This timelapse gives a play-by-play of one of the most important campaigns in the war against the Islamic State. In the first few frames, Mosul is under the control of the Kurdistan Regional Government (KRG). In the summer of 2014, ISIS captures the city, and power is cut off. Mosul and many villages along the Tigris river are plunged into darkness. In 2015, the front line in the campaign to retake the city emerges around Mosul, advancing in 2016 and 2017. Mosul is eventually retaken by the KRG in 2017, after which it brightens once again as electricity is restored. @@ -240,7 +240,7 @@ var chart = print(chart) ``` -![](../images/qayyarah_chart.png) +![](images/qayyarah_chart.png) We can clearly see Mosul (the red line) darkening in 2014 as the city is taken by ISIS. During this period the Qayyarah oil fields are, as we might expect, quite dark. All of a sudden in 2016 Qayyarah becomes brighter at night than the city of Mosul ever was, as the oilfields are set on fire. Then, almost exactly when the blaze in Qayyarah is extinguished and the area darkens (i.e. when the blue line falls back to near zero), Mosul brightens once again (i.e. the red line rises) as the city is liberated. diff --git a/chapters/C3_Blast.qmd b/chapters/C3_Blast.qmd index f6c55c0..6293042 100644 --- a/chapters/C3_Blast.qmd +++ b/chapters/C3_Blast.qmd @@ -242,13 +242,13 @@ Map.addLayer( The visualization parameters correspond to the statistical significance of the change in pixel values. Using the Viridis color palette which ranges from purple to yellow, dark purple pixels indicate no significant change, and yellow pixels indicate a significant change with with 95% confidence. The brighter the yellow of a pixel, the more significant the change. -![Pixelwise T-Test, 2020](../images/beirut/beirut_change_2020.jpg) +![Pixelwise T-Test, 2020](images/beirut/beirut_change_2020.jpg) This seems to be working quite well; but remember, ports are generally prone to change. The t-test is accounting for this by calculating each pixel's variance over the entire time period, but it's still possible that the change we're seeing is due to the port rather than the explosion. To test this, we can run the same algorithm on the same area, using the same date cutoff (August 4th), but in a different year; I've chosen 2018. This is what's known as a placebo test: if it's still showing loads of statistically significant change around the cutoff, our algorithm is probably picking up on port activity rather than the explosion. -![Pixelwise T-Test, 2018](../images/beirut/beirut_change_2018.jpg) +![Pixelwise T-Test, 2018](images/beirut/beirut_change_2018.jpg) Compared to the 2020 image, there's a lot less yellow (significant change). That being said, there are a few yellow areas. This could be due to a number of reasons: ships coming and going, cranes moving, and containers being loaded and unloaded would all register in the change detection algorithm. There are also a number of yellow specks throughout the city, which is also to be expected since cities are also generally in a state of flux. Construction, demolition, and even the growth of vegetation can all be detected by the algorithm. @@ -344,19 +344,19 @@ Map.addLayer( The result naturally resembles the underlying t-test image, with high levels of damage concentrated around the port, and progressively decreasing damage with distance: -![Building Footprints colored according to estimated blast damage](../images/beirut/beirut_footprints.jpg) +![Building Footprints colored according to estimated blast damage](images/beirut/beirut_footprints.jpg) To get a better sense of how these predicitions correspond to actual damage, we can zoom in and turn on the Google satellite basemap, which has imagery taken just after the explosion; you can still see capsized boats in the port. Zooming in to the epicenter, we can see several warehouses that were effectively vaporized. Our change detection algorithm picks up on a high degree of change, as indicated by the red outlines of the building footprints: -![Predicted damage and optical satellite imagery in the Port of Beirut, August 2020](../images/beirut/beirut_footprints_port.jpg) +![Predicted damage and optical satellite imagery in the Port of Beirut, August 2020](images/beirut/beirut_footprints_port.jpg) This is pretty low-hanging fruit. Let's look at a different area, around 1.3km east from the epicenter with a mix of warehouses and residential buildings: -![Area east of the port: 35.533194, 33.9024](../images/beirut/beirut_footprints_zoomed.jpg) +![Area east of the port: 35.533194, 33.9024](images/beirut/beirut_footprints_zoomed.jpg) Here, there's greater variation in the predictions. I've highlighted three areas. @@ -392,7 +392,7 @@ Below is one of the most viewed videos of the explosion: Geolocating this video was pretty simple thanks to the Greek Orthodox church (highlighted in green below) and the road leading to it (highlighted in blue). The red box indicates the likely location (33.889061, 35.515909) from which the person was filming: -![](../images/beirut/IMG_2.png) +![](images/beirut/IMG_2.png) The video shows heavy damage being sustained by areas well outside the zones classified as damaged in the maps above (both my own and NASA's). Indeed, substantial damage was reported several kilometers away. @@ -401,7 +401,7 @@ The video shows heavy damage being sustained by areas well outside the zones cla Why are satellite images underestimating damage in Beirut? Satellite images are taken from above, and are two-dimensional. Much of the damage caused by the blast, however, was directional; the pressure wave hit the sides of buildings, as shown in this diagram from a FEMA manual: -![](../images/beirut/IMG_3.png) +![](images/beirut/IMG_3.png) Areas close to the explosion suffered so much damage that it could be seen from above, but even if an apartment building had all of its windows blown out, this would not necessarily be visible in a top-down view. Even for radar, which does technically collect data in three dimensions, the angle problem remains; a high resolution radar might be able to tell you how tall an apartment complex is, but it won't give you a clear image of all sides. Case in point: the NASA damage map was created using Sentinel-1 SAR data. In a nutshell, damage assessment in this case is a three-dimensional problem, and remote sensing is a two-dimensional solution. @@ -419,7 +419,7 @@ To create a more accurate rendering of directional blast damage, three dimension Geolocated videos of the blast can be used to verify and adjust the model. Below is a side-by-side comparison of the twitter video and a 3D rendition of OSM data: -![](../images/beirut/IMG_4.png) +![](images/beirut/IMG_4.png) Some slight adjustments to the raw OSM data were made to achieve the image on the right. The building footprints are generally very accurate and comprehensive in coverage, but the building height data does occasionally have to be adjusted manually. A simple and reliable way of doing this is to look at the shadows cast by the building on the satellite base map and scale accordingly. I also added a rough texture to the buildings to help differentiate them, and added the domed roof of the Greek Orthodox church for reference. @@ -434,13 +434,13 @@ For good measure, a second video is geolocated following the same procedure: The second pier (highlighted in green) and the angle (in blue) serve as references: -![](../images/beirut/IMG_5.png) +![](images/beirut/IMG_5.png) The video was taken from the rooftop of a Japanese restaurant called Clap Beirut (in red above). This is confirmed by a picture of the rooftop bar on google images, which matches the bar that can be seen at 0:02 in the twitter video. Below is a comparison of the video view and the 3D OSM model: -![](../images/beirut/IMG_6.png) +![](images/beirut/IMG_6.png) Though somewhat grainy, the basemap on the OSM rendering shows the same parking lot in the foreground, the second pier, and the same two buildings highlighted in yellow. Having created a 3D model of Beirut using OSM data, we can now simulate how the explosion would interact with the cityscape. @@ -455,7 +455,7 @@ Though somewhat grainy, the basemap on the OSM rendering shows the same parking As the pressure wave moved through the Beirut, some buildings bore the full force of the explosion, while others were partially shielded by taller structures. A viewshed analysis can be conducted to identify surfaces that were directly exposed to the explosion by creating a lighting object at ground zero; areas that are lit up experienced unobstructed exposure to the blast: -![](../images/beirut/GIF_1.gif) +![](images/beirut/GIF_1.gif) Pressure waves, like sound, are capable of diffraction (bending around small obstructions). To roughly simulate this, the lighting object is gradually raised, allowing the light to pass "around" obstructions. Warehouses on the Eastern side of the docks, as well as the first row of apartment buildings facing the docks are immediately affected. As the lighting object rises above the warehouse, more areas suffer direct exposure. @@ -464,7 +464,7 @@ Pressure waves, like sound, are capable of diffraction (bending around small obs Using two lighting objects-- a red one at 10 meters and a blue one at 20 meters above the warehouse at ground zero-- the intensity of the blast in different areas is highlighted; red areas suffered direct exposure, blue areas suffered partially obstructed exposure, and black areas were indirectly exposed. -![](../images/beirut/IMG_7.png) +![](images/beirut/IMG_7.png) In the immediate vicinity of the explosion the large "L" shaped building (Lebanon's strategic grain reserve) is bright red, and was barely left standing. It absorbed a large amount of the blast, shielding areas behind it and thereby casting a long blue shadow to the West. If one refers back to the satellite damage maps above, there appears to be significantly less damage in the area just West of ("behind") the grain silo, roughly corresponding to the blue shadow above. While these areas were still heavily damaged, they seem to have suffered less damage than areas of equal distance to the East. @@ -482,7 +482,7 @@ The viewshed analysis tells us which sides of a building are exposed to the blas To get a more precise idea of the way in which the blast interacted with the urban environment, we can model the blast as an actual wave using the "dynamic wave" feature in Blender. This effectively involves creating a two-dimensional plane, telling it to behave like water, and simulating an object being dropped into the water. By putting an obstruction in this plane, we can see how the wave responds to it. As an example, the grain silo has been isolated below: -![](../images/beirut/GIF_2.gif) +![](images/beirut/GIF_2.gif) As the blast hits the side of the silo, it is reflected. Two large waves can be seen traveling to the right: the initial blast wave, and the reflection from the silo which rivals the initial wave in magnitude. To the left, the wave travels around the silo but is significantly weakened. @@ -491,7 +491,7 @@ As the blast hits the side of the silo, it is reflected. Two large waves can be Broadening the focus and adding the rest of the OSM data back in, we can observe how the pressure wave interacted with buildings on the waterfront: -![](../images/beirut/GIF_3.gif) +![](images/beirut/GIF_3.gif) The warehouses on the docks were omitted to emphasize the interaction between the pressure wave and the waterfront buildings; their light metal structure and low height means they would have caused little reflection anyway. The general pattern of the dynamic wave is consistent with the viewshed, but adds a layer of detail. The blast is reflected off of the silo towards the East, leading to a double hit. Though the wave still moves around the silo to the West, the pressure is diminished. Once the wave hits the highrises, the pattern becomes noisy as the wave both presses forward into the mainland and is reflected back towards the pier. @@ -519,7 +519,7 @@ For reference, 137 kPa results in 99% fatalities, 68 kPa is enough to cause stru Linking the values in this graph to the color of the pressure wave sphere provides a visual representation of the blast's force as it expands. An RGB color scale corresponds to the blast's overpressure at three threshold values. -![](../images/beirut/beirut.gif) +![](images/beirut/beirut.gif) @@ -530,7 +530,7 @@ By keeping the lighting object from the viewshed analysis and placing it within Now, referring back to the two geolocated twitter videos from earlier, we can recreate the blast in our 3D model and get some new insights. Below is a side-by-side comparison of the first video and the 3D model: -![](../images/beirut/GIF_5.gif) +![](images/beirut/GIF_5.gif) Judging by the twitter video alone, it would be very hard to tell the fate of the person filming or the damage caused to the building that they were in. However, the 3D model shows that despite having an unobstructed view of the explosion, the incident pressure of the pressure wave had decreased significantly by the time it reached the viewing point. The blue-green color corresponds to roughly 15 kPa-- enough to injure and break windows, but not enough to cause structural damage to the building. @@ -539,7 +539,7 @@ Judging by the twitter video alone, it would be very hard to tell the fate of th The second twitter video was taken slightly closer to ground zero, but the view was partially obstructed by the grain silo: -![](../images/beirut/GIF_6.gif) +![](images/beirut/GIF_6.gif) Though the pressure wave probably exerted more pressure compared to the first angle, the partial obstruction of the grain silo likely tempered the force of the blast. @@ -551,7 +551,7 @@ Though the pressure wave probably exerted more pressure compared to the first an As a concrete example of how this approach can be used to assess damage (or predict it, if one had the foresight), let us consider the Skyline Tower, pictured below following the explosion: -![](../images/beirut/IMG_8.png) +![](images/beirut/IMG_8.png) This partial side view shows two faces of the building, labeled "A" and "B" above. Side A was nearly perpendicular to the blast, and just 600m from ground zero. Based on the previous modeling, the pressure wave exerted roughly 40 kPa on this side of the building. The corner where sides A and B meet, highlighted in green, shows total destruction of windows, removal of most siding panels, and structural damage. The back corner, highlighted in red, shows many windows still intact, indicating that the maximum overpressure on this side of the building likely didn't exceed 10 kPa. In other words, standing on the front balcony would likely have led to serious injury but standing on the back balcony would have been relatively safe. @@ -560,7 +560,7 @@ This partial side view shows two faces of the building, labeled "A" and "B" abov The animation below shows the Skyline Tower as it is hit by the pressure wave, with sides A and B labeled: -![](../images/beirut/GIF_7.gif) +![](images/beirut/GIF_7.gif) The bright green color of the pressure wave indicates a strong likelihood of structural damage. Side A can be seen taking a direct hit, while side B is angled slightly away. Despite not being directly exposed to the blast, it likely still took reflective damage from some of the neighboring buildings. Both the incident overpressure indicated by the color of the sphere, as well as the relative brightness of sides A and B both correspond closely to the observed damage taken by the Skyline Tower. diff --git a/chapters/C5_Object_Detection.qmd b/chapters/C5_Object_Detection.qmd index f893961..11976d6 100644 --- a/chapters/C5_Object_Detection.qmd +++ b/chapters/C5_Object_Detection.qmd @@ -388,7 +388,7 @@ Once you've done this, you can run the following line of code to automatically i -![](../images/mikolayiv.mp4) +![](images/mikolayiv.mp4) --> \ No newline at end of file diff --git a/chapters/index.log b/chapters/index.log index 606822d..b58cbde 100644 --- a/chapters/index.log +++ b/chapters/index.log @@ -1,4 +1,4 @@ -This is XeTeX, Version 3.141592653-2.6-0.999994 (TeX Live 2022) (preloaded format=xelatex 2022.10.26) 17 APR 2023 11:17 +This is XeTeX, Version 3.141592653-2.6-0.999994 (TeX Live 2022) (preloaded format=xelatex 2022.10.26) 17 APR 2023 11:43 entering extended mode restricted \write18 enabled. %&-line parsing enabled. diff --git a/chapters/index.tex b/chapters/index.tex index 07f2b0b..5ff0cbb 100644 --- a/chapters/index.tex +++ b/chapters/index.tex @@ -219,7 +219,7 @@ \begin{document} \maketitle -\ifdefined\Shaded\renewenvironment{Shaded}{\begin{tcolorbox}[frame hidden, enhanced, interior hidden, borderline west={3pt}{0pt}{shadecolor}, boxrule=0pt, sharp corners, breakable]}{\end{tcolorbox}}\fi +\ifdefined\Shaded\renewenvironment{Shaded}{\begin{tcolorbox}[frame hidden, interior hidden, breakable, sharp corners, borderline west={3pt}{0pt}{shadecolor}, boxrule=0pt, enhanced]}{\end{tcolorbox}}\fi \renewcommand*\contentsname{Table of contents} { @@ -400,7 +400,7 @@ either emitted or reflected from the object being sensed. The reflected radiation is then collected by a sensor and processed to obtain information about the object. -\includegraphics{../images/diagram.png} +\includegraphics{images/diagram.png} While most satellite imagery is optical, meaning it captures sunlight reflected by the earth's surface, Synthetic Aperture Radar (SAR) @@ -424,9 +424,9 @@ satellite basemap, for example, is really sharp. Most of the optical imagery that is freely available has relatively low spatial resolution (it looks more grainy than, for example, the Google satellite basemap), -\includegraphics{../images/Landsat.png} -\includegraphics{../images/Sentinel2.png} -\includegraphics{../images/Maxar.png} +\includegraphics{images/Landsat.png} +\includegraphics{images/Sentinel2.png} +\includegraphics{images/Maxar.png} \hypertarget{spectral-resolution}{% \subsection{Spectral Resolution}\label{spectral-resolution}} @@ -585,7 +585,7 @@ cover that in the next section. \begin{figure} -{\centering \includegraphics{../images/obj_det3.jpg} +{\centering \includegraphics{images/obj_det3.jpg} } @@ -743,7 +743,7 @@ Coverage \begin{figure} -{\centering \includegraphics{../images/radar ships.jpg} +{\centering \includegraphics{images/radar ships.jpg} } @@ -806,7 +806,7 @@ Coverage \begin{figure} -{\centering \includegraphics{../images/Figure_1.gif} +{\centering \includegraphics{images/Figure_1.gif} } @@ -878,7 +878,7 @@ Data}\label{climate-and-atmospheric-data}} \begin{figure} -{\centering \includegraphics[width=1\textwidth,height=\textheight]{../images/mishraq_small.gif} +{\centering \includegraphics[width=1\textwidth,height=\textheight]{images/mishraq_small.gif} } @@ -966,7 +966,7 @@ NRT} & 2016-Present & 44528m & Global \\ \begin{figure} -{\centering \includegraphics{../images/mining.jpg} +{\centering \includegraphics{images/mining.jpg} } @@ -1031,7 +1031,7 @@ Coverage \begin{figure} -{\centering \includegraphics{../images/fires.jpg} +{\centering \includegraphics{images/fires.jpg} } @@ -1111,7 +1111,7 @@ Estimates}\label{population-density-estimates}} \begin{figure} -{\centering \includegraphics{../images/pop.jpg} +{\centering \includegraphics{images/pop.jpg} } @@ -1183,7 +1183,7 @@ Coverage \begin{figure} -{\centering \includegraphics{../images/footprints.png} +{\centering \includegraphics{images/footprints.png} } @@ -1244,7 +1244,7 @@ Buildings} & 2022 & Africa \\ \begin{figure} -{\centering \includegraphics{../images/fao_gaul.jpg} +{\centering \includegraphics{images/fao_gaul.jpg} } @@ -1305,7 +1305,7 @@ Database}\label{global-power-plant-database}} \begin{figure} -{\centering \includegraphics{../images/power.jpg} +{\centering \includegraphics{images/power.jpg} } @@ -1376,7 +1376,7 @@ Coverage \hypertarget{programming-basics}{% \section{Programming Basics}\label{programming-basics}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author}{% \subsection*{Author}\label{author}} @@ -1479,7 +1479,7 @@ Editor, you will see a screen such as the one shown in Fig. F1.0.1. \begin{figure} -{\centering \includegraphics{../images/F1/image41.png} +{\centering \includegraphics{images/F1/image41.png} } @@ -1509,7 +1509,7 @@ panel under the Console tab (Fig. F1.0.2.). \begin{figure} -{\centering \includegraphics{../images/F1/image57.png} +{\centering \includegraphics{images/F1/image57.png} } @@ -1523,7 +1523,7 @@ want to save it. Click the ``Save'' button (Fig. F1.0.3). \begin{figure} -{\centering \includegraphics{../images/F1/image5.png} +{\centering \includegraphics{images/F1/image5.png} } @@ -1540,7 +1540,7 @@ username (Fig. F1.0.4). \begin{figure} -{\centering \includegraphics{../images/F1/image64.png} +{\centering \includegraphics{images/F1/image64.png} } @@ -1556,7 +1556,7 @@ named ``default'' (Fig. F1.0.5). \begin{figure} -{\centering \includegraphics{../images/F1/image33.png} +{\centering \includegraphics{images/F1/image33.png} } @@ -1569,7 +1569,7 @@ repository. Enter the name ``hello\_world'' and click OK (Fig. F1.0.6). \begin{figure} -{\centering \includegraphics{../images/F1/image37.png} +{\centering \includegraphics{images/F1/image37.png} } @@ -1583,7 +1583,7 @@ available to you when you open the Code Editor. \begin{figure} -{\centering \includegraphics{../images/F1/image24.png} +{\centering \includegraphics{images/F1/image24.png} } @@ -1672,7 +1672,7 @@ using a numeric value that indicates its position in the list. \begin{figure} -{\centering \includegraphics{../images/F1/image10.png} +{\centering \includegraphics{images/F1/image10.png} } @@ -1713,7 +1713,7 @@ retrieve the value of an item. \begin{figure} -{\centering \includegraphics{../images/F1/image40.png} +{\centering \includegraphics{images/F1/image40.png} } @@ -1749,7 +1749,7 @@ and it generates different outputs with the same code. \begin{figure} -{\centering \includegraphics{../images/F1/image54.png} +{\centering \includegraphics{images/F1/image54.png} } @@ -1777,7 +1777,7 @@ Congratulations! You have learned enough JavaScript to be able to use the Earth Engine API. In the next section, you will see how to access and execute Earth Engine API functions using JavaScript. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F10a. The book's repository contains a script that shows what your code should look like at this point. @@ -1795,7 +1795,7 @@ functions grouped by object types. The API functions have the prefix ee \begin{figure} -{\centering \includegraphics{../images/F1/image59.png} +{\centering \includegraphics{images/F1/image59.png} } @@ -1832,7 +1832,7 @@ add a and b. \begin{figure} -{\centering \includegraphics{../images/F1/image13.png} +{\centering \includegraphics{images/F1/image13.png} } @@ -1863,7 +1863,7 @@ bring up the documentation of the function. \begin{figure} -{\centering \includegraphics{../images/F1/image65.png} +{\centering \includegraphics{images/F1/image65.png} } @@ -1890,7 +1890,7 @@ indeed contains the list of years with the correct interval. \begin{figure} -{\centering \includegraphics{../images/F1/image29.png} +{\centering \includegraphics{images/F1/image29.png} } @@ -1901,7 +1901,7 @@ indeed contains the list of years with the correct interval. You just accomplished a moderately complex programming task with the help of Earth Engine API. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F10b. The book's repository contains a script that shows what your code should look like at this point. @@ -1923,7 +1923,7 @@ scripts for remote sensing analysis. \hypertarget{exploring-images}{% \section{Exploring Images}\label{exploring-images}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-1}{% \subsection*{Author}\label{author-1}} @@ -2020,7 +2020,7 @@ first band is ``SR\_B1'' (Fig. F1.1.1). \begin{figure} -{\centering \includegraphics{../images/F1/image66.png} +{\centering \includegraphics{images/F1/image66.png} } @@ -2105,7 +2105,7 @@ location under three categories as follows: \begin{figure} -{\centering \includegraphics{../images/F1/image69.png} +{\centering \includegraphics{images/F1/image69.png} } @@ -2172,7 +2172,7 @@ value can range between 0 (transparent) and 1 (opaque). \begin{figure} -{\centering \includegraphics{../images/F1/image36.png} +{\centering \includegraphics{images/F1/image36.png} } @@ -2208,7 +2208,7 @@ the order of the layers in the list to the sequence of operations in your script. What layer did your script add first and where does this appear in the layering order on the map? -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F11a. The book's repository contains a script that shows what your code should look like at this point. @@ -2256,7 +2256,7 @@ low-flying drone. \begin{figure} -{\centering \includegraphics{../images/F1/image39.png} +{\centering \includegraphics{images/F1/image39.png} } @@ -2298,7 +2298,7 @@ through what is passed to the red, green, and blue color channels. \begin{figure} -{\centering \includegraphics{../images/F1/image21.png} +{\centering \includegraphics{images/F1/image21.png} } @@ -2320,7 +2320,7 @@ much greater than for B3 or B2. \begin{figure} -{\centering \includegraphics{../images/F1/image22.png} +{\centering \includegraphics{images/F1/image22.png} } @@ -2360,7 +2360,7 @@ green (Fig. F1.1.7). \begin{figure} -{\centering \includegraphics{../images/F1/image4.png} +{\centering \includegraphics{images/F1/image4.png} } @@ -2375,11 +2375,11 @@ composite. Why do you think that is? Does the image on the right show new distinctions not seen in the image on the left? If so, what do you think they are? -\includegraphics{../images/F1/image25.png} +\includegraphics{images/F1/image25.png} \begin{figure} -{\centering \includegraphics{../images/F1/image8.png} +{\centering \includegraphics{images/F1/image8.png} } @@ -2388,7 +2388,7 @@ composites} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F11b. The book's repository contains a script that shows what your code should look like at this point. @@ -2449,7 +2449,7 @@ F1.1.10). \begin{figure} -{\centering \includegraphics{../images/F1/image34.png} +{\centering \includegraphics{images/F1/image34.png} } @@ -2507,7 +2507,7 @@ blue (Fig. F1.1.11). \begin{figure} -{\centering \includegraphics{../images/F1/image51.png} +{\centering \includegraphics{images/F1/image51.png} } @@ -2556,7 +2556,7 @@ heavily in 2003 and less frequently by 2013 (Fig. F1.1.11). \begin{figure} -{\centering \includegraphics{../images/F1/image52.png} +{\centering \includegraphics{images/F1/image52.png} } @@ -2582,7 +2582,7 @@ the Satellite base layer (upper right). \begin{figure} -{\centering \includegraphics{../images/F1/image48.png} +{\centering \includegraphics{images/F1/image48.png} } @@ -2599,7 +2599,7 @@ value of each band. This will empower you to employ false-color composites as a flexible and powerful method to explore and interpret geographic patterns and changes on Earth's surface. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F11c. The book's repository contains a script that shows what your code should look like at this point. @@ -2633,7 +2633,7 @@ about the location, date collected, and other properties of each image, allowing you to sift through the ImageCollection for the exact image characteristics needed for your analysis. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{authors}{% \subsection*{Authors}\label{authors}} @@ -2757,7 +2757,7 @@ First, let's examine the map output (Fig. F1.2.1). \begin{figure} -{\centering \includegraphics{../images/F1/image18.png} +{\centering \includegraphics{images/F1/image18.png} } @@ -2783,7 +2783,7 @@ different on your map because of this. \begin{figure} -{\centering \includegraphics{../images/F1/image9.png} +{\centering \includegraphics{images/F1/image9.png} } @@ -2800,7 +2800,7 @@ million image names printed to the Console! \begin{figure} -{\centering \includegraphics{../images/F1/image71.png} +{\centering \includegraphics{images/F1/image71.png} } @@ -2809,7 +2809,7 @@ and information to the screen for too many elements} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F12a. The book's repository contains a script that shows what your code should look like at this point. @@ -2865,7 +2865,7 @@ minimum and maximum of the range of display values. \begin{figure} -{\centering \includegraphics{../images/F1/image38.png} +{\centering \includegraphics{images/F1/image38.png} } @@ -2920,7 +2920,7 @@ winter collection---we only have seven images. \begin{figure} -{\centering \includegraphics{../images/F1/image62.png} +{\centering \includegraphics{images/F1/image62.png} } @@ -2970,7 +2970,7 @@ level of 7 (zoom levels go from 0 to 24). \begin{figure} -{\centering \includegraphics{../images/F1/image43.png} +{\centering \includegraphics{images/F1/image43.png} } @@ -2978,7 +2978,7 @@ level of 7 (zoom levels go from 0 to 24). \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F12b. The book's repository contains a script that shows what your code should look like at this point. @@ -3057,7 +3057,7 @@ looking at the image ``id'' (Fig. F1.2.7). This has the value \begin{figure} -{\centering \includegraphics{../images/F1/image30.png} +{\centering \includegraphics{images/F1/image30.png} } @@ -3085,7 +3085,7 @@ previous chapter). \begin{figure} -{\centering \includegraphics{../images/F1/image15.png} +{\centering \includegraphics{images/F1/image15.png} } @@ -3099,7 +3099,7 @@ previous section (Fig. F1.2.6). Zoom in and out and pan the screen as needed. What do you notice? Save your script but don't start a new one---we will keep adding code to this script. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F12c. The book's repository contains a script that shows what your code should look like at this point. @@ -3141,7 +3141,7 @@ Central Africa? Northern Australia? \begin{figure} -{\centering \includegraphics{../images/F1/image19.png} +{\centering \includegraphics{images/F1/image19.png} } @@ -3149,7 +3149,7 @@ Central Africa? Northern Australia? \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F12d. The book's repository contains a script that shows what your code should look like at this point. @@ -3216,7 +3216,7 @@ F1.2.12). \begin{figure} -{\centering \includegraphics{../images/F1/image56.png} +{\centering \includegraphics{images/F1/image56.png} } @@ -3264,7 +3264,7 @@ won't affect the script in any way. \begin{figure} -{\centering \includegraphics{../images/F1/image68.png} +{\centering \includegraphics{images/F1/image68.png} } @@ -3297,7 +3297,7 @@ is shown in red)? \begin{figure} -{\centering \includegraphics{../images/F1/image16.png} +{\centering \includegraphics{images/F1/image16.png} } @@ -3306,7 +3306,7 @@ is shown in red)? \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F12f. The book's repository contains a script that shows what your code should look like at this point. @@ -3342,11 +3342,11 @@ topography (Fig. F1.2.18). Can you see where a mountain range is located? Where is a river located? Try changing the minimum and maximum in order to make these features more visible. Save your script. -\includegraphics{../images/F1/image61.png} +\includegraphics{images/F1/image61.png} Fig. F1.2.18. NASADEM elevation -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F12g. The book's repository contains a script that shows what your code should look like at this point. @@ -3391,7 +3391,7 @@ Earth Engine. Remote Sens 13:1--23. https://doi.org/10.3390/rs13010010 \section{The Remote Sensing Vocabulary}\label{the-remote-sensing-vocabulary}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{authors-1}{% \subsection*{Authors}\label{authors-1}} @@ -3462,7 +3462,7 @@ matches to that search term will appear. \begin{figure} -{\centering \includegraphics{../images/F1/image67.png} +{\centering \includegraphics{images/F1/image67.png} } @@ -3475,7 +3475,7 @@ window will appear (Fig. F1.3.2). \begin{figure} -{\centering \includegraphics{../images/F1/image2.png} +{\centering \includegraphics{images/F1/image2.png} } @@ -3508,7 +3508,7 @@ reference as you proceed. \begin{figure} -{\centering \includegraphics{../images/F1/image31.png} +{\centering \includegraphics{images/F1/image31.png} } @@ -3524,7 +3524,7 @@ Search results inset window (Fig. F1.3.4). \begin{figure} -{\centering \includegraphics{../images/F1/image11.png} +{\centering \includegraphics{images/F1/image11.png} } @@ -3541,7 +3541,7 @@ search bar with your phrase to bring up the results in this new window. \begin{figure} -{\centering \includegraphics{../images/F1/image44.png} +{\centering \includegraphics{images/F1/image44.png} } @@ -3606,7 +3606,7 @@ pixels are displayed on your screen when compared to the MODIS image. \begin{figure} -{\centering \includegraphics{../images/F1/image20.png} +{\centering \includegraphics{images/F1/image20.png} } @@ -3654,7 +3654,7 @@ area than the TM imagery (900 m2). \begin{figure} -{\centering \includegraphics{../images/F1/image1.png} +{\centering \includegraphics{images/F1/image1.png} } @@ -3699,7 +3699,7 @@ boundaries of the NAIP image as we did for the Sentinel-2 MSI imagery. \begin{figure} -{\centering \includegraphics{../images/F1/image32.png} +{\centering \includegraphics{images/F1/image32.png} } @@ -3716,7 +3716,7 @@ with large-sized pixels are also called ``coarse resolution,'' those with medium-sized pixels are also called ``moderate resolution,'' and those with small-sized pixels are also called ``fine resolution.'' -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F13a. The book's repository contains a script that shows what your code should look like at this point. @@ -3766,7 +3766,7 @@ LANDSAT/LT05/C02/T1/LT05\_044034\_19870628). \begin{figure} -{\centering \includegraphics{../images/F1/image3.png} +{\centering \includegraphics{images/F1/image3.png} } @@ -3832,7 +3832,7 @@ particularly in the chapters in Part F4. \begin{figure} -{\centering \includegraphics{../images/F1/image47.png} +{\centering \includegraphics{images/F1/image47.png} } @@ -3868,7 +3868,7 @@ imported. \begin{figure} -{\centering \includegraphics{../images/F1/image60.png} +{\centering \includegraphics{images/F1/image60.png} } @@ -3882,7 +3882,7 @@ just produced (Fig. F1.3.15). Both cover a period of six months, yet there are many more points through time for the Sentinel-2 satellite, reflecting the greater temporal resolution. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F13b. The book's repository contains a script that shows what your code should look like at this point. @@ -3981,7 +3981,7 @@ printed to the Console. \begin{figure} -{\centering \includegraphics{../images/F1/image50.png} +{\centering \includegraphics{images/F1/image50.png} } @@ -4046,7 +4046,7 @@ that their names only appear as ``\ldots{}''! \begin{figure} -{\centering \includegraphics{../images/F1/image23.png} +{\centering \includegraphics{images/F1/image23.png} } @@ -4062,7 +4062,7 @@ F1.3.19. \begin{figure} -{\centering \includegraphics{../images/F1/image70.png} +{\centering \includegraphics{images/F1/image70.png} } @@ -4073,7 +4073,7 @@ F1.3.19. Compare this hyperspectral instrument chart with the multispectral chart we plotted above for MODIS. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F13c. The book's repository contains a script that shows what your code should look like at this point. @@ -4126,7 +4126,7 @@ false-color image with the QA60 band to see these values. More information about how to interpret these complex values is given in Chap. F4.3, which explains the treatment of clouds. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F13d. The book's repository contains a script that shows what your code should look like at this point. @@ -4154,7 +4154,7 @@ Let's examine the metadata for the Sentinel-2 MSI. Examine the object you've created in the Console (Fig. F1.3.20). Expand the image name, then the properties object. -\includegraphics{../images/F1/image35.png} +\includegraphics{images/F1/image35.png} Fig. F1.3.20 Checking the ``CLOUDY\_PIXEL\_PERCENTAGE'' property in the metadata for Sentinel-2 @@ -4176,7 +4176,7 @@ properties using the get function, and printed to the Console. \end{Highlighting} \end{Shaded} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F13e. The book's repository contains a script that shows what your code should look like at this point. @@ -4220,7 +4220,7 @@ interpreting the results. \section{Image Manipulation: Bands, Arithmetic, Thresholds, and Masks}\label{image-manipulation-bands-arithmetic-thresholds-and-masks}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-2}{% \subsubsection*{Author}\label{author-2}} @@ -4277,7 +4277,7 @@ when we mapped color-infrared images (Fig. F2.0.1). \begin{figure} -{\centering \includegraphics{../images/F2/image39.png} +{\centering \includegraphics{images/F2/image39.png} } @@ -4300,7 +4300,7 @@ light, relative to other land covers. \begin{figure} -{\centering \includegraphics{../images/F2/image32.png} +{\centering \includegraphics{images/F2/image32.png} } @@ -4368,7 +4368,7 @@ Soon after the launch of Landsat 1 in 1972, analysts worked to devise a robust single value that would convey the health of vegetation along a scale of −1 to 1. This yielded the NDVI, using the formula: -\includegraphics{../images/F2/image1.png} (F2.0.1) +\includegraphics{images/F2/image1.png} (F2.0.1) where NIR and red refer to the brightness of each of those two bands. As seen in Chaps. F1.1 and F1.2, this brightness might be conveyed in units @@ -4419,7 +4419,7 @@ As an example, let's examine an image of San Francisco \begin{figure} -{\centering \includegraphics{../images/F2/image46.png} +{\centering \includegraphics{images/F2/image46.png} } @@ -4461,7 +4461,7 @@ values in areas of vegetation and non-vegetation if desired. \begin{figure} -{\centering \includegraphics{../images/F2/image50.png} +{\centering \includegraphics{images/F2/image50.png} } @@ -4527,7 +4527,7 @@ Moisture Index (NDMI). NDWI is formulated as follows: \begin{figure} -{\centering \includegraphics{../images/F2/image2.png} +{\centering \includegraphics{images/F2/image2.png} } @@ -4563,7 +4563,7 @@ higher water content. \begin{figure} -{\centering \includegraphics{../images/F2/image40.png} +{\centering \includegraphics{images/F2/image40.png} } @@ -4571,7 +4571,7 @@ higher water content. \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F20a. The book's repository contains a script that shows what your code should look like at this point. @@ -4631,7 +4631,7 @@ Washington, USA. Enter the code below in a new script. \begin{figure} -{\centering \includegraphics{../images/F2/image30.png} +{\centering \includegraphics{images/F2/image30.png} } @@ -4675,7 +4675,7 @@ condition is false, it receives the value 0. \begin{figure} -{\centering \includegraphics{../images/F2/image47.png} +{\centering \includegraphics{images/F2/image47.png} } @@ -4752,7 +4752,7 @@ seaNDVI.gte(-0.1).and(seaNDVI.lt(0.5)). \begin{figure} -{\centering \includegraphics{../images/F2/image37.png} +{\centering \includegraphics{images/F2/image37.png} } @@ -4782,7 +4782,7 @@ mask. \begin{figure} -{\centering \includegraphics{../images/F2/image23.png} +{\centering \includegraphics{images/F2/image23.png} } @@ -4834,7 +4834,7 @@ now has masked out all non-forested areas. \begin{figure} -{\centering \includegraphics{../images/F2/image26.png} +{\centering \includegraphics{images/F2/image26.png} } @@ -4855,7 +4855,7 @@ Map the updated mask for the layer and you can see why this is. \begin{figure} -{\centering \includegraphics{../images/F2/image33.png} +{\centering \includegraphics{images/F2/image33.png} } @@ -4900,7 +4900,7 @@ the Remapped Values should be 10, instead of 2 (Fig. F2.0.12). \begin{figure} -{\centering \includegraphics{../images/F2/image28.png} +{\centering \includegraphics{images/F2/image28.png} } @@ -4910,7 +4910,7 @@ have more layers in your Inspector.} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F20b. The book's repository contains a script that shows what your code should look like at this point. @@ -4993,7 +4993,7 @@ Amazon. Remote Sens 5:5493--5513. https://doi.org/10.3390/rs5115493 \section{Interpreting an Image: Classification}\label{interpreting-an-image-classification}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-3}{% \subsubsection*{Author}\label{author-3}} @@ -5066,7 +5066,7 @@ accounting. \begin{figure} -{\centering \includegraphics{../images/F2/image48.png} +{\centering \includegraphics{images/F2/image48.png} } @@ -5152,7 +5152,7 @@ Milan, Italy, as the center of the area for our image classification. \begin{figure} -{\centering \includegraphics{../images/F2/image44.png} +{\centering \includegraphics{images/F2/image44.png} } @@ -5185,7 +5185,7 @@ will create a point geometry which will show up as an import named \begin{figure} -{\centering \includegraphics{../images/F2/image22.png} +{\centering \includegraphics{images/F2/image22.png} } @@ -5228,7 +5228,7 @@ configuration. \begin{figure} -{\centering \includegraphics{../images/F2/image36.png} +{\centering \includegraphics{images/F2/image36.png} } @@ -5242,7 +5242,7 @@ in order to start collecting forest points. \begin{figure} -{\centering \includegraphics{../images/F2/image29.png} +{\centering \includegraphics{images/F2/image29.png} } @@ -5259,7 +5259,7 @@ per class. Click Exit next to Point drawing (Fig. F2.1.5) when finished. \begin{figure} -{\centering \includegraphics{../images/F2/image38.png} +{\centering \includegraphics{images/F2/image38.png} } @@ -5281,7 +5281,7 @@ for the other classes: \#FF0000 for developed, \#1A11FF for water, and \begin{figure} -{\centering \includegraphics{../images/F2/image41.png} +{\centering \includegraphics{images/F2/image41.png} } @@ -5294,7 +5294,7 @@ developed, water, and herbaceous (Fig. F2.1.8). \begin{figure} -{\centering \includegraphics{../images/F2/image42.png} +{\centering \includegraphics{images/F2/image42.png} } @@ -5302,7 +5302,7 @@ developed, water, and herbaceous (Fig. F2.1.8). \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F21a. The book's repository contains a script that shows what your code should look like at this point. @@ -5379,7 +5379,7 @@ You should see the band and class information (Fig. F2.1.9). \begin{figure} -{\centering \includegraphics{../images/F2/image20.png} +{\centering \includegraphics{images/F2/image20.png} } @@ -5399,7 +5399,7 @@ for decades. \begin{figure} -{\centering \includegraphics{../images/F2/image25.png} +{\centering \includegraphics{images/F2/image25.png} } @@ -5498,7 +5498,7 @@ errors: \begin{figure} -{\centering \includegraphics{../images/F2/image21.png} +{\centering \includegraphics{images/F2/image21.png} } @@ -5519,7 +5519,7 @@ insight about the training data. \begin{figure} -{\centering \includegraphics{../images/F2/image27.png} +{\centering \includegraphics{images/F2/image27.png} } @@ -5566,7 +5566,7 @@ on accuracy metrics. \begin{figure} -{\centering \includegraphics{../images/F2/image34.png} +{\centering \includegraphics{images/F2/image34.png} } @@ -5574,7 +5574,7 @@ on accuracy metrics. \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F21b. The book's repository contains a script that shows what your code should look like at this point. @@ -5658,7 +5658,7 @@ pixels change from class to class on subsequent iterations. \begin{figure} -{\centering \includegraphics{../images/F2/image35.png} +{\centering \includegraphics{images/F2/image35.png} } @@ -5701,7 +5701,7 @@ are assigned randomly. \begin{figure} -{\centering \includegraphics{../images/F2/image31.png} +{\centering \includegraphics{images/F2/image31.png} } @@ -5718,7 +5718,7 @@ classification results (see Code Checkpoint below for an example). Another key point of classification is the accuracy assessment of the results. This will be covered in Chap. F2.2. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F21c. The book's repository contains a script that shows what your code should look like at this point. @@ -5773,7 +5773,7 @@ tools and techniques. In: Data Mining. pp 4 \section{Accuracy Assessment: Quantifying Classification Quality}\label{accuracy-assessment-quantifying-classification-quality}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-4}{% \subsubsection*{Author}\label{author-4}} @@ -6028,10 +6028,10 @@ The overall accuracy tells us what proportion of the reference data was classified correctly, and is calculated as the total number of correctly identified pixels divided by the total number of pixels in the sample. -\includegraphics{../images/F2/image6.png} +\includegraphics{images/F2/image6.png} In this case, the overall accuracy is 96.8\%, calculated using -(\includegraphics{../images/F2/image7.png}. +(\includegraphics{images/F2/image7.png}. Two other important accuracy metrics are the producer's accuracy and the user's accuracy, also referred to as the ``recall'' and the @@ -6045,14 +6045,14 @@ total number of pixels actually in that class. The producer's accuracy for a given class tells us the proportion of the pixels in that class that were classified correctly. -\includegraphics{../images/F2/image8.png} +\includegraphics{images/F2/image8.png} -\includegraphics{../images/F2/image9.png} +\includegraphics{images/F2/image9.png} In this case, the producer's accuracy for the forest class is 95.6\%, -calculated using \includegraphics{../images/F2/image10.png}). The +calculated using \includegraphics{images/F2/image10.png}). The producer's accuracy for the non-forest class is 97.3\%, calculated from -\includegraphics{../images/F2/image11.png}). +\includegraphics{images/F2/image11.png}). The user's accuracy (also called the ``consumer's accuracy'') is the accuracy of the map from the point of view of a map user, and is @@ -6062,21 +6062,21 @@ user's accuracy for a given class tells us the proportion of the pixels identified on the map as being in that class that are actually in that class on the ground. -\includegraphics{../images/F2/image12.png} +\includegraphics{images/F2/image12.png} -\includegraphics{../images/F2/image13.png} +\includegraphics{images/F2/image13.png} In this case, the user's accuracy for the forest class is 94.5\%, -calculated using \includegraphics{../images/F2/image14.png}). The user's +calculated using \includegraphics{images/F2/image14.png}). The user's accuracy for the non-forest class is 97.9\%, calculated from -\includegraphics{../images/F2/image15.png}). +\includegraphics{images/F2/image15.png}). Fig. F2.2.1 helps visualize the rows and columns used to calculate each accuracy. \begin{figure} -{\centering \includegraphics{../images/F2/image43.png} +{\centering \includegraphics{images/F2/image43.png} } @@ -6094,12 +6094,12 @@ two-class system, an error of omission in one class will be counted as an error of commission in another class. Omission errors are complementary to the producer's accuracy. -\includegraphics{../images/F2/image16.png} +\includegraphics{images/F2/image16.png} Commission errors refer to the class pixels that were erroneously classified in the map and are complementary to the user's accuracy. -\includegraphics{../images/F2/image17.png} +\includegraphics{images/F2/image17.png} Finally, another commonly used accuracy metric is the kappa coefficient, which evaluates how well the classification performed as compared to @@ -6109,13 +6109,13 @@ assignment of categories would have been; a value of 0 indicates that the classification is no better or worse than random; and a positive value indicates that the classification is better than random. -\includegraphics{../images/F2/image18.png} +\includegraphics{images/F2/image18.png} The chance agreement is calculated as the sum of the product of row and column totals for each class, and the observed accuracy is the overall accuracy. Therefore, for our example, the kappa coefficient is 0.927. -\includegraphics{../images/F2/image19.png} +\includegraphics{images/F2/image19.png} Now, let's go back to the script. In Earth Engine, there are API calls for these operations. Note that our confusion matrix will be a 4 x 4 @@ -6164,7 +6164,7 @@ compared to the others? Can you think of any reasons why? (Hint: Check where the errors in these classes are in the confusion matrix---i.e., being committed and omitted.) -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F22a. The book's repository contains a script that shows what your code should look like at this point. @@ -6216,7 +6216,7 @@ F4.1.) \begin{figure} -{\centering \includegraphics{../images/F2/image45.png} +{\centering \includegraphics{images/F2/image45.png} } @@ -6225,7 +6225,7 @@ trees} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F22b. The book's repository contains a script that shows what your code should look like at this point. @@ -6244,7 +6244,7 @@ following Code Checkpoint replicates Sect. 1 but with a spatial join that excludes training points that are less than 1000 meters distant from testing points. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F22c. The book's repository contains a script that shows what your code should look like at this point. @@ -6316,7 +6316,7 @@ to understand the status of places across decades. \hypertarget{filter-map-reduce}{% \section{Filter, Map, Reduce}\label{filter-map-reduce}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-5}{% \subsubsection*{Author}\label{author-5}} @@ -6506,7 +6506,7 @@ characteristics, and return a smaller ImageCollection (Fig. F4.0.1). \begin{figure} -{\centering \includegraphics{../images/F4/image66.png} +{\centering \includegraphics{images/F4/image66.png} } @@ -6652,7 +6652,7 @@ you narrowed geographically first, it is good practice in Earth Engine to order the filters with the filterBounds first, followed by metadata filters in order of decreasing specificity. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F40a. The book's repository contains a script that shows what your code should look like at this point. @@ -6789,7 +6789,7 @@ opening and closing the list of items. When you open that tag, you will see a chart of the EVI values at that pixel, created by mapping the makeLandsat5EVI function over the filtered ImageCollection. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F40b. The book's repository contains a script that shows what your code should look like at this point. @@ -6844,11 +6844,11 @@ value of the ImageCollection in every pixel. \end{Highlighting} \end{Shaded} -\includegraphics{../images/F4/image43.png} +\includegraphics{images/F4/image43.png} \begin{figure} -{\centering \includegraphics{../images/F4/image67.png} +{\centering \includegraphics{images/F4/image67.png} } @@ -6869,7 +6869,7 @@ subsequent chapters in Part F4, you will see other kinds of reducers---for example, ones that summarize the characteristics in the neighborhood surrounding each pixel. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F40c. The book's repository contains a script that shows what your code should look like at this point. @@ -6900,7 +6900,7 @@ ability to do sophisticated projects in Earth Engine. \section{Exploring Image Collections}\label{exploring-image-collections}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-6}{% \subsubsection*{Author}\label{author-6}} @@ -7014,7 +7014,7 @@ dates. \begin{figure} -{\centering \includegraphics{../images/F4/image22.png} +{\centering \includegraphics{images/F4/image22.png} } @@ -7043,7 +7043,7 @@ tab, assuming the same pixel is clicked. \end{Highlighting} \end{Shaded} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F41a. The book's repository contains a script that shows what your code should look like at this point. @@ -7099,7 +7099,7 @@ created map data may take a few minutes to fully load in. \begin{figure} -{\centering \includegraphics{../images/F4/image27.png} +{\centering \includegraphics{images/F4/image27.png} } @@ -7133,7 +7133,7 @@ want to use a different reducer, such as a median operation, that would give different, useful answers for each band. A few of these reducers are described below. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F41b. The book's repository contains a script that shows what your code should look like at this point. @@ -7192,7 +7192,7 @@ curious about which reducers can be used to summarize band values across a collection of images, use the Docs tab in the Code Editor to list all reducers and look for those beginning with ee.Reducer. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F41c. The book's repository contains a script that shows what your code should look like at this point. @@ -7229,7 +7229,7 @@ code below into the same script. \begin{figure} -{\centering \includegraphics{../images/F4/image74.png} +{\centering \includegraphics{images/F4/image74.png} } @@ -7278,7 +7278,7 @@ atmospheric or land effects corresponding to bright reflectance values. \begin{figure} -{\centering \includegraphics{../images/F4/image55.png} +{\centering \includegraphics{images/F4/image55.png} } @@ -7294,7 +7294,7 @@ in image collections in a frequency domain. Exploring these values in different forms should be the first step of any study before developing data analysis algorithms. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F41d. The book's repository contains a script that shows what your code should look like at this point. @@ -7328,7 +7328,7 @@ Biol 14:e1002415. https://doi.org/10.1371/journal.pbio.1002415 \section{Aggregating Images for Time Series}\label{aggregating-images-for-time-series}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-7}{% \subsubsection*{Author}\label{author-7}} @@ -7448,7 +7448,7 @@ F4.2.1). \begin{figure} -{\centering \includegraphics{../images/F4/image25.png} +{\centering \includegraphics{images/F4/image25.png} } @@ -7464,7 +7464,7 @@ Let's aggregate this collection so that we have 12 images---one image per month, with pixel values that represent the total precipitation for that month. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F42a. The book's repository contains a script that shows what your code should look like at this point. @@ -7544,7 +7544,7 @@ We will use the millis function in the next section when we need to set the system:time\_start and system:time\_end properties of the aggregated images. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F42b. The book's repository contains a script that shows what your code should look like at this point. @@ -7630,7 +7630,7 @@ ImageCollection (Fig. F4.2.2). \begin{figure} -{\centering \includegraphics{../images/F4/image90.png} +{\centering \includegraphics{images/F4/image90.png} } @@ -7638,7 +7638,7 @@ ImageCollection (Fig. F4.2.2). \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F42c. The book's repository contains a script that shows what your code should look like at this point. @@ -7719,7 +7719,7 @@ monsoon season lasting from June to September. \begin{figure} -{\centering \includegraphics{../images/F4/image32.png} +{\centering \includegraphics{images/F4/image32.png} } @@ -7727,7 +7727,7 @@ monsoon season lasting from June to September. \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F42d. The book's repository contains a script that shows what your code should look like at this point. @@ -7768,7 +7768,7 @@ Remote Sensing Symposium (IGARSS). pp 3414--3416 \section{Clouds and Image Compositing}\label{clouds-and-image-compositing}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-8}{% \subsubsection*{Author}\label{author-8}} @@ -7994,7 +7994,7 @@ resulting composite to the map using visualization parameters. \begin{figure} -{\centering \includegraphics{../images/F4/image12.png} +{\centering \includegraphics{images/F4/image12.png} } @@ -8033,7 +8033,7 @@ cloud cover. \begin{figure} -{\centering \includegraphics{../images/F4/image50.png} +{\centering \includegraphics{images/F4/image50.png} } @@ -8063,7 +8063,7 @@ filter, some tiles still present a large area cover of clouds. \begin{figure} -{\centering \includegraphics{../images/F4/image42.png} +{\centering \includegraphics{images/F4/image42.png} } @@ -8112,7 +8112,7 @@ the landsat8FiltClouds variable. \begin{figure} -{\centering \includegraphics{../images/F4/image39.png} +{\centering \includegraphics{images/F4/image39.png} } @@ -8149,7 +8149,7 @@ cloud-masked composite (Fig. F4.3.5) compare to the 2019 one? \begin{figure} -{\centering \includegraphics{../images/F4/image85.png} +{\centering \includegraphics{images/F4/image85.png} } @@ -8165,7 +8165,7 @@ to better see them). Again, if the time period is not a constraint for the creation of your composite, you can incorporate more images from a third year, and so on. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F43a. The book's repository contains a script that shows what your code should look like at this point. @@ -8230,7 +8230,7 @@ to 2019-01-01 in order to create a one-year composite of 2019. \begin{figure} -{\centering \includegraphics{../images/F4/image73.png} +{\centering \includegraphics{images/F4/image73.png} } @@ -8262,7 +8262,7 @@ our composite. Now, let's combine the Landsat 7 and 8 collections. \begin{figure} -{\centering \includegraphics{../images/F4/image54.png} +{\centering \includegraphics{images/F4/image54.png} } @@ -8297,7 +8297,7 @@ to rename SR\_B6 so it does not have the same name as the new band 5. \begin{figure} -{\centering \includegraphics{../images/F4/image15.png} +{\centering \includegraphics{images/F4/image15.png} } @@ -8349,7 +8349,7 @@ see the inset example of Fig. F4.3.9. \begin{figure} -{\centering \includegraphics{../images/F4/image30.png} +{\centering \includegraphics{images/F4/image30.png} } @@ -8359,7 +8359,7 @@ composite (right) for 2019. Inset centered at latitude 3.6023, longitude \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F43b. The book's repository contains a script that shows what your code should look like at this point. @@ -8388,14 +8388,14 @@ compositing approach can be found in Griffiths et al.~(2013), and detailed information on tuning parameters can be found in White et al.~(2014). -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F43c. The book's repository contains information about accessing the GEE-BAP interface and its related functions. \end{tcolorbox} -\includegraphics{../images/F4/image70.png}\includegraphics{../images/F4/image81.png}\includegraphics{../images/F4/image83.png} +\includegraphics{images/F4/image70.png}\includegraphics{images/F4/image81.png}\includegraphics{images/F4/image83.png} Once you have loaded the GEE-BAP interface (Fig. F4.3.10) using the instructions in the Code Checkpoint, you will notice that it is divided @@ -8480,7 +8480,7 @@ well as viewed on the map. \begin{figure} -{\centering \includegraphics{../images/F4/image60.png} +{\centering \includegraphics{images/F4/image60.png} } @@ -8539,7 +8539,7 @@ into a new script. \begin{figure} -{\centering \includegraphics{../images/F4/image11.png} +{\centering \includegraphics{images/F4/image11.png} } @@ -8547,7 +8547,7 @@ into a new script. \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F43d. The book's repository contains a script that shows what your code should look like at this point. @@ -8685,7 +8685,7 @@ https://doi.org/10.1016/j.rse.2011.10.028 \hypertarget{change-detection}{% \section{Change Detection}\label{change-detection}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-9}{% \subsubsection*{Author}\label{author-9}} @@ -8759,7 +8759,7 @@ composition) of the change (MacLeod and Congalton 1998). \item \end{enumerate} -\includegraphics{../images/F4/image80.png} +\includegraphics{images/F4/image80.png} \begin{enumerate} \def\labelenumi{\alph{enumi})} @@ -8768,7 +8768,7 @@ composition) of the change (MacLeod and Congalton 1998). \item \end{enumerate} -\includegraphics{../images/F4/image21.png} +\includegraphics{images/F4/image21.png} \begin{enumerate} \def\labelenumi{\alph{enumi})} @@ -8777,7 +8777,7 @@ composition) of the change (MacLeod and Congalton 1998). \item \end{enumerate} -\includegraphics{../images/F4/image75.png} +\includegraphics{images/F4/image75.png} \begin{enumerate} \def\labelenumi{\alph{enumi})} @@ -8788,7 +8788,7 @@ composition) of the change (MacLeod and Congalton 1998). \begin{figure} -{\centering \includegraphics{../images/F4/image87.png} +{\centering \includegraphics{images/F4/image87.png} } @@ -8848,7 +8848,7 @@ changed versus stable areas (Fig. F4.4.2). \begin{figure} -{\centering \includegraphics{../images/F4/image68.png} +{\centering \includegraphics{images/F4/image68.png} } @@ -8953,7 +8953,7 @@ view the changes between your two images. \begin{figure} -{\centering \includegraphics{../images/F4/image31.png} +{\centering \includegraphics{images/F4/image31.png} } @@ -9014,7 +9014,7 @@ the built-in rename function. \end{Highlighting} \end{Shaded} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F44a. The book's repository contains a script that shows what your code should look like at this point. @@ -9074,7 +9074,7 @@ that an area gained vegetation (Fig. F4.4.4). \begin{figure} -{\centering \includegraphics{../images/F4/image4.png} +{\centering \includegraphics{images/F4/image4.png} } @@ -9158,7 +9158,7 @@ in areas that did not change as you are in areas that did. \item \end{enumerate} -\includegraphics{../images/F4/image77.png}\includegraphics{../images/F4/image77.png} +\includegraphics{images/F4/image77.png}\includegraphics{images/F4/image77.png} \begin{enumerate} \def\labelenumi{\alph{enumi})} @@ -9167,14 +9167,14 @@ in areas that did not change as you are in areas that did. \item \end{enumerate} -\includegraphics{../images/F4/image17.png}\includegraphics{../images/F4/image17.png} +\includegraphics{images/F4/image17.png}\includegraphics{images/F4/image17.png} Chapters F4.5 through F4.9 present more-advanced change detection algorithms that go beyond differencing and thresholding between two images, instead allowing you to analyze changes indicated across several images as a time series. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F44b. The book's repository contains a script that shows what your code should look like at this point. @@ -9250,7 +9250,7 @@ https://doi.org/10.1016/j.rse.2019.111558 \section{Interpreting Annual Time Series with LandTrendr}\label{interpreting-annual-time-series-with-landtrendr}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-10}{% \subsubsection*{Author}\label{author-10}} @@ -9324,7 +9324,7 @@ in some of the chapters that follow this one. For this lab, we will use a graphical user interface (GUI) to teach the concepts of LandTrendr. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F45a. The book's repository contains information about accessing the LandTrendr interface. @@ -9358,7 +9358,7 @@ like the one shown in Fig. 4.5.1. \begin{figure} -{\centering \includegraphics{../images/F4/image29.png} +{\centering \includegraphics{images/F4/image29.png} } @@ -9388,7 +9388,7 @@ and began regrowth. Your chart will probably look different. \begin{figure} -{\centering \includegraphics{../images/F4/image88.png} +{\centering \includegraphics{images/F4/image88.png} } @@ -9435,7 +9435,7 @@ recovery (though not necessarily to the same type of vegetation). \begin{figure} -{\centering \includegraphics{../images/F4/image71.png} +{\centering \includegraphics{images/F4/image71.png} } @@ -9476,7 +9476,7 @@ LandTrendr Options menu (Fig. F4.5.4). \begin{figure} -{\centering \includegraphics{../images/F4/image7.png} +{\centering \includegraphics{images/F4/image7.png} } @@ -9630,7 +9630,7 @@ the concepts. \begin{figure} -{\centering \includegraphics{../images/F4/image84.png} +{\centering \includegraphics{images/F4/image84.png} } @@ -9693,7 +9693,7 @@ Change Filter Options menu. The interface shown in Fig. 4.5.6 appears. \begin{figure} -{\centering \includegraphics{../images/F4/image49.png} +{\centering \includegraphics{images/F4/image49.png} } @@ -9737,7 +9737,7 @@ Imagery to add this to the map. You should see something like Fig. \begin{figure} -{\centering \includegraphics{../images/F4/image16.png} +{\centering \includegraphics{images/F4/image16.png} } @@ -9753,7 +9753,7 @@ endpoints of the segments (Fig. 4.5.8). \begin{figure} -{\centering \includegraphics{../images/F4/image14.png} +{\centering \includegraphics{images/F4/image14.png} } @@ -9794,7 +9794,7 @@ https://doi.org/10.3390/rs10050691 \section{Fitting Functions to Time Series}\label{fitting-functions-to-time-series}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-11}{% \subsubsection*{Author}\label{author-11}} @@ -9952,7 +9952,7 @@ in the series. \begin{figure} -{\centering \includegraphics{../images/F4/image38.png} +{\centering \includegraphics{images/F4/image38.png} } @@ -10058,7 +10058,7 @@ the location of interest (Fig. F4.6.2). \begin{figure} -{\centering \includegraphics{../images/F4/image3.png} +{\centering \includegraphics{images/F4/image3.png} } @@ -10092,7 +10092,7 @@ estimate linear trends over time. \begin{figure} -{\centering \includegraphics{../images/F4/image82.png} +{\centering \includegraphics{images/F4/image82.png} } @@ -10106,7 +10106,7 @@ analyses can be done to the time series by harnessing Earth Engine tools for fitting curves through this data. We will see a couple of examples in the following sections. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F46a. The book's repository contains a script that shows what your code should look like at this point. @@ -10179,7 +10179,7 @@ and residuals) and two-band image (coefficients ``t'' and ``constant'') \begin{figure} -{\centering \includegraphics{../images/F4/image53.png} +{\centering \includegraphics{images/F4/image53.png} } @@ -10216,7 +10216,7 @@ trendlines parameter (Fig. F4.6.5). \begin{figure} -{\centering \includegraphics{../images/F4/image20.png} +{\centering \includegraphics{images/F4/image20.png} } @@ -10224,7 +10224,7 @@ trendlines parameter (Fig. F4.6.5). \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F46b. The book's repository contains a script that shows what your code should look like at this point. @@ -10313,7 +10313,7 @@ harmonic model time series (Fig. F4.6.6). \begin{figure} -{\centering \includegraphics{../images/F4/image86.png} +{\centering \includegraphics{images/F4/image86.png} } @@ -10337,7 +10337,7 @@ perhaps would not be possible with spectral information alone. \begin{figure} -{\centering \includegraphics{../images/F4/image8.png} +{\centering \includegraphics{images/F4/image8.png} } @@ -10377,7 +10377,7 @@ coefficients and add this image to the map (Fig. F4.6.8). \begin{figure} -{\centering \includegraphics{../images/F4/image63.png} +{\centering \includegraphics{images/F4/image63.png} } @@ -10403,7 +10403,7 @@ values of a pixel, you will not get values of phase, amplitude, and NDVI, but the transformed values into values of blue, green, and red colors. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F46c. The book's repository contains a script that shows what your code should look like at this point. @@ -10445,11 +10445,11 @@ California.}\label{the-rich-data-about-the-curve-fits-can-be-viewed-in-a-multitu \end{Highlighting} \end{Shaded} -\includegraphics{../images/F4/image61.png} +\includegraphics{images/F4/image61.png} \begin{figure} -{\centering \includegraphics{../images/F4/image45.png} +{\centering \includegraphics{images/F4/image45.png} } @@ -10471,7 +10471,7 @@ in the image. Using different elements of the fit, these two views, like other combinations of the data you might imagine, can reveal the rich variability of the landscape around Modesto. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F46d. The book's repository contains a script that shows what your code should look like at this point. @@ -10489,7 +10489,7 @@ Modeling multiple waves within a given year can be done by adding more harmonic terms to Eq. F4.6.2. The code at the following checkpoint allows the fitting of any number of cycles through a given point. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F46e. The book's repository contains a script to use to begin this section. You will need to start with that script and edit the @@ -10505,13 +10505,13 @@ to a given set of data, many of the coefficients may be close to zero at higher numbers or harmonic terms. Fig. F4.6.10 shows the fit through the example point using one, two, and three harmonic curves. -\includegraphics{../images/F4/image24.png} +\includegraphics{images/F4/image24.png} -\includegraphics{../images/F4/image35.png} +\includegraphics{images/F4/image35.png} \begin{figure} -{\centering \includegraphics{../images/F4/image64.png} +{\centering \includegraphics{images/F4/image64.png} } @@ -10565,7 +10565,7 @@ https://doi.org/10.1016/j.rse.2019.02.003 \section{Interpreting Time Series with CCDC}\label{interpreting-time-series-with-ccdc}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-12}{% \subsubsection*{Author}\label{author-12}} @@ -10677,7 +10677,7 @@ created an interface-based tool (Arévalo et al.~2020) that facilitates the exploration of time series of Landsat observations and the CCDC results. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F47a. The book's repository contains information about accessing the CCDC interface. @@ -10716,7 +10716,7 @@ flooding). \begin{figure} -{\centering \includegraphics{../images/F4/image6.png} +{\centering \includegraphics{images/F4/image6.png} } @@ -10887,7 +10887,7 @@ exercise would take approximately 30 minutes on average to export, but larger tiles may take several hours to complete, depending on the number of images in the collection and the parameters used. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F47b. The book's repository contains a script that shows what your code should look like at this point. @@ -11069,11 +11069,11 @@ this code in your script: \end{Highlighting} \end{Shaded} -\includegraphics{../images/F4/image69.png} +\includegraphics{images/F4/image69.png} \begin{figure} -{\centering \includegraphics{../images/F4/image1.png} +{\centering \includegraphics{images/F4/image1.png} } @@ -11101,7 +11101,7 @@ original magnitude value, as well as the time when that break occurred. \begin{figure} -{\centering \includegraphics{../images/F4/image44.png} +{\centering \includegraphics{images/F4/image44.png} } @@ -11110,7 +11110,7 @@ the selected study period} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F47c. The book's repository contains a script that shows what your code should look like at this point. @@ -11243,7 +11243,7 @@ the code below: \begin{figure} -{\centering \includegraphics{../images/F4/image78.png} +{\centering \includegraphics{images/F4/image78.png} } @@ -11260,7 +11260,7 @@ by the CCDC algorithm for the origin (e.g., time 0), and not for the year we requested. In order to retrieve the adjusted intercept, as well as other coefficients, we will use a different approach. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F47d. The book's repository contains a script that shows what your code should look like at this point. @@ -11417,11 +11417,11 @@ values, appearing darker in the image. Agricultural areas present noisier time series that are more challenging to model, and result in higher RMSE values, appearing brighter. -\includegraphics{../images/F4/image18.png} +\includegraphics{images/F4/image18.png} \begin{figure} -{\centering \includegraphics{../images/F4/image28.png} +{\centering \includegraphics{images/F4/image28.png} } @@ -11439,7 +11439,7 @@ the advantage of always being cloud-free. \begin{figure} -{\centering \includegraphics{../images/F4/image76.png} +{\centering \includegraphics{images/F4/image76.png} } @@ -11448,7 +11448,7 @@ for the requested date} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F47e. The book's repository contains a script that shows what your code should look like at this point. @@ -11509,7 +11509,7 @@ of land cover using all available Landsat data. Remote Sens Environ \section{Data Fusion: Merging Classification Streams}\label{data-fusion-merging-classification-streams}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-13}{% \subsubsection*{Author}\label{author-13}} @@ -11709,7 +11709,7 @@ In the thumbnail sequence, the color palette shows Forest (class 1) as green, Water (class 2) as blue, and Active Agriculture (class 3) as yellow. Areas with no data in a particular Event are shown in black. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F48a. The book's repository contains a script that shows what your code should look like at this point. @@ -11729,7 +11729,7 @@ repository contains information about accessing that interface. \begin{figure} -{\centering \includegraphics{../images/F4/image5.png} +{\centering \includegraphics{images/F4/image5.png} } @@ -11856,7 +11856,7 @@ will look like Fig. 4.8.2. \begin{figure} -{\centering \includegraphics{../images/F4/image62.png} +{\centering \includegraphics{images/F4/image62.png} } @@ -11904,11 +11904,11 @@ Earth Engine's background satellite images are often updated, so you should see something like the right side of Fig. F4.8.3, though it may differ slightly. -\includegraphics{../images/F4/image57.png} +\includegraphics{images/F4/image57.png} \begin{figure} -{\centering \includegraphics{../images/F4/image65.png} +{\centering \includegraphics{images/F4/image65.png} } @@ -11973,11 +11973,11 @@ Engine will move to that location, while keeping at the specified zoom level. Let's compare the BULC result in this sector against the image from Earth Engine's satellite view that is underneath it (Fig. 4.8.4). -\includegraphics{../images/F4/image51.png} +\includegraphics{images/F4/image51.png} \begin{figure} -{\centering \includegraphics{../images/F4/image10.png} +{\centering \includegraphics{images/F4/image10.png} } @@ -12019,7 +12019,7 @@ Subsequent Event classifications as Active Agriculture creates a growing confidence that its proper label at the end of the sequence was indeed Active Agriculture. -\includegraphics{../images/F4/image23.png}\includegraphics{../images/F4/image72.png}\includegraphics{../images/F4/image58.png} +\includegraphics{images/F4/image23.png}\includegraphics{images/F4/image72.png}\includegraphics{images/F4/image58.png} Question 3. Run the code again with the same data, but adjust the three levelers, then view the results presented in the Map window and the @@ -12081,7 +12081,7 @@ second stage, the meaning of those changes and any changes to LULC classes are identified. We will explore the workings of BULC-D using its GUI. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F48c. The book's repository contains information about accessing that interface. @@ -12111,7 +12111,7 @@ that the scale bar reads ``5 km'' or finer. Then, search for the location ``-60.7624, -9.8542''. When you run BULC-D, a result like Fig. F4.8.6 is shown for the layer of probabilities. -\includegraphics{../images/F4/image48.png} +\includegraphics{images/F4/image48.png} Fig. 4.8.6 Result for BULC-D for the Roosevelt River area, depicting estimated probability of change and stability for 2021 @@ -12142,7 +12142,7 @@ expectation, they were persistently lower in the target year. This is flagged as a likely meaningful drop in the NBR by BULC-D, for consideration by the analyst. -\includegraphics{../images/F4/image79.png} +\includegraphics{images/F4/image79.png} Fig. 4.8.7 NBR history for a pixel with an apparent drop in NBR in the target year (below) as compared to the expectation years (above). Pixel @@ -12164,7 +12164,7 @@ vary across the study area? \begin{figure} -{\centering \includegraphics{../images/F4/image52.png} +{\centering \includegraphics{images/F4/image52.png} } @@ -12188,7 +12188,7 @@ occur, after which point the expectation would be recalculated. \begin{figure} -{\centering \includegraphics{../images/F4/image56.png} +{\centering \includegraphics{images/F4/image56.png} } @@ -12276,7 +12276,7 @@ receives more than 90 classifications. When BULC finishes its run, the Map panel will look like Fig. F4.8.10, BULC's estimate of the final state of the landscape at the end of the classification sequence. -\includegraphics{../images/F4/image37.png}\includegraphics{../images/F4/image41.png} +\includegraphics{images/F4/image37.png}\includegraphics{images/F4/image41.png} Let's explore the suite of information returned by BULC about this time period in Dynamic World. Enter ``Muiraquitã'' in the search bar and view @@ -12299,7 +12299,7 @@ Fig. F4.8.11. \begin{figure} -{\centering \includegraphics{../images/F4/image13.png} +{\centering \includegraphics{images/F4/image13.png} } @@ -12351,7 +12351,7 @@ This is shown in several ways in the interface. \begin{figure} -{\centering \includegraphics{../images/F4/image40.png} +{\centering \includegraphics{images/F4/image40.png} } @@ -12437,7 +12437,7 @@ regrowing? Were they degraded at some point? The mapping of uncertainty may hold promise for a better understanding of uncertainty as it is encountered in real classifications, thanks to Dynamic World. -\includegraphics{../images/F4/image47.png}\includegraphics{../images/F4/image89.png} +\includegraphics{images/F4/image47.png}\includegraphics{images/F4/image89.png} Given the tools and approaches presented in this lab, you should now be able to import your own classifications for BULC (Sects. 1--3), detect @@ -12497,7 +12497,7 @@ Journey. Anchor \section{Exploring Lagged Effects in Time Series}\label{exploring-lagged-effects-in-time-series}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-14}{% \subsubsection*{Author}\label{author-14}} @@ -12840,7 +12840,7 @@ values of the other variable, the covariance is negative. \begin{figure} -{\centering \includegraphics{../images/F4/image2.png} +{\centering \includegraphics{images/F4/image2.png} } @@ -12876,7 +12876,7 @@ correlation (Fig. F4.9.2) from the variance-covariance array. \begin{figure} -{\centering \includegraphics{../images/F4/image33.png} +{\centering \includegraphics{images/F4/image33.png} } @@ -12892,7 +12892,7 @@ course, that images list will fill up with all the images that are within lag of t. Those other images are also useful---for example, in fitting autoregressive models as described later. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F49a. The book's repository contains a script that shows what your code should look like at this point. @@ -12948,7 +12948,7 @@ whichever five days came right before the NDVI image. \begin{figure} -{\centering \includegraphics{../images/F4/image46.png} +{\centering \includegraphics{images/F4/image46.png} } @@ -12997,7 +12997,7 @@ to assess if the correlation increased or not at vegetated areas. \begin{figure} -{\centering \includegraphics{../images/F4/image34.png} +{\centering \includegraphics{images/F4/image34.png} } @@ -13010,7 +13010,7 @@ As long as there is sufficient temporal overlap between the time series, these techniques could be extended to longer lags and longer time series. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F49b. The book's repository contains a script that shows what your code should look like at this point. @@ -13127,7 +13127,7 @@ memory. \begin{figure} -{\centering \includegraphics{../images/F4/image19.png} +{\centering \includegraphics{images/F4/image19.png} } @@ -13139,7 +13139,7 @@ At this stage, note that the missing data has become a real problem. Any data point for which at least one of the previous points is masked or missing is also masked. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F49c. The book's repository contains a script that shows what your code should look like at this point. @@ -13151,7 +13151,7 @@ equation F4.9.1 (the modeled value) for the missing or masked data. Unfortunately, the code to make that happen is not straightforward. You can check a solution in the following Code Checkpoint: -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F49d. The book's repository contains a script that shows what your code should look like at this point. @@ -13202,7 +13202,7 @@ vector data, and how to combine vector and raster data for analyses. \hypertarget{exploring-vectors}{% \section{Exploring Vectors}\label{exploring-vectors}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-15}{% \subsubsection*{Author}\label{author-15}} @@ -13327,7 +13327,7 @@ point feature. Place a new point where USF is located (see Fig. F5.0.1). \begin{figure} -{\centering \includegraphics{../images/F5/image54.png} +{\centering \includegraphics{images/F5/image54.png} } @@ -13351,7 +13351,7 @@ These names are used within the script shown in Fig. F5.0.2. \begin{figure} -{\centering \includegraphics{../images/F5/image10.png} +{\centering \includegraphics{images/F5/image10.png} } @@ -13360,7 +13360,7 @@ the Imports section of the code at the top of your script} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F50a. The book's repository contains a script that shows what your code should look like at this point. @@ -13420,7 +13420,7 @@ Francisco's public-facing data repository. \begin{figure} -{\centering \includegraphics{../images/F5/image27.png} +{\centering \includegraphics{images/F5/image27.png} } @@ -13452,7 +13452,7 @@ Table Upload \textgreater{} Shape files (Fig. F5.0.4). \begin{figure} -{\centering \includegraphics{../images/F5/image52.png} +{\centering \includegraphics{images/F5/image52.png} } @@ -13471,7 +13471,7 @@ asset. \begin{figure} -{\centering \includegraphics{../images/F5/image43.png} +{\centering \includegraphics{images/F5/image43.png} } @@ -13508,7 +13508,7 @@ Note that if you have any trouble with loading the FeatureCollection using the technique above, you can follow directions in the Checkpoint script below to use an existing asset loaded for this exercise. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F50b. The book's repository contains a script that shows what your code should look like at this point. @@ -13632,7 +13632,7 @@ Both of the above sections of code provide meaningful information about each feature, but they do not tell us which block is the most green. The next section will address that question. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F50c. The book's repository contains a script that shows what your code should look like at this point. @@ -13767,7 +13767,7 @@ data. \begin{figure} -{\centering \includegraphics{../images/F5/image4.png} +{\centering \includegraphics{images/F5/image4.png} } @@ -13780,7 +13780,7 @@ After you run the task, the file will be saved to your Google Drive. You have now brought a feature into Earth Engine and also exported data from Earth Engine. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F50d. The book's repository contains a script that shows what your code should look like at this point. @@ -13828,7 +13828,7 @@ USF. \end{Highlighting} \end{Shaded} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F50e. The book's repository contains a script that shows what your code should look like at this point. @@ -13852,7 +13852,7 @@ using vector features in Earth Engine. \hypertarget{rastervector-conversions}{% \section{Raster/Vector Conversions}\label{rastervector-conversions}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-16}{% \subsubsection*{Author}\label{author-16}} @@ -14026,15 +14026,15 @@ coarse scale of 1,000 m. \end{Highlighting} \end{Shaded} -\includegraphics{../images/F5/image50.png} +\includegraphics{images/F5/image50.png} -\includegraphics{../images/F5/image33.png} +\includegraphics{images/F5/image33.png} -\includegraphics{../images/F5/image36.png} +\includegraphics{images/F5/image36.png} \begin{figure} -{\centering \includegraphics{../images/F5/image7.png} +{\centering \includegraphics{images/F5/image7.png} } @@ -14093,11 +14093,11 @@ such as connectedComponents and connectedPixelCount), you need to reproject according to the original image in order to display properly with zoom using the interactive Code Editor. -\includegraphics{../images/F5/image20.png} +\includegraphics{images/F5/image20.png} \begin{figure} -{\centering \includegraphics{../images/F5/image37.png} +{\centering \includegraphics{images/F5/image37.png} } @@ -14115,11 +14115,11 @@ when you want to use geospatial data in a tabular format in combination with other conventional datasets such as economic indicators (Fig. F5.1.3). -\includegraphics{../images/F5/image24.png} +\includegraphics{images/F5/image24.png} \begin{figure} -{\centering \includegraphics{../images/F5/image11.png} +{\centering \includegraphics{images/F5/image11.png} } @@ -14194,7 +14194,7 @@ samples for a validation effort. \begin{figure} -{\centering \includegraphics{../images/F5/image23.png} +{\centering \includegraphics{images/F5/image23.png} } @@ -14202,7 +14202,7 @@ samples for a validation effort. \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F51a. The book's repository contains a script that shows what your code should look like at this point. @@ -14286,7 +14286,7 @@ deforestation in the region (Fig. F5.1.5). \begin{figure} -{\centering \includegraphics{../images/F5/image55.png} +{\centering \includegraphics{images/F5/image55.png} } @@ -14332,11 +14332,11 @@ section. Fig. F5.1.6 shows a comparison of the raster versus vector representations of deforestation within the protected area. -\includegraphics{../images/F5/image42.png} +\includegraphics{images/F5/image42.png} \begin{figure} -{\centering \includegraphics{../images/F5/image13.png} +{\centering \includegraphics{images/F5/image13.png} } @@ -14369,7 +14369,7 @@ year (Fig. F5.1.7): \begin{figure} -{\centering \includegraphics{../images/F5/image15.png} +{\centering \includegraphics{images/F5/image15.png} } @@ -14420,7 +14420,7 @@ of interest, such as only the largest deforestation events: \end{Highlighting} \end{Shaded} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F51b. The book's repository contains a script that shows what your code should look like at this point. @@ -14508,7 +14508,7 @@ change. \end{Highlighting} \end{Shaded} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F51c. The book's repository contains a script that shows what your code should look like at this point. @@ -14604,7 +14604,7 @@ This output can be useful when performing large-scale raster operations, such as efficiently calculating deforestation rates for multiple protected areas. -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F51d. The book's repository contains a script that shows what your code should look like at this point. @@ -14661,13 +14661,13 @@ using the rasterized protected area (Fig. F5.1.8). \end{Highlighting} \end{Shaded} -\includegraphics{../images/F5/image56.png} +\includegraphics{images/F5/image56.png} -\includegraphics{../images/F5/image9.png} +\includegraphics{images/F5/image9.png} \begin{figure} -{\centering \includegraphics{../images/F5/image25.png} +{\centering \includegraphics{images/F5/image25.png} } @@ -14717,15 +14717,15 @@ estimate the deforestation by distance from the boundary (Fig. F5.1.9). \end{Highlighting} \end{Shaded} -\includegraphics{../images/F5/image22.png} +\includegraphics{images/F5/image22.png} -\includegraphics{../images/F5/image6.png} +\includegraphics{images/F5/image6.png} -\includegraphics{../images/F5/image21.png} +\includegraphics{images/F5/image21.png} \begin{figure} -{\centering \includegraphics{../images/F5/image26.png} +{\centering \includegraphics{images/F5/image26.png} } @@ -14762,7 +14762,7 @@ protected area but only outside of the boundary. \end{Highlighting} \end{Shaded} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F51e. The book's repository contains a script that shows what your code should look like at this point. @@ -14781,7 +14781,7 @@ applications and ideas for using these techniques. \hypertarget{zonal-statistics}{% \section{Zonal Statistics}\label{zonal-statistics}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-17}{% \subsubsection*{Author}\label{author-17}} @@ -15053,7 +15053,7 @@ vector dataset for future filtering and joining. \end{Highlighting} \end{Shaded} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F52a. The book's repository contains a script that shows what your code should look like at this point. @@ -15180,7 +15180,7 @@ summarized. \begin{figure} -{\centering \includegraphics{../images/F5/image29.png} +{\centering \includegraphics{images/F5/image29.png} } @@ -15191,7 +15191,7 @@ calculating the zonal statistics} \begin{figure} -{\centering \includegraphics{../images/F5/image5.png} +{\centering \includegraphics{images/F5/image5.png} } @@ -15478,7 +15478,7 @@ you don't specify your own existing folder in Drive, the folder \end{Highlighting} \end{Shaded} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F52b. The book's repository contains a script that shows what your code should look like at this point. @@ -15648,7 +15648,7 @@ more details). \begin{figure} -{\centering \includegraphics{../images/F5/image44.png} +{\centering \includegraphics{images/F5/image44.png} } @@ -15660,7 +15660,7 @@ point of three pixels.} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F52c. The book's repository contains a script that shows what your code should look like at this point. @@ -15728,7 +15728,7 @@ https://doi.org/10.1016/j.rse.2006.12.006 \hypertarget{advanced-vector-operations}{% \section{Advanced Vector Operations}\label{advanced-vector-operations}} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, bottomrule=.15mm, colframe=quarto-callout-tip-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-tip-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-tip-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-tip-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-tip-color}{\faLightbulb}\hspace{0.5em}{Chapter Information}, left=2mm, toprule=.15mm] \hypertarget{author-18}{% \subsubsection*{Author}\label{author-18}} @@ -15855,7 +15855,7 @@ color but has a 66\% opacity. \begin{figure} -{\centering \includegraphics{../images/F5/image34.png} +{\centering \includegraphics{images/F5/image34.png} } @@ -15931,7 +15931,7 @@ maximum values to be 0 and 50000, respectively. \begin{figure} -{\centering \includegraphics{../images/F5/image41.png} +{\centering \includegraphics{images/F5/image41.png} } @@ -15977,11 +15977,11 @@ a line width of 1 pixel (Fig. F5.3.3). \end{Highlighting} \end{Shaded} -\includegraphics{../images/F5/image28.png} +\includegraphics{images/F5/image28.png} \begin{figure} -{\centering \includegraphics{../images/F5/image31.png} +{\centering \includegraphics{images/F5/image31.png} } @@ -16046,7 +16046,7 @@ FeatureCollection (Fig. F5.3.4). \begin{figure} -{\centering \includegraphics{../images/F5/image46.png} +{\centering \includegraphics{images/F5/image46.png} } @@ -16055,7 +16055,7 @@ priority} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F53a. The book's repository contains a script that shows what your code should look like at this point. @@ -16162,7 +16162,7 @@ layers (Fig. F5.3.5). \begin{figure} -{\centering \includegraphics{../images/F5/image2.png} +{\centering \includegraphics{images/F5/image2.png} } @@ -16222,7 +16222,7 @@ join worked as expected (Fig. F5.3.6). \begin{figure} -{\centering \includegraphics{../images/F5/image40.png} +{\centering \includegraphics{images/F5/image40.png} } @@ -16278,7 +16278,7 @@ var sfTrees = ee.FeatureCollection( \begin{figure} -{\centering \includegraphics{../images/F5/image35.png} +{\centering \includegraphics{images/F5/image35.png} } @@ -16330,7 +16330,7 @@ collection to verify (Fig. F5.3.8). \begin{figure} -{\centering \includegraphics{../images/F5/image1.png} +{\centering \includegraphics{images/F5/image1.png} } @@ -16358,7 +16358,7 @@ function to get the count (Fig. F5.3.9). \begin{figure} -{\centering \includegraphics{../images/F5/image18.png} +{\centering \includegraphics{images/F5/image18.png} } @@ -16397,7 +16397,7 @@ numbers of trees counted using the join (Fig. F5.3.10). \begin{figure} -{\centering \includegraphics{../images/F5/image3.png} +{\centering \includegraphics{images/F5/image3.png} } @@ -16406,7 +16406,7 @@ Francisco neighborhoods} \end{figure} -\begin{tcolorbox}[enhanced jigsaw, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, bottomrule=.15mm, colframe=quarto-callout-note-color-frame, left=2mm, rightrule=.15mm, titlerule=0mm, colbacktitle=quarto-callout-note-color!10!white, bottomtitle=1mm, coltitle=black, toprule=.15mm, leftrule=.75mm, opacitybacktitle=0.6, colback=white, breakable, opacityback=0, toptitle=1mm, arc=.35mm] +\begin{tcolorbox}[enhanced jigsaw, arc=.35mm, breakable, leftrule=.75mm, toptitle=1mm, opacitybacktitle=0.6, colback=white, titlerule=0mm, coltitle=black, bottomtitle=1mm, colbacktitle=quarto-callout-note-color!10!white, opacityback=0, rightrule=.15mm, colframe=quarto-callout-note-color-frame, bottomrule=.15mm, title=\textcolor{quarto-callout-note-color}{\faInfo}\hspace{0.5em}{Note}, left=2mm, toprule=.15mm] Code Checkpoint F53b. The book's repository contains a script that shows what your code should look like at this point. @@ -16430,9 +16430,6 @@ analysis tasks. \hypertarget{war-at-night}{% \chapter{War at Night}\label{war-at-night}} -\hypertarget{data}{% -\section{Data}\label{data}} - Satellite images of Syria taken at night capture a subtle trace left by human civilization: lights. Apartment buildings, street lights, highways, power plants -- all are illuminated at night and can be seen @@ -16452,7 +16449,7 @@ images at night. A link to the GEE code for this section can be found \href{https://code.earthengine.google.com/2cf77d8cb9afd76b73100637fbffdf5d}{here}. \hypertarget{pre-processing}{% -\subsection{Pre-Processing}\label{pre-processing}} +\section{Pre-Processing}\label{pre-processing}} First, let's start by importing a few useful packages written by \href{https://twitter.com/gena_d}{Gennadii Donchyts}. We'll use @@ -16543,7 +16540,7 @@ center our AOI: \end{Highlighting} \end{Shaded} -\includegraphics{../images/iraq_check.png} +\includegraphics{images/iraq_check.png} If we decrease the opacity of the VIIRS layer, we can see the cities of Mosul, Erbil and Kirkuk shining brightly at night. We can also see a @@ -16551,7 +16548,7 @@ string of bright lights between Kirkuk and Erbil -- these are methane flares from oil wells. \hypertarget{analysis}{% -\subsection{Analysis}\label{analysis}} +\section{Analysis}\label{analysis}} Having pre-processed the VIIRS imagery, we can now define a function \texttt{gif} that will take: @@ -16647,7 +16644,7 @@ collection (\texttt{col}) and visualization parameters (\texttt{col\_vis}) variables. Now, let's look at some timelapses. \hypertarget{the-fall-of-mosul}{% -\subsubsection{The Fall of Mosul}\label{the-fall-of-mosul}} +\subsection{The Fall of Mosul}\label{the-fall-of-mosul}} The function returns a timelapse of nighttime lights over Northern Iraq: @@ -16659,7 +16656,7 @@ The function returns a timelapse of nighttime lights over Northern Iraq: \begin{figure} -{\centering \includegraphics{../images/Figure_1.gif} +{\centering \includegraphics{images/Figure_1.gif} } @@ -16681,7 +16678,7 @@ retaken by the KRG in 2017, after which it brightens once again as electricity is restored. \hypertarget{the-qayyarah-fires}{% -\subsubsection{The Qayyarah Fires}\label{the-qayyarah-fires}} +\subsection{The Qayyarah Fires}\label{the-qayyarah-fires}} Farther south, there is an interesting detail. Above the ``h'' in ``Qayyarah'', a bright set of lights emerges just before Mosul is @@ -16744,7 +16741,7 @@ mean value of the VIIRS images in each rectangle over time: \end{Highlighting} \end{Shaded} -\includegraphics{../images/qayyarah_chart.png} +\includegraphics{images/qayyarah_chart.png} We can clearly see Mosul (the red line) darkening in 2014 as the city is taken by ISIS. During this period the Qayyarah oil fields are, as we @@ -17669,7 +17666,7 @@ change. \begin{figure} -{\centering \includegraphics{../images/beirut/beirut_change_2020.jpg} +{\centering \includegraphics{images/beirut/beirut_change_2020.jpg} } @@ -17690,7 +17687,7 @@ explosion. \begin{figure} -{\centering \includegraphics{../images/beirut/beirut_change_2018.jpg} +{\centering \includegraphics{images/beirut/beirut_change_2018.jpg} } @@ -17826,7 +17823,7 @@ decreasing damage with distance: \begin{figure} -{\centering \includegraphics{../images/beirut/beirut_footprints.jpg} +{\centering \includegraphics{images/beirut/beirut_footprints.jpg} } @@ -17845,7 +17842,7 @@ outlines of the building footprints: \begin{figure} -{\centering \includegraphics{../images/beirut/beirut_footprints_port.jpg} +{\centering \includegraphics{images/beirut/beirut_footprints_port.jpg} } @@ -17860,7 +17857,7 @@ buildings: \begin{figure} -{\centering \includegraphics{../images/beirut/beirut_footprints_zoomed.jpg} +{\centering \includegraphics{images/beirut/beirut_footprints_zoomed.jpg} } @@ -17937,7 +17934,7 @@ church (highlighted in green below) and the road leading to it (highlighted in blue). The red box indicates the likely location (33.889061, 35.515909) from which the person was filming: -\includegraphics{../images/beirut/IMG_2.png} +\includegraphics{images/beirut/IMG_2.png} The video shows heavy damage being sustained by areas well outside the zones classified as damaged in the maps above (both my own and NASA's). @@ -17948,7 +17945,7 @@ images are taken from above, and are two-dimensional. Much of the damage caused by the blast, however, was directional; the pressure wave hit the sides of buildings, as shown in this diagram from a FEMA manual: -\includegraphics{../images/beirut/IMG_3.png} +\includegraphics{images/beirut/IMG_3.png} Areas close to the explosion suffered so much damage that it could be seen from above, but even if an apartment building had all of its @@ -17977,7 +17974,7 @@ Geolocated videos of the blast can be used to verify and adjust the model. Below is a side-by-side comparison of the twitter video and a 3D rendition of OSM data: -\includegraphics{../images/beirut/IMG_4.png} +\includegraphics{images/beirut/IMG_4.png} Some slight adjustments to the raw OSM data were made to achieve the image on the right. The building footprints are generally very accurate @@ -17998,7 +17995,7 @@ Another view of the explosions in Beirut pic.twitter.com/efT5VlpMkj The second pier (highlighted in green) and the angle (in blue) serve as references: -\includegraphics{../images/beirut/IMG_5.png} +\includegraphics{images/beirut/IMG_5.png} The video was taken from the rooftop of a Japanese restaurant called Clap Beirut (in red above). This is confirmed by a picture of the @@ -18006,7 +18003,7 @@ rooftop bar on google images, which matches the bar that can be seen at 0:02 in the twitter video. Below is a comparison of the video view and the 3D OSM model: -\includegraphics{../images/beirut/IMG_6.png} +\includegraphics{images/beirut/IMG_6.png} Though somewhat grainy, the basemap on the OSM rendering shows the same parking lot in the foreground, the second pier, and the same two @@ -18025,7 +18022,7 @@ surfaces that were directly exposed to the explosion by creating a lighting object at ground zero; areas that are lit up experienced unobstructed exposure to the blast: -\includegraphics{../images/beirut/GIF_1.gif} +\includegraphics{images/beirut/GIF_1.gif} Pressure waves, like sound, are capable of diffraction (bending around small obstructions). To roughly simulate this, the lighting object is @@ -18041,7 +18038,7 @@ in different areas is highlighted; red areas suffered direct exposure, blue areas suffered partially obstructed exposure, and black areas were indirectly exposed. -\includegraphics{../images/beirut/IMG_7.png} +\includegraphics{images/beirut/IMG_7.png} In the immediate vicinity of the explosion the large ``L'' shaped building (Lebanon's strategic grain reserve) is bright red, and was @@ -18071,7 +18068,7 @@ simulating an object being dropped into the water. By putting an obstruction in this plane, we can see how the wave responds to it. As an example, the grain silo has been isolated below: -\includegraphics{../images/beirut/GIF_2.gif} +\includegraphics{images/beirut/GIF_2.gif} As the blast hits the side of the silo, it is reflected. Two large waves can be seen traveling to the right: the initial blast wave, and the @@ -18083,7 +18080,7 @@ Broadening the focus and adding the rest of the OSM data back in, we can observe how the pressure wave interacted with buildings on the waterfront: -\includegraphics{../images/beirut/GIF_3.gif} +\includegraphics{images/beirut/GIF_3.gif} The warehouses on the docks were omitted to emphasize the interaction between the pressure wave and the waterfront buildings; their light @@ -18133,7 +18130,7 @@ sphere provides a visual representation of the blast's force as it expands. An RGB color scale corresponds to the blast's overpressure at three threshold values. -\includegraphics{../images/beirut/beirut.gif} +\includegraphics{images/beirut/beirut.gif} By keeping the lighting object from the viewshed analysis and placing it within the expanding sphere of the pressure wave, we combine two key @@ -18144,7 +18141,7 @@ Now, referring back to the two geolocated twitter videos from earlier, we can recreate the blast in our 3D model and get some new insights. Below is a side-by-side comparison of the first video and the 3D model: -\includegraphics{../images/beirut/GIF_5.gif} +\includegraphics{images/beirut/GIF_5.gif} Judging by the twitter video alone, it would be very hard to tell the fate of the person filming or the damage caused to the building that @@ -18158,7 +18155,7 @@ damage to the building. The second twitter video was taken slightly closer to ground zero, but the view was partially obstructed by the grain silo: -\includegraphics{../images/beirut/GIF_6.gif} +\includegraphics{images/beirut/GIF_6.gif} Though the pressure wave probably exerted more pressure compared to the first angle, the partial obstruction of the grain silo likely tempered @@ -18172,7 +18169,7 @@ As a concrete example of how this approach can be used to assess damage (or predict it, if one had the foresight), let us consider the Skyline Tower, pictured below following the explosion: -\includegraphics{../images/beirut/IMG_8.png} +\includegraphics{images/beirut/IMG_8.png} This partial side view shows two faces of the building, labeled ``A'' and ``B'' above. Side A was nearly perpendicular to the blast, and just @@ -18189,7 +18186,7 @@ have been relatively safe. The animation below shows the Skyline Tower as it is hit by the pressure wave, with sides A and B labeled: -\includegraphics{../images/beirut/GIF_7.gif} +\includegraphics{images/beirut/GIF_7.gif} The bright green color of the pressure wave indicates a strong likelihood of structural damage. Side A can be seen taking a direct hit, diff --git a/docs/.DS_Store b/docs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..10f526f8e4dd7b7acd1ba2e1d98b71aa58834ebe GIT binary patch literal 6148 zcmeHKJ8l9o5S<|?S}Dzzl)eHtuvW_nasddSC=!TbMZXp2;%L126hWJGq#$}Djh{W9 zXUnhH*%1-#&by^ZDU%pabM+2j!Q2{DI1*iZOpaKt9AWLlX_VAN=AQhkj&#r)d9}3*CCXRvr>A>JE0C0}58|L0i z0E-2HHE|3?1g1d+2351g(4Zq;GOs3%fk79|=0o#l%??HVcAQ^4U9<*rqykjnUV)cb zwpRaF@L&4>dlFYvfC~I81$5rO_Z^;;wRQ41tF;BbhFi`RZicy2FnBozdO60z%JIUJ bBCpsS`!#V4bUNZr2l8jYbfHm!zgFM|YL^v< literal 0 HcmV?d00001 diff --git a/docs/A2_Remote_Sensing.html b/docs/A2_Remote_Sensing.html index 531bc45..33d71e7 100644 --- a/docs/A2_Remote_Sensing.html +++ b/docs/A2_Remote_Sensing.html @@ -7,7 +7,7 @@ -Remote Sensing for OSINT - 2  Remote Sensing +Remote Sensing for OSINT - Remote Sensing