Soil Data Access Query
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)
q |
A valid T-SQL query surrounded by double quotes |
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.
a data.frame result (NULL
if empty, try-error on error)
This function requires the httr
, jsonlite
, and XML
packages
D.E. Beaudette
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) } }
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.