Chapter 4 Ecosites
4.1 What ecosites are active in an MLRA?
Load the Standard Dataset and packages.
Then, we simply need to call the ecosite IDs or ecosite names, depending on your preference. Remember, remove head()
to see the full list.
## [1] "F018XI207CA" NA "R018XI101CA" "R018XI101CA" "R018XI101CA"
## [6] "F018XI201CA"
## [1] "Deep Volcanic Plateaus and Hills" NA
## [3] "Shallow Latite Ridgetops" "Shallow Latite Ridgetops"
## [5] "Shallow Latite Ridgetops" "Moderately Deep Thermic Foothills"
There are likely NAs (missing values) in the above list. This is because the above considers components are are minor and miscellaneous. We do not correlate ecosites to components that are minor and miscellaneous. It will likely be more useful to remove minor and miscellaneous componets:
my.components.MLRA.reduced <- my.components.MLRA %>% aqp::site() %>%
filter(compkind != "miscellaneous area" & majcompflag == "1")
head(my.components.MLRA.reduced$ecosite_id)
## [1] "R018XI101CA" "R018XI101CA" "F018XI201CA" "F018XI201CA" "R018XI102CA"
## [6] "R018XI102CA"
## [1] "Shallow Latite Ridgetops"
## [2] "Shallow Latite Ridgetops"
## [3] "Moderately Deep Thermic Foothills"
## [4] "Moderately Deep Thermic Foothills"
## [5] "Thermic Ultramafic Foothills Extremely High Magnesium Content (Ca:Mg Ratio Less Than 0.5)"
## [6] "Thermic Ultramafic Foothills Extremely High Magnesium Content (Ca:Mg Ratio Less Than 0.5)"
We might also be interested to see how often different ecosites are used:
table(my.components.MLRA.reduced$ecosite_id) %>% as.data.frame() %>%
dplyr::rename(Ecosite = Var1) %>% arrange(desc(Freq)) %>% head()
## Ecosite Freq
## 1 F022AI201CA 23
## 2 F018XI201CA 22
## 3 F018XI200CA 21
## 4 F022AI202CA 19
## 5 F018XI202CA 17
## 6 F022AG202CA 14
Interesting… the most used ecosites in MLRA18 are ecosite concepts from MLRAs 22a and 17.
4.2 Range in characteristics of ecosites
I created a report that summarizes the characteristics of ecosites. It is organized based on the information that is supposed to be populated in EDIT. Here is a link to a sample report. I have established a methodology allowing you to create reports like the one linked for all of the ecosites in your MLRA within a few short steps. You can also produce the report for just one of your ecosites. For documentation on this methodology, click here. Click on the green ‘Code’ button and choose ‘Download ZIP’. Once you have downloaded to the location of your preference, you can right click > Extract all. You can then open the read_me.docx file. Additionally, you can watch the following YouTube video:
4.3 Mapping ecological sites
For this methodology, the ecological site is mapped in all map units containing a component correlated to the ecological site. The alternative would be to map the ecological site only in map units where the dominant component is correlated to the ecological site of interest. I am more interest in the full extent of the ecological site, so I am using the less restrictive of the two.
Load the Standard Dataset and packages.
Load a shapefile of your map unit boundaries (the MLRA boundaries cover the whole country, but you will have to change the map unit boundaries to your local map unit shapefile)
mapunit_boundaries <- sf::read_sf("C:/Users/Nathan.Roe/Documents/PES/gSSURGO_CA_2022.gdb",
"mupolygon")
mlra_boundaries <-
sf::read_sf("C:/Users/Nathan.Roe/Documents/PES/MLRA_52_2022/MLRA_52_2022/MLRA_52.shp")
What is your ecological site of interest? (change appropriate to your project)
What is your MLRA of interest? (change appropriate to your project)
Reduce component data to those associated with ecosite of interest
my.components.MLRA.reduced <- aqp::site(my.components.MLRA) %>%
filter(ecosite_id == ecosite_of_interest)
Reduce mapunits to those associated with ecosite of interest
mapunit_boundaries_of_interest <- mapunit_boundaries %>%
dplyr::filter(MUKEY %in% my.components.MLRA.reduced$muiid) %>%
sf::st_transform("+proj=longlat +datum=WGS84")
Reduce MLRA boundary to MLRA of interest
mlra_boundaries_reduced <- mlra_boundaries %>%
dplyr::filter(MLRARSYM == mlra_of_interest) %>%
sf::st_transform("+proj=longlat +datum=WGS84")
Select state of interest (change appropriate to your project, you could select multiple states too)
ca <- st_as_sf(maps::map("state", fill = TRUE, plot = FALSE)) %>%
dplyr::filter(ID == "california") %>%
sf::st_transform("+proj=longlat +datum=WGS84")
Plot map
ggplot() + theme_minimal() + geom_sf(data = ca) +
geom_sf(data = mlra_boundaries_reduced) +
geom_sf(data = mapunit_boundaries_of_interest,
col = "hotpink", alpha = 0, size = 2) +
ggtitle(paste0("Distribution of ecological site - ", ecosite_of_interest))
4.4 Climate
At a large scale, climate is the most important abiotic variable affecting the distribution of organisms. In ecological site concept development, it is a critical starting place. This section will introduce functions that can help report the climate associated with an ecoligcal site by summarizing PRISM climate data (https://prism.oregonstate.edu/). PRISM data is 800m raster data that includes precipitation, temperature, vapor pressure, and dew point.
The primary product of PRISM is climate normals. PRISM normals are averages of climate conditions across a 30-year time frame. There are annual normals, monthly normals, and daily normals. There are 365 daily normals (one for each day), 12 monthly normals (one for each month), and only one annual normal. As an example of how normals work, consider precipitation on the 12th day of the year across the time period 1991-2020. There are 30 years of data, each with a 12th day and an associated estimate of precipitation. Those 30 estimates are averaged. The result is the daily normal for the 12th day of the year. The same process can be applied for the other days of the year.
4.5 Associated sites
Associated sites are ecological sites that occur in the same area of the landscape. The simplest way to think about this is ecological sites that are adjacent to your ecological site of interest. I am going to present a simple way of addressing this. We can determine what ecological sites occur in the same mapunit as your ecosite of interest. Looking at all the mapunits that your ecological site of interest occurs in, and tallying up all of the other ecological sites that are in shared mapunits, we can come to a metric of what other ecological sites tend to be near your ecological site of interest. In the future, I would like to make some improvements to this, so that it considers adjacent mapunits and considers the length of boundary between mapunits.
Load the Standard Dataset and packages.
Reduce data how you see fit. I am just going to remove miscellaneous areas, but you could choose additional criteria such as removing minor components.
my.components.MLRA.reduced <- my.components.MLRA@site |> dplyr::filter(compkind != "miscellaneous area")
Calculate the acreage associated with each component
my.components.MLRA.reduced$comp_acres <- (my.components.MLRA.reduced$muacres * my.components.MLRA.reduced$comppct_r)/100
Create empty list for upcoming for loop
Create for loop to calculate the acreage of ecosites that occur in the same mapunits as your ecosite of interest. The results will be in a list.
for(i in my.components.MLRA.reduced$ecosite_id |> unique()){
associated_ecosites[[i]] <- my.components.MLRA.reduced |>
dplyr::filter(mukey %in% (my.components.MLRA.reduced |>
dplyr::filter(ecosite_id == i) |>
dplyr::pull(mukey))) |>
dplyr::group_by(ecosite_id) |> dplyr::summarise(acres = sum(comp_acres)) |>
dplyr::filter(ecosite_id != i) |> arrange(dplyr::desc(acres))
}
Let’s take a look at an example
## NULL
4.6 Determine acreage of single ecological site
My office leader recently asked me how many acres a particular ecological site occupies because she was entering it as a project in NASIS and needed the associated acres. You might need to do something similar for a NASIS project, a tech team meeting, or to improve your own understanding of how prevalent an ecological site is.
Load the Standard Dataset and packages.
First, let’s say we have a particular ecosite of interest - “R018XI105CA”
Now let’s look at the components correlated to our ecosite of interest, the component percent (percent of mapunit represented by component), the mapunit acres, and calculate the acres associated with each component by multiplying component percent and mapunit acres.
my_ecosite_compacres <- my_ecosite %>% select(ecosite_id, coiid, comppct_r, muacres) %>% mutate(comp_acreage = (comppct_r/100)*muacres)
head(my_ecosite_compacres)
## ecosite_id coiid comppct_r muacres comp_acreage
## 1 R018XI105CA 2516892 25 5717 1429.25
## 2 R018XI105CA 2029027 10 34449 3444.90
## 3 R018XI105CA 2500528 17 34449 5856.33
## 4 R018XI105CA 1842728 25 7447 1861.75
## 5 R018XI105CA 2029025 10 7447 744.70
## 6 R018XI105CA 2482828 15 22906 3435.90
Then, we just need to sum the comp_acreage
## [1] 30098.78
4.7 Determine acreage of multiple ecological sites
Let’s look at how we would efficiently calculate the acreage of all the ecosites in your MLRA.
First, we will restrict the ecosites of interest to only those associate with MLRA 18.
Now we can run a for loop that goes through each ecological site, calculates the acreage, and puts them all in a data frame
ecosite_list <- list()
for(i in MLRA18_ecosites){
ecosite_list[[i]] <- aqp::site(my.components.MLRA) %>% dplyr::filter(ecosite_id == i) %>% select(ecosite_id, coiid, comppct_r, muacres) %>%
mutate(comp_acreage = (comppct_r/100)*muacres) %>% summarise(Ecosite = first(ecosite_id), Acreage =
sum(comp_acreage))
}
MLRA18_ecosite_acreage <- do.call(rbind, ecosite_list) %>% remove_rownames()
head(MLRA18_ecosite_acreage)
## Ecosite Acreage
## 1 F018XI207CA 19275.91
## 2 R018XI101CA 4999.80
## 3 F018XI201CA 154095.87
## 4 F018XI200CA 111078.29
## 5 F018XI202CA 69860.72
## 6 R018XI102CA 18123.88
4.8 Accessing plot level vegetation data
For this process, we are going to look at vegetation data associated with the Sequoia and King’s Canyon National Parks soil survey - CA792. For accessing vegetation data associated with a survey area, use the following query - SSRO_Alaska > ‘Pedon/Site/Vegetation Plot by site area overlap table’. The description for this Query gives the necessary details.
NATIONAL: Have to run this twice against the national in order to get sites, pedons, and vegetation plot. First, set target table to PEDON. Second, set target tablet to VEGETATION PLOT.
LOCAL: Set target tablest to PEDON, SITE, and VEGETATION PLOT.
Run against National - Pedon
Run against National - Vegetation plot
Run against Local
I will return to this to provide some tools for dealing with the actual veg data.
test <- data.frame(UserSiteID = veg_data$vegplot$site_id, DataOrigin = veg_data$vegplot$vegdataorigin)
table(test$DataOrigin)
##
## site existing veg table spreadsheet form
## 620 1006