A common analysis using lidar data are to derive top of the canopy height values
from the lidar data. These values are often used to track changes in forest
structure over time, to calculate biomass, and even leaf area index (LAI). Let's
dive into the basics of working with raster formatted lidar data in R!
Learning Objectives
After completing this tutorial, you will be able to:
Work with digital terrain model (DTM) & digital surface model (DSM) raster files.
Carry out basic raster math using the terra package.
Create a canopy height model (CHM) raster from DTM & DSM rasters.
Understand the basics of the pit-free CHM algoirthm used to generate NEON's Ecosystem Structure data product.
Things You’ll Need To Complete This Tutorial
You will need the most current version of R and, preferably, RStudio loaded
on your computer to complete this tutorial.
As of June 2026, NEON requires an API token for data downloads, to reduce bot scraping and improve user support. Tokens can be generated in NEON data portal user accounts - log in to your account or create one, and go to the API Tokens section. For best practices in storing and using tokens, follow the instructions here.
R Script & Challenge Code: NEON data lessons often contain challenges to reinforce
skills. If available, the code for challenge solutions is found in the downloadable R
script of the entire lesson, available in the footer of each lesson page.
The National Ecological Observatory Network (NEON) provides lidar-derived data products including the 1) Digital Terrain Model and Digital Surface Model (DTM/DSM), 2) Slope and Aspect, and 3) Ecosystem Structure or Canopy Height Model (CHM). These products come in the GeoTIFF format, which is a .tif raster format that is spatially located on the earth.
In this tutorial, we create a Canopy Height Model. The Canopy Height Model (CHM), represents the heights of the trees on the ground. We can derive the CHM
by subtracting the ground elevation from the elevation of the top of the surface (or the tops of the trees).
We will use the terra R package to work with the the lidar-derived Digital
Surface Model (DSM) and the Digital Terrain Model (DTM).
# Load needed packages and set API token
library(terra)
library(neonUtilities)
token <- Sys.getenv("NEON_TOKEN")
Set the data directory where downloaded data will be saved.
data_dir="~/data/" #This will depend on your local environment
We can use the neonUtilities function byTileAOP to download a single DTM and DSM tile at SJER. Both the DTM and DSM are delivered under the Elevation - LiDAR (DP3.30024.001) data product.
You can run help(byTileAOP) to see more details on what the various inputs are. For this exercise, we'll specify the UTM Easting and Northing to be (257500, 4112500), which will download the tile with the lower left corner (257000,4112000). By default, the function will check the size total size of the download and ask you whether you wish to proceed (y/n). You can set check.size=FALSE if you want to download without a prompt. This example will not be very large (~8MB), since it is only downloading two single-band rasters (plus some associated metadata).
byTileAOP(dpID='DP3.30024.001',
site='SJER',
year='2021',
easting=257500,
northing=4112500,
check.size=TRUE, # set to FALSE if you don't want to enter y/n
savepath = data_dir,
token=token)
## Downloading 2 files
##
## Successfully downloaded 2 files to ~/data//DP3.30024.001
This file will be downloaded into a nested subdirectory under the ~/data folder, inside a folder named DP3.30024.001 (the Data Product ID). The files should show up in these locations: ~/data/DP3.30024.001/neon-aop-products/2021/FullSite/D17/2021_SJER_5/L3/DiscreteLidar/DSMGtif/NEON_D17_SJER_DP3_257000_4112000_DSM.tif and ~/data/DP3.30024.001/neon-aop-products/2021/FullSite/D17/2021_SJER_5/L3/DiscreteLidar/DTMGtif/NEON_D17_SJER_DP3_257000_4112000_DTM.tif.
Now we can read in the files. You can move the files to a different location (eg. shorten the path), but make sure to change the path that points to the file accordingly.
# Define the DSM and DTM file names, including the full path
dsm_file <- paste0(data_dir,"DP3.30024.001/neon-aop-products/2021/FullSite/D17/2021_SJER_5/L3/DiscreteLidar/DSMGtif/NEON_D17_SJER_DP3_257000_4112000_DSM.tif")
dtm_file <- paste0(data_dir,"DP3.30024.001/neon-aop-products/2021/FullSite/D17/2021_SJER_5/L3/DiscreteLidar/DTMGtif/NEON_D17_SJER_DP3_257000_4112000_DTM.tif")
First, we will read in the Digital Surface Model (DSM). The DSM represents the elevation of the top of the objects on the ground (trees, buildings, etc).
# assign raster to object
dsm <- rast(dsm_file)
# view info about the raster.
dsm
## class : SpatRaster
## size : 1000, 1000, 1 (nrow, ncol, nlyr)
## resolution : 1, 1 (x, y)
## extent : 257000, 258000, 4112000, 4113000 (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 11N (EPSG:32611)
## source : NEON_D17_SJER_DP3_257000_4112000_DSM.tif
## name : NEON_D17_SJER_DP3_257000_4112000_DSM
# plot the DSM
plot(dsm, main="Lidar Digital Surface Model \n SJER, California")
Note the resolution, extent, and coordinate reference system (CRS) of the raster.
To do later steps, our DTM will need to be the same.
Next, we will import the Digital Terrain Model (DTM) for the same area. The
DTM
represents the ground (terrain) elevation.
# import the digital terrain model
dtm <- rast(dtm_file)
plot(dtm, main="Lidar Digital Terrain Model \n SJER, California")
With both of these rasters now loaded, we can create the Canopy Height Model
(CHM). The CHM
represents the difference between the DSM and the DTM or the height of all objects
on the surface of the earth.
To do this we perform some basic raster math to calculate the CHM. You can
perform the same raster math in a GIS program like
QGIS.
When you do the math, make sure to subtract the DTM from the DSM or you'll get
trees with negative heights!
# use raster math to create CHM
chm <- dsm - dtm
# view CHM attributes
chm
## class : SpatRaster
## size : 1000, 1000, 1 (nrow, ncol, nlyr)
## resolution : 1, 1 (x, y)
## extent : 257000, 258000, 4112000, 4113000 (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 11N (EPSG:32611)
## source(s) : memory
## varname : NEON_D17_SJER_DP3_257000_4112000_DSM
## name : NEON_D17_SJER_DP3_257000_4112000_DSM
## min value : 0
## max value : 24.130005
plot(chm, main="Lidar CHM - SJER, California")
We've now created a CHM from our DSM and DTM. What do you notice about the
canopy cover at this location in the San Joaquin Experimental Range?
Pit-Free Canopy Height Model
Note that NEON's Ecosystem Structure (or CHM) data product is not a simple difference between the DSM and DTM. Directly subtracting the DTM from the DSM to determine a CHM can introduce artifacts into the CHM known as data pits. Data pits manifest as abnormally low elevation pixels within a tree crown and underestimate the true canopy height, and are a commonly observed problem in CHMs derived from LiDAR. To address this issue, NEON uses a "pit-free" CHM algorithm, following the method of Khosravipour et al. (2014). To read more about how the NEON CHM is derived, please reference the Ecosystem Structure ATBD.
Challenge: Basic Raster Math
Convert the CHM from meters to feet and plot it.
We can write out the CHM as a GeoTiff using the writeRaster() function.
# write out the CHM in tiff format.
writeRaster(chm,paste0(wd,"CHM_SJER.tif"),"GTiff")
We've now successfully created a canopy height model using basic raster math -- in
R! We can bring the CHM_SJER.tif file into QGIS (or any GIS program) and look
at it.
Khosravipour, A., Skidmore, A. K., Isenburg, M., Wang, T., & Hussin, Y. A. (2014). Generating pit-free canopy height models from airborne lidar. Photogrammetric Engineering & Remote Sensing, 80(9), 863–872.
Once you have Git and Bash installed, you are ready to configure Git.
On this page you will:
Create a directory for all future GitHub repositories created on your computer
To ensure Git is properly installed and to create a working directory for GitHub,
you will need to know a bit of shell -- brief crash course below.
Crash Course on Shell
The Unix shell has been around longer than most of its users have been alive.
It has survived so long because it’s a power tool that allows people to do
complex things with just a few keystrokes. More importantly, it helps them
combine existing programs in new ways and automate repetitive tasks so they
aren’t typing the same things over and over again. Use of the shell is
fundamental to using a wide range of other powerful tools and computing
resources (including “high-performance computing” supercomputers).
Set up the directory where we will store all of the GitHub repositories
during the Institute,
Make sure Git is installed correctly, and
Gain comfort using bash so that we can use it to work with Git & GitHub.
Accessing Shell
How one accesses the shell depends on the operating system being used.
OS X: The bash program is called Terminal. You can search for it in Spotlight.
Windows: Git Bash came with your download of Git for Windows. Search Git Bash.
Linux: Default is usually bash, if not, type bash in the terminal.
Bash Commands
$
The dollar sign is a prompt, which shows us that the shell is waiting for
input; your shell may use a different character as a prompt and may add
information before the prompt.
When typing commands, either from these tutorials or from other sources, do not
type the prompt ($), only the commands that follow it.
In these tutorials, subsequent lines that follow a prompt and do not start with
$ are the output of the command.
listing contents - ls
Next, let's find out where we are by running a command called pwd -- print
working directory. At any moment, our current working directory is our
current default directory. I.e., the directory that the computer assumes we
want to run commands in unless we explicitly specify something else. Here, the
computer's response is /Users/neon, which is NEON’s home directory:
$ pwd
/Users/neon
**Data Tip:** Home Directory Variation - The home
directory path will look different on different operating systems. On Linux it
may look like `/home/neon`, and on Windows it will be similar to
`C:\Documents and Settings\neon` or `C:\Users\neon`.
(It may look slightly different for different versions of Windows.)
In future examples, we've used Mac output as the default, Linux and Windows
output may differ slightly, but should be generally similar.
If you are not, by default, in your home directory, you get there by typing:
$ cd ~
Now let's learn the command that will let us see the contents of our own
file system. We can see what's in our home directory by running ls --listing.
$ ls
Applications Documents Library Music Public
Desktop Downloads Movies Pictures
(Again, your results may be slightly different depending on your operating
system and how you have customized your filesystem.)
ls prints the names of the files and directories in the current directory in
alphabetical order, arranged neatly into columns.
**Data Tip:** What is a directory? That is a folder! Read the section on
Directory vs. Folder
if you find the wording confusing.
Change directory -- cd
Now we want to move into our Documents directory where we will create a
directory to host our GitHub repository (to be created in Week 2). The command
to change locations is cd followed by a directory name if it is a
sub-directory in our current working directory or a file path if not.
cd stands for "change directory", which is a bit misleading: the command
doesn't change the directory, it changes the shell's idea of what directory we
are in.
To move to the Documents directory, we can use the following series of commands
to get there:
$ cd Documents
These commands will move us from our home directory into our Documents
directory. cd doesn't print anything, but if we run pwd after it, we can
see that we are now in /Users/neon/Documents.
If we run ls now, it lists the contents of /Users/neon/Documents, because
that's where we now are:
$ pwd
/Users/neon/Documents
$ ls
data/ elements/ animals.txt planets.txt sunspot.txt
Now we can create a new directory called GitHub that will contain our GitHub
repositories when we create them later.
We can use the command mkdir NAME-- “make directory”
$ mkdir GitHub
There is not output.
Since GitHub is a relative path (i.e., doesn't have a leading slash), the
new directory is created in the current working directory:
$ ls
data/ elements/ GitHub/ animals.txt planets.txt sunspot.txt
**Data Tip:** This material is a much abbreviated form of the
Software Carpentry Unix Shell for Novices
workhop. Want a better understanding of shell? Check out the full series!
Is Git Installed Correctly?
All of the above commands are bash commands, not Git specific commands. We
still need to check to make sure git installed correctly. One of the easiest
ways is to check to see which version of git we have installed.
Git commands start with git.
We can use git --version to see which version of Git is installed
$ git --version
git version 2.5.4 (Apple Git-61)
If you get a git version number, then Git is installed!
If you get an error, Git isn’t installed correctly. Reinstall and repeat.
Setup Git Global Configurations
Now that we know Git is correctly installed, we can get it set up to work with.
When we use Git on a new computer for the first time, we need to configure a
few things. Below are a few examples of configurations we will set as we get
started with Git:
our name and email address,
to colorize our output,
what our preferred text editor is,
and that we want to use these settings globally (i.e. for every project)
On a command line, Git commands are written as git verb, where verb is what
we actually want to do.
Set up you own git with the following command, using your own information instead
of NEON's.
The four commands we just ran above only need to be run once:
the flag --global tells Git to use the settings for every project in your user
account on this computer.
You can check your settings at any time:
$ git config --list
You can change your configuration as many times as you want; just use the
same commands to choose another editor or update your email address.
Now that Git is set up, you will be ready to start the Week 2 materials to learn
about version control and how Git & GitHub work.
**Data Tip:**
GitDesktop
is a GUI (one of many) for
using GitHub that is free and available for both Mac and Windows operating
systems. In NEON Data Skills workshops & Data Institutes will only teach how to
use Git through command line, and not support use of GitDesktop
(or any other GUI), however, you are welcome to check it out and use it if you
would like to.
Run the installer and follow the steps below (these may look slightly different depending on Git version number):
Welcome to the Git Setup Wizard: Click on "Next".
Information: Click on "Next".
Select Destination Location: Click on "Next".
Select Components: Click on "Next".
Select Start Menu Folder: Click on "Next".
Adjusting your PATH environment:
Select "Use Git from the Windows Command Prompt" and click on "Next".
If you forgot to do this programs that you need for the event will not work properly.
If this happens rerun the installer and select the appropriate option.
Configuring the line ending conversions: Click on "Next".
Keep "Checkout Windows-style, commit Unix-style line endings" selected.
Configuring the terminal emulator to use with Git Bash:
Select "Use Windows' default console window" and click on "Next".
Configuring experimental performance tweaks: Click on "Next".
Completing the Git Setup Wizard: Click on "Finish".
This will provide you with both Git and Bash in the Git Bash program.
Install Bash for Mac OS X
The default shell in all versions of Mac OS X is bash, so no
need to install anything. You access bash from the Terminal
(found in
/Applications/Utilities). You may want to keep
Terminal in your dock for this workshop.
Install Bash for Linux
The default shell is usually Bash, but if your
machine is set up differently you can run it by opening a
terminal and typing bash. There is no need to
install anything.
Git Setup
Git is a version control system that lets you track who made changes to what
when and has options for easily updating a shared or public version of your code
on GitHub. You will need a
supported
web browser (current versions of Chrome, Firefox or Safari, or Internet Explorer
version 9 or above).
Git installation instructions borrowed and modified from
Software Carpentry.
Git for Windows
Git should be installed on your computer as part of your Bash install.
Install Git on Macs by downloading and running the most recent installer for
"mavericks" if you are using OS X 10.9 and higher -or- if using an
earlier OS X, choose the most recent "snow leopard" installer, from
this list.
After installing Git, there will not be anything in your
/Applications folder, as Git is a command line program.
**Data Tip:**
If you are running Mac OSX El Capitan, you might encounter errors when trying to
use git. Make sure you update XCODE.
Read more - a Stack Overflow Issue.
Git on Linux
If Git is not already available on your machine you can try to
install it via your distro's package manager. For Debian/Ubuntu run
sudo apt-get install git and for Fedora run
sudo yum install git.
Setting Up R & RStudio
Windows R/RStudio Setup
Please visit the CRAN Website to download the latest version of R for windows.
Download the latest version of Rstudio for Windows
Double click the file to install it
Once R and RStudio are installed, click to open RStudio. If you don't get any error messages you are set. If there is an error message, you will need to re-install the program.
Once it's downloaded, double click the file to install it
Once R and RStudio are installed, click to open RStudio. If you don't get any error messages you are set. If there is an error message, you will need to re-install the program.
Linux R/RStudio Setup
R is available through most Linux package managers.
You can download the binary files for your distribution
from CRAN. Or
you can use your package manager (e.g. for Debian/Ubuntu
run sudo apt-get install r-base and for Fedora run
sudo yum install R).
Under Installers select the version for your distribution.
Once it's downloaded, double click the file to install it
Once R and RStudio are installed, click to open RStudio. If you don't get any error messages you are set. If there is an error message, you will need to re-install the program.
Once R and RStudio are installed (in
Install Git, Bash Shell, R & RStudio
), open RStudio to make sure it works and you don’t get any error messages. Then,
install the needed R packages.
Install/Update R Packages
Please make sure all of these packages are installed and up to date on your
computer prior to the Institute.
The rhdf5 package is not on CRAN and must be downloaded directly from
Bioconductor. The can be done using these two commands directly in your R
console.
The free HDFView application allows you to explore the contents of an HDF5 file. Starting in 2026, you are required to create an account and log in to The HDF Group in order to download the HDFView software.
Create an account if you don't already have one (shown in the upper right corner), and log in to your account.
Once you are logged in, from the section titled Pre-Built Binary Distributions, select the HDFView download option that matches your operating system (Darwin for Mac, Windows, or Linux) and
computer setup (32 bit vs 64 bit) that you have. The download will start automatically.
Open the downloaded file.
Mac - You may want to add the HDFView application to your Applications directory.
Windows - Unzip the file, open the folder, run the .exe file, and follow directions to complete installation.
Open HDFView to ensure that the program installed correctly.
**Data Tip:**
The HDFView application requires Java to be up to date. If you are having issues opening HDFView, try to update Java first!
Install QGIS
QGIS is a free, open-source GIS program similar to ArcGIS. It is a handy software tool for visualizing raster data and carrying out other raster and geospatial data analysis.
To install QGIS:
Download the QGIS installer on the
QGIS download page. Follow the installation directions below for your operating system.
Select the appropriate QGIS Standalone Installer Version for your computer (Windows Desktop OS or the Long Term Release (LTR) for Mac).
The download will automatically start.
Open the .exe file and follow prompts to install (installation may take a while).
Open QGIS to ensure that it is properly downloaded and installed.
**Data Tip:** If your computer doesn't allow you to open these packages because they are from an unknown developer, right click on
the package and select Open With >Installer (default). You will then be asked if you want to open the package. Select Open, and the installer will open.
Once all of the packages are installed, open QGIS to ensure that it is properly installed.
Note: if you have previous versions of QGIS installed on your system, you may run into problems.
Check out this page from QGIS: QGIS Installation Guide for additional information.
In this lesson, we provide an overview of the National Ecological Observatory Network (NEON).
Read through these materials and links that discuss NEON’s mission and design in order to gain a better understanding of NEON, NEON's mission and the openly available datasets.
This lesson was originally designed for NEON's Remote Sensing Data Institute, but can be used more broadly for those interested in gaining general knowledge about the NEON program and NEON data.
Learning Objectives
At the end of this activity, you will be able to:
Explain the mission of the National Ecological Observatory Network (NEON).
Explain how sites are located within the NEON project design.
Explain the different types of data that are collected and provided by NEON.
NEON's Mission & Design
To capture ecological heterogeneity across the United States, NEON’s design
divides the continent into 20 statistically different eco-climatic domains. Each
NEON field site is located within an eco-climatic domain.
The Science and Design of NEON
To gain a better understanding of the broad scope of NEON, watch this 4 minute long video.
Explore the NEON field site map. Do the following:
Zoom in on a study area of interest to see if there are any NEON field sites that are nearby.
Use the menu below the map to filter sites by name, type, domain, or state.
Select one field site of interest.
Click on the marker in the map.
Then click on Site Details to jump to the field site landing page.
Data Institute Participant -- Thought Questions:
Use the map above to answer these questions. Consider the research question that
you may explore as your Capstone Project at the Institute or about a current
project that you are working on and answer the following questions:
Are there NEON field sites that are in study regions of interest to you?
What domains are the sites located in?
What NEON field sites do your current research or Capstone Project ideas coincide with?
Is/are the site(s) of interest core or gradient?
Are the sites terrestrial or aquatic?
Are there data available for the NEON field site(s) that you are most interested in? What kind of data are available at those sites?
Watch this 3:06 minute video exploring the data that NEON collects.
Read the
Data Collection Methods
page to learn more about the different types of data that NEON collects and
provides. Then, follow the links below to learn more about each collection method:
NEON also collects samples and specimens from which the other data products are based. These samples are also available for research and education purposes. Learn more:
NEON Biorepository.
Airborne Remote Sensing
Watch this 5 minute video to better understand the NEON Airborne Observation Platform (AOP).
Data Institute Participant – Thought Questions:
Consider either your current or future research or the question you’d like to address at the Institute, or for your research.
Which types of NEON data would be more useful to address these questions?
What non-NEON data resources could be combined with NEON data to help address your question?
What challenges, if any, could you foresee when beginning to work with these data?
Data Tip: NEON also provides research support services to supplement your own research, including proposals to fly the AOP over other study sites, a mobile
tower/instrumentation setup and others. Learn more here about the NEON Research Support Services (RSS).
Access NEON Data
NEON data are processed and go through quality assurance quality control checks at NEON headquarters in Boulder, CO.
NEON carefully documents every aspect of sampling design, data collection, processing and delivery. This documentation is freely available through the NEON data portal.
Explore NEON Data Products.
On the page for each data product in the catalog you can find basic information about the product, a quick start guide and the data collection and processing protocols, and you can download data products for given sites and date ranges.
Additionally, some types of NEON data are also available through the data portals of other organizations. For example,
NEON Terrestrial Insect DNA Barcoding Data
is available through the
Barcode of Life Datasystem (BOLD).
Or NEON phenocam images are available from the
Phenocam network site.
More details on other places the data are available from can be found in the Availability and Download section on the Product Details page for each data product (visit
Explore Data Products to access individual Product Details pages).
Pathways to access NEON Data
There are several ways to access data from NEON:
Via the NEON data portal. Explore and download data. Note that much of the tabular data is available in zipped
.csv files for each month and site of interest. To combine these files, use the R
neonUtilities package or Python neonutilities package. See the Download Explore NEON Data tutorial for an overview of how to use the neonUtilities packages to download and work with NEON data.
Use R or Python to programmatically access the data. NEON and community members have created code packages to directly access the data through an API. Learn more
about the available resources by reading the Code Hub or visiting the NEONScience GitHub repository.
Using the NEON API. Access NEON data directly using a custom API call.
Access NEON data through partner's portals. Where NEON data directly overlap with other community resources, NEON data can be accessed through the portals.
Examples include Phenocam, BOLD, Ameriflux, Google Earth Engine and others. You can learn more in the documentation for individual data products.
Data Institute Participant – Thought Questions:
Use the Data Portal tools to investigate the data availability for the field sites you’ve already identified in the previous Thought Questions.
What types of aquatic/terrestrial data are currently available? Remote sensing data?
Of these, what type of data are you most interested in working with for your project while at the Institute.
What time period does the data cover?
What format is the downloadable file available in?
Where is the metadata to support this data?
Data Institute Participants: Intro to NEON Culmination Activity
Write up a brief summary of a project that you might want to explore while at the
Data Institute in Boulder, CO. Include the types of NEON (and other data) that you
will need to implement this project. Save this summary as you will be refining
and adding to your ideas over the next few weeks.
The goal of this activity is for you to begin to think about a Capstone Project
that you wish to work on at the end of the Data Institute. This project will ideally be
performed in groups, so over the next few weeks you'll have a chance to view the other
project proposals and merge projects to collaborate with your colleagues.
"Reproducibility is a key tenet of the scientific process that dictates the
reliability and generality of results and methods."
From Powers, S. M., and S. E. Hampton (2019),
Open science, reproducibility, and transparency in ecology (Abstract)
This lesson introduces the core principles of reproducible science in ecology and provides practical ways to apply them in your own research workflows.
In ecological science, reproducibility is especially important because observations are often context-dependent in space and time, so transparent and computationally reproducible workflows are critical for credible science, management, and policy decisions.
NEON data are especially well suited for reproducible ecological workflows because they are collected using standardized protocols across sites and time, include rich metadata and documentation, and are delivered in formats that make analyses easier to trace, rerun, and compare.
Learning Objectives
At the end of this activity, you will be able to:
Summarize the four facets of reproducibility.
Describe several ways that reproducible workflows can improve your workflow and research.
Explain several ways you can incorporate reproducible science techniques into
your own research.
Reproducible methods make science more efficient, more collaborative, and more
trustworthy across the full lifecycle of a project. Some benefits to reproducibility include:
More efficient, less redundant.
Allows for continuity in your own work over time.
Facilitates collaboration, review, and re-use by others.
Provides stronger transparency and trust in results.
What research products should be shareable?
To support reproducibility, key research products should be publicly available in
forms that others can find and understand:
Data
Code
Documentation about methods and workflow
Who needs to understand your workflow?
Collaborators
Peer reviewers and journal editors
The broader scientific community
The public
The Four Facets of Reproducibility
Reproducibility is often discussed as one idea, but in practice it has several
connected facets. Improving all four helps make your work more robust and more
useful to others.
Organization: use clear file structures, informative file names, and
explicit separation of raw, intermediate, and final outputs.
Automation: prefer scripts over point-and-click steps so analyses can be
rerun, modified, and reviewed efficiently.
Documentation: record decisions, code purpose, inputs/outputs, and
workflow steps so others (and your future self) can understand the work.
Dissemination: share data, code, and workflows in accessible repositories
and formats so others can find, evaluate, and build on your results.
In practice: You can be strong in one facet and weak in another, so reproducibility is usually a work in progress rather than an all-or-nothing goal. For example, sharing code without data provenance may limit reproducibility even when the analysis itself is well documented.
How Reproducible Workflows Improve Research
Reproducible workflows provide benefits both during a project and after
publication.
Fewer errors and faster debugging: scripted workflows make mistakes easier
to detect and fix.
Easier collaboration: shared conventions (file naming, documentation,
version control) reduce friction across teams.
More efficient updates: when data are revised, automated workflows can
rebuild results quickly.
Greater trust and re-use: transparent methods improve confidence and make
it easier for others to build on your work.
Stronger scientific impact: reproducible outputs are more likely to be
re-analyzed, cited, and used for synthesis.
Incorporating Reproducible Science Into Your Workflow
You do not need to adopt everything at once. Start with small, high-impact
changes and build over time.
Quick Wins (start this week)
Use descriptive file names and a consistent folder structure.
Keep raw data read-only; write processed outputs to separate directories.
Record software versions and package dependencies.
Add a project README with goals, inputs, and run instructions.
Next Steps (this month)
Move repeated analyses from point-and-click tools into scripts.
Use version control (for example, Git) for code and documentation.
Add lightweight quality checks for expected rows, columns, units, and ranges.
Archive analysis-ready data and scripts with a persistent identifier (DOI).
Advanced Practices (ongoing)
Build end-to-end pipelines that regenerate figures and tables.
Use computational environments (for example, containers) to
improve run-to-run consistency.
Add executable reports/notebooks that pair narrative, code, and outputs.
Include clear licensing, citation, and contribution guidance for re-use.
Practical Challenges and Tradeoffs
Adopting reproducible methods often requires more setup time at the beginning.
However, this up-front investment usually saves time later by making analyses easier to update, repeat, and explain. Moving towards reproducibility can be approached with a "good-better-best" framework. See the figure below to assess where your work lies on the reproducability spectrum.
Reproducibility spectrum for published research.
Source: Peng, RD Reproducible Research in Computational Science (2011): 1226–1227 via Reproducible Science Curriculum
Thought Questions: Have a look at the reproducible science check list linked above and answer the following questions:
Do you currently apply any of the items in the checklist to your research?
Are there elements in the list that you are interested in incorporating into your
workflow? If so, which ones?
Self-Check Quiz
Use this quick quiz to check your understanding of the learning objectives.
Which list matches the four facets from the NEON reproducible science slides?
A. Computation, Statistics, Visualization, Reporting
B. Organization, Automation, Documentation, Dissemination
C. Planning, Coding, Publishing, Archiving
D. Collection, Cleaning, Modeling, Interpretation
Which practice is most aligned with the Organization facet?
A. Using informative file names and a clear directory structure
B. Writing results directly over raw input data
C. Keeping steps undocumented but fast
D. Sharing only a figure in a slide deck
Why is scripting preferred over manual steps for many analyses?
A. It always requires less up-front time
B. It makes methods harder for collaborators to inspect
C. It supports efficient reruns and updates over time
D. It removes the need for version control
Which audiences may need access to your research workflow?
A. Principal investigators
B. Peer reviewers
C. Collaborators, peer reviewers/editors, the scientific community, and the public
D. Data managers
Which option best reflects the Dissemination facet?
A. Publishing ends the workflow; no further sharing is needed
B. Share data snapshots and workflows in accessible platforms (for example,
repositories and notebook-sharing tools)
C. Keep data private unless requested by email
D. Share code only if journal reviewers ask for it
Quiz Key
B
A
C
C
B
Reflection Prompts
Use these prompts for discussion, journaling, or a short assignment.
Which of the four facets is currently strongest in your workflow? Which is
weakest?
Identify one analysis step in your current project that is hard to rerun. What
single change would make it easier to reproduce?
If a collaborator joined your project tomorrow, what three artifacts (files,
notes, metadata, or scripts) would help them reproduce your results fastest?
What is one reproducibility practice you can adopt this week and one you can
adopt this month?
How might improved transparency change trust in your results for a policy,
management, or stakeholder audience?
After completing this tutorial, you will be able to:
Define hyperspectral remote sensing.
Explain the fundamental principles of hyperspectral remote sensing data.
Describe the key attributes that are required to effectively work with
hyperspectral remote sensing data in tools like R, Python, or Google Earth Engine (GEE).
Describe what a "band" is.
Define "spectral resolution" and "full width half max (FWHM)".
Mapping the Invisible
About Hyperspectral Remote Sensing Data
The electromagnetic spectrum is composed of thousands of bands representing
different types of light energy. Imaging spectrometers (instruments that collect hyperspectral data) break the electromagnetic spectrum into groups of bands that support classification of objects by their spectral properties on the earth's surface. Hyperspectral data consists of many bands -- up to hundreds of bands -- that cover a portion of the electromagnetic spectrum.
The NEON imaging spectrometer collects data within the 380nm to 2510nm portions of the electromagnetic spectrum within bands that are approximately 5nm in width. This results in a hyperspectral data cube that contains approximately 426 bands - which means big, big data.
Key Metadata for Hyperspectral Data
Bands and Wavelengths
A band represents a group of wavelengths. For example, the wavelength values
between 695nm and 700nm might be one band as captured by an imaging spectrometer. The imaging spectrometer collects reflected light energy in a pixel for light in that band. Often when you work with a multi or hyperspectral dataset, the band information is reported as the center wavelength value. This value represents the center point value of the wavelengths represented in that band. Thus in a band spanning 695-700 nm, the center would be 697.5).
Imaging spectrometers collect reflected light information within defined bands or regions of the electromagnetic spectrum. Source: National Ecological Observatory Network (NEON)
Spectral Resolution
The spectral resolution of a dataset that has more than one band, refers to the width of each band in the dataset. In the example above, a band was defined as spanning 695-700nm. The width or spatial resolution of the band is thus 5 nanometers. To see an example of this, check out the band widths for the
Landsat sensors.
Full Width Half Max (FWHM)
The full width half max (FWHM) will also often be reported in a multi or
hyperspectral dataset. This value represents the spread of the band around that center point.
The Full Width Half Max (FWHM) of a band relates to the distance
in nanometers between the band center and the edge of the band. In this
case, the FWHM for Band C is 5 nm.
In the illustration above, the band that covers 695-700nm has a FWHM of 5 nm.
While a general spectral resolution of the sensor is often provided, not all sensors create bands of uniform widths. For instance bands 1-9 of Landsat 8 are listed below (Courtesy of USGS)