Submit a query to the Soil Data Access (SDA) REST/JSON web-service and return the results as a data.frame. There is a 100,000 record limit and 32Mb JSON serializer limit, per query. Queries should contain a WHERE statement or JOIN condition to limit the number of rows affected / returned. Consider wrapping calls to SDA_query in a function that can iterate over logical chunks (e.g. areasymbol, mukey, cokey, etc.). The function makeChunks can help with such iteration.

SDA_query(q)

Arguments

q

A valid T-SQL query surrounded by double quotes

Value

a data.frame result (NULL if empty, try-error on error)

Details

The SDA website can be found at https://sdmdataaccess.nrcs.usda.gov and query examples can be found at https://sdmdataaccess.nrcs.usda.gov/QueryHelp.aspx. A library of query examples can be found at https://nasis.sc.egov.usda.gov/NasisReportsWebSite/limsreport.aspx?report_name=SDA-SQL_Library_Home.

SSURGO (detailed soil survey) and STATSGO (generalized soil survey) data are stored together within SDA. This means that queries that don't specify an area symbol may result in a mixture of SSURGO and STATSGO records. See the examples below and the SDA Tutorial for details.

Note

This function requires the httr, jsonlite, and XML packages

Author

D.E. Beaudette

Examples

# \donttest{
if(requireNamespace("curl") & requireNamespace("wk") &
   curl::has_internet()) {

  ## get SSURGO export date for all soil survey areas in California
  # there is no need to filter STATSGO
  # because we are filtering on SSURGO area symbols
  q <- "SELECT areasymbol, saverest FROM sacatalog WHERE areasymbol LIKE 'CA%';"
  x <- SDA_query(q)
  head(x)


  ## get SSURGO component data associated with the
  ## Amador series / major component only
  # this query must explicitly filter out STATSGO data
  q <- "SELECT cokey, compname, comppct_r FROM legend
    INNER JOIN mapunit mu ON mu.lkey = legend.lkey
    INNER JOIN component co ON mu.mukey = co.mukey
    WHERE legend.areasymbol != 'US' AND compname = 'Amador';"

  res <- SDA_query(q)
  str(res)


  ## get component-level data for a specific soil survey area (Yolo county, CA)
  # there is no need to filter STATSGO because the query contains
  # an implicit selection of SSURGO data by areasymbol
  q <- "SELECT
    component.mukey, cokey, comppct_r, compname, taxclname,
    taxorder, taxsuborder, taxgrtgroup, taxsubgrp
    FROM legend
    INNER JOIN mapunit ON mapunit.lkey = legend.lkey
    LEFT OUTER JOIN component ON component.mukey = mapunit.mukey
    WHERE legend.areasymbol = 'CA113' ;"

  res <- SDA_query(q)
  str(res)

  ## get tabular data based on result from spatial query
  # there is no need to filter STATSGO because
  # SDA_Get_Mukey_from_intersection_with_WktWgs84() implies SSURGO
  p <- wk::as_wkt(wk::rct(-120.9, 37.7, -120.8, 37.8))
  q <- paste0("SELECT mukey, cokey, compname, comppct_r FROM component 
      WHERE mukey IN (SELECT DISTINCT mukey FROM
      SDA_Get_Mukey_from_intersection_with_WktWgs84('", p,
       "')) ORDER BY mukey, cokey, comppct_r DESC")
    
   x <- SDA_query(q)
   str(x)
 }
#> single result set, returning a data.frame
#> single result set, returning a data.frame
#> 'data.frame':	54 obs. of  3 variables:
#>  $ cokey    : int  21097183 21588783 21108405 21128710 21139862 21622626 21830881 21157110 21097182 21096537 ...
#>  $ compname : chr  "Amador" "Amador" "Amador" "Amador" ...
#>  $ comppct_r: int  25 10 3 3 1 10 85 5 7 45 ...
#>  - attr(*, "SDA_id")= chr "Table"
#> single result set, returning a data.frame
#> 'data.frame':	608 obs. of  9 variables:
#>  $ mukey      : int  459208 459208 459208 459208 459209 459209 459209 459209 459209 459210 ...
#>  $ cokey      : int  21463250 21463251 21463252 21463253 21463254 21463255 21463256 21463257 21463258 21463259 ...
#>  $ comppct_r  : int  85 5 5 5 85 2 5 5 3 5 ...
#>  $ compname   : chr  "Balcom" "Positas" "Sehorn" "Corning" ...
#>  $ taxclname  : chr  "Fine-loamy, mixed, thermic Calcixerollic Xerochrepts" NA NA NA ...
#>  $ taxorder   : chr  "Inceptisols" NA NA NA ...
#>  $ taxsuborder: chr  "Ochrepts" NA NA NA ...
#>  $ taxgrtgroup: chr  "Xerochrepts" NA NA NA ...
#>  $ taxsubgrp  : chr  "Calcixerollic Xerochrepts" NA NA NA ...
#>  - attr(*, "SDA_id")= chr "Table"
#> single result set, returning a data.frame
#> 'data.frame':	337 obs. of  4 variables:
#>  $ mukey    : int  462527 462527 462527 462541 462541 462541 462541 462554 462554 462554 ...
#>  $ cokey    : int  21830875 21830876 21830877 21831125 21831126 21831127 21831128 21830903 21830904 21830905 ...
#>  $ compname : chr  "Madera" "Alamo" "San Joaquin" "Chualar" ...
#>  $ comppct_r: int  10 85 5 85 5 5 5 5 10 85 ...
#>  - attr(*, "SDA_id")= chr "Table"
# }