Nothing
## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(
echo = TRUE,
eval = !as.logical(Sys.getenv("R_SOILDB_SKIP_LONG_EXAMPLES", unset = "TRUE")),
message = FALSE,
warning = FALSE,
fig.height = 7,
fig.width = 7
)
## ----load-packages------------------------------------------------------------
# library(soilDB)
## ----suggested-packages2, eval=FALSE------------------------------------------
# install.packages(c("sf", "terra"))
## ----basic-query-example------------------------------------------------------
# # Simple query to get the first 5 map units from an area
# q <- "
# SELECT TOP 5
# mapunit.mukey,
# mapunit.nationalmusym,
# legend.areasymbol,
# mapunit.musym,
# mapunit.muname
# FROM legend
# INNER JOIN mapunit ON mapunit.lkey = legend.lkey
# WHERE legend.areasymbol = 'CA630'
# ORDER BY mapunit.musym
# "
#
# result <- SDA_query(q)
# head(result)
## ----sda-query-error----------------------------------------------------------
# result <- SDA_query(q)
#
# # check if the result is an error response
# if (!inherits(result, 'try-error')){
# head(result)
# } else {
# # stop with error message extracted from result
# stop("Error occured! ", result[1])
# }
## ----sda-query-error-backoff--------------------------------------------------
# n_tries <- 1
# while (n_tries <= 3){
# result <- SDA_query(q)
#
# # check if the result is an error response
# if (!inherits(result, 'try-error')){
# head(result)
#
# # if no error, break out of the loop
# break
# } else {
# # on error, increment the number of tries
# # and sleep (time in seconds)
# Sys.sleep(exp(n_tries))
#
# n_tries <- n_tries + 1
# if (n_tries > 3) {
# stop("Error occured! ", result[1])
# }
# }
# }
## ----basic-join-example-------------------------------------------------------
# # Get map unit, component, and horizon data
# q <- "
# SELECT TOP 10
# mu.mukey,
# leg.areasymbol,
# mu.musym,
# co.compname,
# co.comppct_r,
# ch.hzname,
# ch.hzdept_r,
# ch.hzdepb_r,
# ch.claytotal_r
# FROM legend AS leg
# INNER JOIN mapunit AS mu ON mu.lkey = leg.lkey
# INNER JOIN component AS co ON co.mukey = mu.mukey
# LEFT JOIN chorizon AS ch ON ch.cokey = co.cokey
# WHERE leg.areasymbol = 'CA630'
# AND co.majcompflag = 'Yes'
# AND ch.claytotal_r IS NOT NULL
# ORDER BY mu.musym, co.comppct_r DESC, ch.hzdept_r
# "
#
# result <- SDA_query(q)
# head(result, 10)
## ----inner-join-complete-data-------------------------------------------------
# # These relationships are always present in SSURGO:
# # - mapunit always belongs to a legend (survey area)
# # - component always belongs to a mapunit
# q <- "
# SELECT TOP 10
# leg.areasymbol,
# mu.musym,
# co.compname,
# co.comppct_r
# FROM legend AS leg
# INNER JOIN mapunit AS mu ON mu.lkey = leg.lkey
# INNER JOIN component AS co ON co.mukey = mu.mukey
# WHERE leg.areasymbol = 'CA630'
# ORDER BY mu.musym, co.comppct_r DESC
# "
#
# result <- SDA_query(q)
#
# # Every row represents a valid component with all parent relationships
# head(result)
## ----left-join-components-without-horizons------------------------------------
# # Some components have NO horizons defined
# # INNER JOIN would exclude these components entirely
# # LEFT JOIN preserves components even without horizon data
# q <- "
# SELECT
# leg.areasymbol,
# mu.mukey,
# mu.musym,
# co.compname,
# co.comppct_r,
# ch.chkey,
# ch.hzdept_r,
# ch.hzdepb_r
# FROM legend AS leg
# INNER JOIN mapunit AS mu ON mu.lkey = leg.lkey
# INNER JOIN component AS co ON co.mukey = mu.mukey
# LEFT JOIN chorizon AS ch ON ch.cokey = co.cokey
# WHERE leg.areasymbol = 'CA630'
# AND co.majcompflag = 'Yes'
# ORDER BY mu.musym, co.comppct_r DESC, ch.hzdept_r
# "
#
# result <- SDA_query(q)
#
# # Check for components without horizons:
# # Rows with NA in horizon columns indicate a component with no horizon data
# if (is.data.frame(result) && nrow(result) > 0) {
# components_no_horizons <- result[is.na(result$chkey), ]
# if (nrow(components_no_horizons) > 0) {
# cat('Found', nrow(components_no_horizons), 'components without horizon data:\n')
# print(components_no_horizons[, c('musym', 'compname', 'comppct_r')])
# }
# }
## ----compare-inner-join-drops-components--------------------------------------
# # Using INNER JOIN on horizons drops components that lack horizon data
# q_inner <- "
# SELECT
# leg.areasymbol,
# mu.mukey,
# mu.musym,
# co.compname,
# co.comppct_r,
# ch.desgnmaster,
# ch.hzdept_r,
# ch.hzdepb_r
# FROM legend AS leg
# INNER JOIN mapunit AS mu ON mu.lkey = leg.lkey
# INNER JOIN component AS co ON co.mukey = mu.mukey
# INNER JOIN chorizon AS ch ON ch.cokey = co.cokey
# WHERE leg.areasymbol = 'CA630'
# AND co.majcompflag = 'Yes'
# ORDER BY mu.musym, co.comppct_r DESC, ch.hzdept_r
# "
#
# result_inner <- SDA_query(q_inner)
#
# # number of rows in LEFT JOIN result
# nrow(result)
#
# # number of rows in INNER JOIN result
# nrow(result_inner)
## ----left-join-horizons-without-fragments-------------------------------------
# # Some horizons have NO rock fragment data recorded
# # LEFT JOIN preserves horizons even without fragment information
# q <- "
# SELECT
# mu.musym,
# co.compname,
# ch.desgnmaster,
# ch.hzdept_r,
# ch.hzdepb_r,
# rf.fragsize_h,
# rf.fragvol_r
# FROM legend AS leg
# INNER JOIN mapunit AS mu ON mu.lkey = leg.lkey
# INNER JOIN component AS co ON co.mukey = mu.mukey
# LEFT JOIN chorizon AS ch ON ch.cokey = co.cokey
# LEFT JOIN chfrags AS rf ON rf.chkey = ch.chkey
# WHERE leg.areasymbol = 'CA630'
# AND co.majcompflag = 'Yes'
# ORDER BY mu.musym, co.comppct_r DESC, ch.hzdept_r
# "
#
# result <- SDA_query(q)
#
# # Check for horizons without fragments:
# if (is.data.frame(result) && nrow(result) > 0) {
# horizons_no_frags <- result[!duplicated(result$chkey) & is.na(result$fragsize_h), ]
# if (nrow(horizons_no_frags) > 0) {
# cat('Found', nrow(horizons_no_frags), 'horizons without rock fragment data:\n')
# print(horizons_no_frags[, c('musym', 'compname', 'desgnmaster', 'fragvol_r')])
# }
# }
## ----aggregation-example------------------------------------------------------
# # Get component statistics per map unit
# q <- "
# SELECT
# mu.mukey,
# mu.musym,
# mu.muname,
# COUNT(co.cokey) AS n_components,
# SUM(co.comppct_r) AS total_comppct,
# AVG(co.comppct_r) AS avg_comppct
# FROM legend AS leg
# INNER JOIN mapunit AS mu ON mu.lkey = leg.lkey
# INNER JOIN component AS co ON co.mukey = mu.mukey
# WHERE leg.areasymbol = 'CA630'
# GROUP BY mu.mukey, mu.musym, mu.muname
# ORDER BY mu.musym
# "
#
# result <- SDA_query(q)
# head(result)
## ----inspect-horizon-data-----------------------------------------------------
# q <- "
# SELECT TOP 10
# component.compname,
# ch.hzname,
# ch.hzdept_r,
# ch.hzdepb_r,
# ch.texturerv,
# ch.horztype,
# ch.claytotal_r,
# ch.om_r
# FROM chorizon AS ch
# INNER JOIN component ON component.cokey = ch.cokey AND taxsubgrp LIKE '%Histic%'
# ORDER BY component.cokey, hzdept_r
# "
#
# result <- SDA_query(q)
# result
## ----filtering-horizon-data---------------------------------------------------
# q <- "
# SELECT TOP 10
# ch.hzname,
# ch.hzdept_r,
# ch.hzdepb_r,
# ch.texturerv,
# ch.horztype,
# ch.claytotal_r,
# ch.om_r
# FROM chorizon AS ch
# WHERE
# -- 1. Exclude Bedrock
# ch.texturerv NOT IN ('BR', 'WB', 'UWB')
#
# -- 2. Exclude Dry Organic / Duff
# AND ISNULL(ch.horztype, '') != 'Dry Organic'
# AND ch.texturerv NOT IN ('SPM', 'MPM', 'HPM')
# ORDER BY cokey, hzdept_r
# "
#
# result <- SDA_query(q)
# head(result)
## ----organic-kfact------------------------------------------------------------
# q <- "
# SELECT
# COUNT(chkey) AS n,
# kwfact,
# kffact
# FROM chorizon
# WHERE desgnmaster = 'O' AND hzdept_r = 0
# GROUP BY kwfact, kffact
# ORDER BY n DESC
# "
# result <- SDA_query(q)
# result$percent <- round(prop.table(result$n) * 100, 1)
# head(result, 10)
## ----rock-fragment-basic------------------------------------------------------
# # Query horizons with their rock fragment content
# q <- "
# SELECT TOP 20
# mu.musym,
# co.compname,
# ch.hzname,
# ch.hzdept_r,
# ch.hzdepb_r,
# rf.fragkind,
# rf.fragsize_h,
# rf.fragvol_r
# FROM legend AS leg
# INNER JOIN mapunit AS mu ON mu.lkey = leg.lkey
# INNER JOIN component AS co ON co.mukey = mu.mukey
# LEFT JOIN chorizon AS ch ON ch.cokey = co.cokey
# LEFT JOIN chfrags AS rf ON rf.chkey = ch.chkey
# WHERE leg.areasymbol = 'CA630'
# AND co.majcompflag = 'Yes'
# ORDER BY mu.musym, co.comppct_r DESC, ch.hzdept_r, rf.fragsize_h
# "
#
# result <- SDA_query(q)
# head(result, 20)
## ----rock-fragment-aggregation------------------------------------------------
# # Total rock fragment content per horizon
# q <- "
# SELECT
# mu.musym,
# co.compname,
# co.comppct_r,
# ch.hzname,
# ch.hzdept_r,
# ch.hzdepb_r,
# SUM(rf.fragvol_r) AS calc_fragvoltot_r,
# COUNT(DISTINCT rf.fragsize_h) AS n_frag_classes
# FROM legend AS leg
# INNER JOIN mapunit AS mu ON mu.lkey = leg.lkey
# INNER JOIN component AS co ON co.mukey = mu.mukey
# LEFT JOIN chorizon AS ch ON ch.cokey = co.cokey
# LEFT JOIN chfrags AS rf ON rf.chkey = ch.chkey
# WHERE leg.areasymbol = 'CA630'
# AND co.majcompflag = 'Yes'
# GROUP BY mu.musym, co.compname, co.comppct_r, ch.hzname,
# ch.hzdept_r, ch.hzdepb_r, ch.chkey
# ORDER BY mu.musym, co.comppct_r DESC, ch.hzdept_r
# "
#
# result <- SDA_query(q)
# head(result)
## ----rock-fragment-via-property-----------------------------------------------
# # Get rock fragment weight percentages (3-10 inch class)
# frag_3_10 <- get_SDA_property(
# property = "Rock Fragments 3 - 10 inches - Rep Value", # equivalent to 'frag3to10_r'
# method = "Dominant Component (Numeric)", # dominant component, weighted average by depth
# areasymbols = "CA630",
# top_depth = 0,
# bottom_depth = 100 # depth range for averaging
# )
#
# head(frag_3_10)
#
# # get fragment volume (fragvoltot_l, fragvoltot_r, fragvoltot_h)
# fragvol_total <- get_SDA_property(
# property = "fragvoltot_r",
# method = "Weighted Average", # weighted by component percentage and depth
# top_depth = 0,
# bottom_depth = 100,
# areasymbols = "CA630"
# )
#
# head(fragvol_total)
## ----chunking-example---------------------------------------------------------
# large_mukey_list <- 461994:466995
#
# # Divide into chunks of 1000
# chunks <- soilDB::makeChunks(large_mukey_list, 1000)
#
# # Now loop through chunks
# results_list <- lapply(split(large_mukey_list, chunks), function(chunk_keys) {
#
# # Build IN clause
# in_clause <- soilDB::format_SQL_in_statement(chunk_keys)
#
# # construct query
# q <- sprintf(
# "SELECT mukey, musym, muname FROM mapunit WHERE mukey IN %s", in_clause
# )
# cat(sprintf("Chunk mukey %d to %d\n", min(chunk_keys), max(chunk_keys)))
# SDA_query(q)
# })
#
# # Combine results
# all_results <- do.call(rbind, results_list)
## ----chunked-property-example-------------------------------------------------
# test_areasymbols <- c("CA067", "CA077", "CA632", "CA644", "CA630", "CA649")
#
# # Chunk into groups of 5
# chunks <- soilDB::makeChunks(test_areasymbols, 2)
#
# results_list <- lapply(split(test_areasymbols, chunks), function(chunk_keys) {
#
# # Build IN clause
# in_clause <- soilDB::format_SQL_in_statement(chunk_keys)
#
# q <- sprintf("
# SELECT
# mu.mukey,
# mu.musym,
# mu.muname,
# co.cokey,
# co.compname,
# SUM(hzdepb_r - hzdept_r) AS sum_hz_thickness
# FROM legend AS leg
# INNER JOIN mapunit AS mu ON mu.lkey = leg.lkey
# INNER JOIN component AS co ON co.mukey = mu.mukey
# INNER JOIN chorizon AS ch ON ch.cokey = co.cokey
# WHERE leg.areasymbol IN %s
# GROUP BY mu.mukey, mu.musym, mu.muname, co.cokey, co.compname
# ", in_clause)
#
# cat(sprintf("Chunk %s completed\n", paste0(chunk_keys, collapse = ", ")))
# SDA_query(q)
# })
#
# all_results <- do.call(rbind, results_list)
# head(all_results)
## ----spatial-wkt-example------------------------------------------------------
# library(sf)
#
# # Define a bounding box for a region of interest
# # (xmin, ymin, xmax, ymax)
# bbox <- c(-120.9, 37.7, -120.8, 37.8)
# bbox_sf <- st_as_sfc(st_bbox(c(
# xmin = bbox[1],
# ymin = bbox[2],
# xmax = bbox[3],
# ymax = bbox[4]
# ), crs = 4326))
#
# wkt <- st_as_text(bbox_sf)
#
# wkt
## ----high-level-spatial-example1----------------------------------------------
# # Example: Retrieve map unit polygons that intersect a bounding box
# # This handles the WKT conversion and query construction automatically
# # geomIntersection = TRUE clips the polygons to the bounding box
#
# polygons <- SDA_spatialQuery(bbox_sf, what = "mupolygon", geomIntersection = TRUE)
# polygons
## ----high-level-spatial-example2----------------------------------------------
# # Example: get some legend and mapunit-level tabular data at a point
# point_sf <- sf::st_as_sf(data.frame(wkt = "POINT (-120.85 37.75)"),
# wkt = "wkt",
# crs = "EPSG:4236")
# ssa <- SDA_spatialQuery(
# point_sf,
# what = "areasymbol"
# )
# ssa
#
# mu <- SDA_spatialQuery(
# point_sf,
# what = "mukey"
# )
# mu
## ----spatial-sda-query-example------------------------------------------------
# # Step 1: Get the mukeys that intersect the bounding box
# q <- sprintf("
# SELECT DISTINCT mu.mukey
# FROM mapunit AS mu
# INNER JOIN mupolygon AS mp ON mp.mukey = mu.mukey
# WHERE mp.mupolygongeo.STIntersects(geometry::STGeomFromText('%s', 4326)) = 1
# ", wkt)
#
# spatial_result <- SDA_query(q)
# head(spatial_result, 5)
## ----sda-helper-function------------------------------------------------------
# # Input MUST be WKT in WGS84 (EPSG:4326)
# q <- "SELECT * FROM SDA_Get_Mukey_from_intersection_with_WktWgs84('POINT(-120.9 37.7)')"
# result <- SDA_query(q)
## ----sda-helper-function-geometry---------------------------------------------
# # Step 2: Get Geometry from Map Unit Key (mukey)
# # Useful for retrieving the polygon boundary for a specific map unit
# target_mukey <- 461994
#
# q <- sprintf("SELECT * FROM SDA_Get_MupolygonWktWgs84_from_Mukey('%s')", target_mukey)
#
# # Result contains the mukey and the geometry in WKT format
# geometry_df <- SDA_query(q)
#
# head(geometry_df)
## -----------------------------------------------------------------------------
# if (requireNamespace("sf", quietly = TRUE) &&
# !is.null(geometry_df)) {
# # Parse WKT column (usually named 'mupolygongeo' in mupolygon table, but 'MupolygonWktWgs84' in TVF result)
# poly_sf <- sf::st_as_sfc(geometry_df$MupolygonWktWgs84, crs = 4326)
#
# plot(poly_sf, main = paste("Geometry for mukey=", target_mukey))
# }
## ----spatial-property-integration---------------------------------------------
# # Step 2: Use the mukeys to fetch tabular data
# # First, get mukeys in bounding box
# spatial_mukeys <- unique(spatial_result$mukey)
#
# # Then query properties for those mukeys
# if (length(spatial_mukeys) > 0) {
# clay_in_bbox <- get_SDA_property(
# property = "Total Clay - Rep Value",
# method = "Weighted Average",
# mukeys = spatial_mukeys,
# top_depth = 0,
# bottom_depth = 50
# )
#
# head(clay_in_bbox)
# }
## ----get_sda_property_category------------------------------------------------
# # Get taxonomic classification from dominant component
# tax_order <- get_SDA_property(
# property = "Taxonomic Suborder",
# method = "Dominant Component (Category)",
# areasymbols = "CA630"
# )
#
# head(tax_order)
## ----get_sda_property_numeric-------------------------------------------------
# # Get bulk density at 0-25 cm depth
# bulk_density <- get_SDA_property(
# property = c("dbthirdbar_l", "dbthirdbar_r", "dbthirdbar_h"),
# method = "Dominant Component (Numeric)",
# areasymbols = "CA630",
# top_depth = 0,
# bottom_depth = 25
# )
#
# head(bulk_density)
## ----get_sda_property_weighted------------------------------------------------
# # Get weighted average clay content (0-50 cm)
# clay_avg <- get_SDA_property(
# property = "Total Clay - Rep Value",
# method = "Weighted Average",
# areasymbols = "CA630",
# top_depth = 0,
# bottom_depth = 50,
# include_minors = FALSE
# )
#
# head(clay_avg)
## ----get_sda_property_minmax--------------------------------------------------
# # Get maximum sand content in any component
# sand_max <- get_SDA_property(
# property = "Total Sand - Rep Value",
# method = "Min/Max",
# areasymbols = "CA630",
# FUN = "MAX",
# top_depth = 0,
# bottom_depth = 50
# )
#
# head(sand_max)
## ----get_sda_property_dominant_condition--------------------------------------
# # Get dominant drainage class condition
# drain_dominant <- get_SDA_property(
# property = "Drainage Class",
# method = "Dominant Condition",
# areasymbols = "CA630"
# )
#
# head(drain_dominant)
## ----get_sda_property_none----------------------------------------------------
# # Get all pH values by component and horizon
# ph_all <- get_SDA_property(
# property = "pH 1:1 water - Rep Value",
# method = "None",
# areasymbols = "CA630"
# )
#
# head(ph_all)
## ----get_sda_property_query_string--------------------------------------------
# q <- get_SDA_property(
# property = "Taxonomic Suborder",
# method = "Dominant Component (Category)",
# areasymbols = "CA630",
# query_string = TRUE
# )
#
# # View first 500 characters of query
# cat(substr(q, 1, 500), "...\n")
## ----get_sda_interpretation_dominant_component--------------------------------
# # Get forestry ratings for dominant component
# for_ratings <- get_SDA_interpretation(
# rulename = c("FOR - Potential Seedling Mortality",
# "FOR - Road Suitability (Natural Surface)"),
# method = "Dominant Component",
# areasymbols = "CA630"
# )
#
# head(for_ratings)
## ----get_sda_interpretation_dominant_condition--------------------------------
# # Get dominant engineering interpretation
# eng_ratings <- get_SDA_interpretation(
# rulename = "ENG - Septic Tank Absorption Fields",
# method = "Dominant Condition",
# areasymbols = "CA649"
# )
#
# head(eng_ratings)
## ----get_sda_interpretation_weighted_average----------------------------------
# # Get weighted average agricultural rating
# agr_weighted <- get_SDA_interpretation(
# rulename = "AGR - Winter Wheat Yield (MT)",
# method = "Weighted Average",
# areasymbols = "MT041",
# include_minors = TRUE
# )
#
# head(agr_weighted)
## ----get_sda_interpretation_none----------------------------------------------
# # Get all component-level ratings
# all_ratings <- get_SDA_interpretation(
# rulename = "FOR - Mechanical Planting Suitability",
# method = "None",
# areasymbols = "CA630"
# )
#
# head(all_ratings)
## ----get_sda_interpretation_wide_reason---------------------------------------
# # Get detailed ratings with reasons pivoted
# detailed <- get_SDA_interpretation(
# rulename = "FOR - Mechanical Planting Suitability",
# method = "Dominant Component",
# areasymbols = "CA630",
# wide_reason = TRUE
# )
#
# head(detailed)
## ----get_sda_hydric_mapunit---------------------------------------------------
# hydric_class <- get_SDA_hydric(
# areasymbols = c("CA077", "CA630"),
# method = "MAPUNIT"
# )
#
# head(hydric_class)
#
# # Check unique ratings
# unique(hydric_class$HYDRIC_RATING)
## ----get_sda_hydric_dominant_component----------------------------------------
# hydric_dom <- get_SDA_hydric(
# areasymbols = "CA630",
# method = "DOMINANT COMPONENT"
# )
#
# head(hydric_dom)
## ----get_sda_hydric_dominant_condition----------------------------------------
# hydric_cond <- get_SDA_hydric(
# mukeys = c(461994, 461995, 462205),
# method = "DOMINANT CONDITION"
# )
#
# head(hydric_cond)
## ----get_sda_hydric_none------------------------------------------------------
# hydric_all <- get_SDA_hydric(
# areasymbols = "CA630",
# method = "NONE"
# )
#
# head(hydric_all)
## ----get_sda_muaggatt---------------------------------------------------------
# muagg <- get_SDA_muaggatt(
# areasymbols = "CA630"
# )
#
# head(muagg)
# str(muagg)
## ----get_sda_muaggatt_filter--------------------------------------------------
# # Get aggregate attributes for specific mukeys
# muagg_filtered <- get_SDA_muaggatt(
# mukeys = c(461994, 461995, 463264)
# )
#
# head(muagg_filtered)
## ----get_sda_pmgroupname_dominant_component-----------------------------------
# pm_dom <- get_SDA_pmgroupname(
# areasymbols = "CA630",
# method = "DOMINANT COMPONENT",
# simplify = FALSE
# )
#
# head(pm_dom)
## ----get_sda_pmgroupname_dominant_condition-----------------------------------
# pm_cond <- get_SDA_pmgroupname(
# mukeys = c(461994, 461995, 462205),
# method = "DOMINANT CONDITION"
# )
#
# head(pm_cond)
## ----get_sda_pmgroupname_simplify---------------------------------------------
# # Simplified (broader groups)
# pm_simple <- get_SDA_pmgroupname(
# mukeys = c(461994, 461995),
# simplify = TRUE
# )
#
# head(pm_simple)
#
# # Detailed (specific groups)
# pm_detailed <- get_SDA_pmgroupname(
# mukeys = c(461994, 461995),
# simplify = FALSE
# )
#
# head(pm_detailed)
## ----get_sda_coecoclass_none--------------------------------------------------
# eco_none <- get_SDA_coecoclass(
# method = "None",
# areasymbols = "CA630"
# )
#
# head(eco_none)
## ----get_sda_coecoclass_dominant_component------------------------------------
# eco_dom <- get_SDA_coecoclass(
# method = "Dominant Component",
# areasymbols = "CA630"
# )
#
# head(eco_dom)
## ----get_sda_coecoclass_dominant_condition------------------------------------
# eco_cond <- get_SDA_coecoclass(
# method = "Dominant Condition",
# mukeys = c(461994, 461995, 462205),
# ecoclasstypename = "NRCS Forestland Site"
# )
#
# head(eco_cond)
## ----get_sda_coecoclass_all---------------------------------------------------
# eco_all <- get_SDA_coecoclass(
# method = "All",
# mukeys = c(461994, 461995),
# threshold = 5
# )
#
# head(eco_all)
## ----get_sda_coecoclass_ecoclasstypename--------------------------------------
# # Get rangeland sites only
# eco_range <- get_SDA_coecoclass(
# method = "Dominant Condition",
# areasymbols = "CA630",
# ecoclasstypename = "NRCS Rangeland Site"
# )
#
# head(eco_range)
## ----get_sda_cosurfmorph_3d---------------------------------------------------
# # Get geomorphic position by component name
# geom_3d <- get_SDA_cosurfmorph(
# table = "cosurfmorphgc",
# areasymbols = "CA630"
# )
#
# head(geom_3d)
## ----get_sda_cosurfmorph_hillslope--------------------------------------------
# # Get hillslope position aggregated by area symbol
# geom_hill <- get_SDA_cosurfmorph(
# table = "cosurfmorphhpp",
# by = "areasymbol",
# areasymbols = "CA630"
# )
#
# head(geom_hill)
## ----get_sda_cosurfmorph_surface_shape----------------------------------------
# # Get surface shape classes
# geom_shape <- get_SDA_cosurfmorph(
# table = "cosurfmorphss",
# areasymbols = "CA649"
# )
#
# head(geom_shape)
## ----get_sda_cosurfmorph_microrelief------------------------------------------
# # Get microrelief by component name
# geom_micro <- get_SDA_cosurfmorph(
# table = "cosurfmorphmr",
# areasymbols = "CA630"
# )
#
# head(geom_micro)
## ----fetchsda-example---------------------------------------------------------
# library(aqp)
#
# # Query soil components by areasymbol and musym
# s <- fetchSDA(WHERE = "areasymbol = 'IN005' AND musym = 'MnpB2'")
#
# # The result is a SoilProfileCollection
# s
#
# # Check the horizon data
# head(horizons(s))
## ----fetchldm-example-area----------------------------------------------------
# # Fetch KSSL data for a specific soil survey area (CA630)
# # 'what' argument specifies we are searching by 'area_code'
# # 'tables' argument specifies which data tables to include (defaults to core tables)
# ldm_data <- fetchLDM("CA630", what = "area_code")
#
# # The result is a SoilProfileCollection
# ldm_data
#
# # Inspect site data
# head(site(ldm_data))
## ----fetchldm-example-taxon---------------------------------------------------
# # Fetch lab data where the correlated or sampled name is 'Musick' or 'Holland'
# # CASE statement handles differences between correlated and sampled names
# ldm_taxon <- fetchLDM(WHERE = "(CASE WHEN corr_name IS NOT NULL
# THEN LOWER(corr_name)
# ELSE LOWER(samp_name)
# END) IN ('musick', 'holland')")
#
# ldm_taxon
## ----fetchldm-example-tables--------------------------------------------------
# # Fetch physical properties for soils correlated as "Typic Argialbolls"
# ldm_phys <- fetchLDM(x = "Typic Argialbolls",
# what = "corr_taxsubgrp",
# tables = "lab_physical_properties")
#
# # Inspect the available horizon data columns
# names(horizons(ldm_phys))
## ----integration-example-1----------------------------------------------------
# # Get clay content using three different methods
# methods <- c("Dominant Component (Numeric)", "Weighted Average", "Max")
#
# clay_results <- data.frame()
#
# for (method in methods) {
# result <- get_SDA_property(
# property = "Total Clay - Rep Value",
# method = method,
# areasymbols = "CA630",
# top_depth = 0,
# bottom_depth = 50
# )
#
# result$method <- method
# clay_results <- rbind(clay_results, result)
# }
#
# # compare methods for a single map unit
# subset(clay_results, mukey == 1865918)
## ----integration-example-2----------------------------------------------------
# # Get drainage class and hydrologic group
# drain_hydro <- get_SDA_property(
# property = c("Drainage Class", "Hydrologic Group"),
# method = "Dominant Condition",
# areasymbols = "CA630"
# )
#
# # Get an engineering interpretation
# eng_interp <- get_SDA_interpretation(
# rulename = "ENG - Septic Tank Absorption Fields",
# method = "Dominant Condition",
# areasymbols = "CA630"
# )
#
# # Explicitly merge on mukey (and other shared columns to avoid duplication)
# suitability <- merge(drain_hydro, eng_interp,
# by = c("mukey", "areasymbol", "musym", "muname"))
#
# head(suitability)
## ----integration-example-3----------------------------------------------------
# # Get a generalized mapunit-level hydric classification
# # see ?get_SDA_hydric for details on method="mapunit"
# hydric_stat <- get_SDA_hydric(
# areasymbols = "CA077",
# method = "MAPUNIT"
# )
#
# wet_interp <- get_SDA_interpretation(
# rulename = "WMS - Excavated Ponds (Aquifer-fed)",
# method = "Dominant Condition",
# areasymbols = "CA077"
# )
#
# wetland_assess <- merge(hydric_stat, wet_interp,
# by = c("mukey", "areasymbol", "musym", "muname"),
# all.x = TRUE)
#
# subset(wetland_assess, rating_WMSExcavatedPondsAquiferfed < 0.6)
## ----integration-example-4----------------------------------------------------
# # Get properties for two areas
# props_ca630 <- get_SDA_property(
# property = "Total Clay - Rep Value",
# method = "Dominant Component (Numeric)",
# areasymbols = "CA630"
# )
#
# props_ca649 <- get_SDA_property(
# property = "Total Clay - Rep Value",
# method = "Dominant Component (Numeric)",
# areasymbols = "CA649"
# )
#
# # Combine
# all_props <- rbind(props_ca630, props_ca649)
#
# # Aggregate by area symbol
# area_summary <- aggregate(
# claytotal_r ~ areasymbol,
# data = all_props,
# FUN = function(x) {
# c(
# mean = mean(x, na.rm = TRUE),
# median = median(x, na.rm = TRUE),
# sd = sd(x, na.rm = TRUE),
# n = sum(!is.na(x))
# )
# }
# )
#
# area_summary
## ----integration-example-5----------------------------------------------------
# # Get all component properties without aggregation
# clay_by_comp <- get_SDA_property(
# property = "Total Clay - Rep Value",
# method = "None",
# areasymbols = "CA630",
# top_depth = 0,
# bottom_depth = 25,
# include_minors = TRUE
# )
#
# head(clay_by_comp)
#
# # Calculate average clay by major vs. minor components
# clay_summary <- aggregate(
# claytotal_r ~ majcompflag,
# data = clay_by_comp,
# FUN = mean
# )
#
# clay_summary
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.