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

See also

Author

D.E. Beaudette

Examples

# \donttest{ if(requireNamespace("curl") & 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 # # requires raster and rgeos packages because raster is suggested # and rgeos is additional if(require(raster) & require(rgeos)) { # text -> bbox -> WKT # xmin, xmax, ymin, ymax b <- c(-120.9, -120.8, 37.7, 37.8) p <- writeWKT(as(extent(b), 'SpatialPolygons')) 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 19800598 19825077 19572244 19605740 19586145 19668002 19672960 19591564 19800808 19800652 ... #> $ compname : chr "Amador" "Amador" "Amador" "Amador" ... #> $ comppct_r: int 25 10 3 3 76 30 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 459154 459204 459205 459208 459208 459208 459208 459209 459209 459209 ... #> $ cokey : int 19804521 19804396 19804203 19804274 19804275 19804276 19804277 19804438 19804439 19804440 ... #> $ comppct_r : int 100 100 100 85 5 5 5 3 5 85 ... #> $ compname : chr "Water" "Gravel pits" "Water" "Balcom" ... #> $ taxclname : chr NA NA NA "Fine-loamy, mixed, thermic Calcixerollic Xerochrepts" ... #> $ taxorder : chr NA NA NA "Inceptisols" ... #> $ taxsuborder: chr NA NA NA "Ochrepts" ... #> $ taxgrtgroup: chr NA NA NA "Xerochrepts" ... #> $ taxsubgrp : chr NA NA NA "Calcixerollic Xerochrepts" ... #> - attr(*, "SDA_id")= chr "Table"
#> Loading required package: raster
#> #> Attaching package: 'raster'
#> The following objects are masked from 'package:aqp': #> #> metadata, metadata<-
#> Loading required package: rgeos
#> rgeos version: 0.5-5, (SVN revision 640) #> GEOS runtime version: 3.8.0-CAPI-1.13.1 #> Linking to sp version: 1.4-5 #> Polygon checking: TRUE
#> 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 19673167 19673168 19673169 19673431 19673432 19673433 19673434 19673195 19673196 19673197 ... #> $ 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"
# }