--- title: "Um perfil real do A ao Z (estilo Embrapa, em portugues)" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Um perfil real do A ao Z (estilo Embrapa, em portugues)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 6, fig.height = 4 ) library(soilKey) ``` ## Introducao Esta vinheta acompanha **um unico perfil de solo do Brasil tropical** desde os dados brutos de campo + laboratorio ate as **tres classificacoes paralelas** (SiBCS 5a edicao, WRB 2022, USDA Soil Taxonomy 13a edicao), passando por: 1. construcao do `PedonRecord` no formato canonico do soilKey; 2. inspecao dos diagnosticos disparados (B textural, atividade da argila, V%); 3. classificacao tripla com explicacao do trace; 4. relatorio HTML pronto para entregar a um colega ou aluno; 5. (opcional) cruzamento com o priore espacial do MapBiomas Solos v0.9.48. O objetivo e dar ao agronomo / pedologo brasileiro um caminho **reproduzivel e em portugues**, no estilo dos boletins da Embrapa Solos. Todo o codigo abaixo roda sem dependencia externa pesada (nem rede, nem ESDB, nem OSSL); a etapa final do MapBiomas e opcional e exige um raster baixado. ## O perfil: Argissolo Vermelho-Amarelo distrofico tipico Adaptado do **Levantamento Reconhecimento dos Solos do Estado do Rio de Janeiro** (Embrapa, 2003), perfil RJ-1 da regiao de Itaguai. Coordenadas aproximadas: 22.86 S, 43.78 W. Material de origem: sedimentos argilosos do Terciario. ```{r profile-data} horizontes <- data.table::data.table( top_cm = c(0, 20, 55, 115, 170), bottom_cm = c(20, 55, 115, 170, 220), designation = c("A", "AB", "Bt1","Bt2","BC"), munsell_hue_moist = c("10YR","7.5YR","5YR","2.5YR","2.5YR"), munsell_value_moist = c(4, 4, 4, 3, 3), munsell_chroma_moist = c(3, 5, 6, 6, 6), structure_grade = c("moderate", "moderate", "strong", "strong", "moderate"), structure_type = c("granular", "subangular blocky", "subangular blocky", "subangular blocky", "subangular blocky"), clay_films_amount = c(NA, "few", "common", "common", "few"), clay_pct = c(18, 28, 45, 42, 38), silt_pct = c(30, 25, 20, 22, 24), sand_pct = c(52, 47, 35, 36, 38), ph_h2o = c(5.5, 5.3, 5.0, 5.0, 5.1), ph_kcl = c(4.4, 4.3, 4.1, 4.1, 4.2), oc_pct = c(1.5, 0.6, 0.3, 0.2, 0.2), cec_cmol = c(8.0, 6.0, 5.5, 4.5, 4.0), bs_pct = c(35, 25, 20, 18, 20), # V baixa -> distrofico al_cmol = c(0.5, 0.8, 1.2, 1.5, 1.4), ca_cmol = c(2.0, 1.4, 1.0, 0.7, 0.7), mg_cmol = c(0.6, 0.4, 0.3, 0.2, 0.2), k_cmol = c(0.10, 0.06, 0.04, 0.03, 0.03), na_cmol = c(0.02, 0.02, 0.02, 0.02, 0.02), bulk_density_g_cm3 = c(1.30, 1.40, 1.45, 1.45, 1.42) ) horizontes <- soilKey:::ensure_horizon_schema(horizontes) str(horizontes[, .(designation, top_cm, bottom_cm, ph_h2o, clay_pct, bs_pct)]) ``` Construindo o `PedonRecord` (R6 com `site` + `horizons`): ```{r pedon} perfil <- PedonRecord$new( site = list( id = "RJ-1-Itaguai", lat = -22.86, lon = -43.78, country = "BR", state = "RJ", municipality = "Itaguai", parent_material = "sedimentos argilosos do Terciario", survey_year = 2003, reference_source = "Embrapa Solos (2003) - Levantamento RJ" ), horizons = horizontes ) perfil ``` ## Diagnosticos manuais (sanity check) Antes de chamar a chave completa, vale rodar os predicados-chave para sentir o perfil. Isso e equivalente ao trabalho do classificador humano antes de aplicar a chave: ```{r diagnostics} # B textural (SiBCS Cap 5 / WRB argic): gradiente de argila bt <- soilKey::B_textural(perfil) arg <- soilKey::argic(perfil) cat("B_textural (SiBCS):", bt$passed, " argic (WRB):", arg$passed, "\n") # Atividade da argila (SiBCS Cap 5) ta <- soilKey::atividade_argila_alta(perfil) cat("atividade_argila_alta:", ta$passed, "\n") # Saturacao por bases (V%) -- distrofico se V < 50 distr <- soilKey::distrofico(perfil) cat("distrofico:", distr$passed, "\n") ``` Os tres devem disparar `TRUE` para um Argissolo distrofico tipico. ## Tres classificacoes paralelas A funcao `classify_all()` corre os tres sistemas e devolve um `ClassificationResult` por sistema: ```{r classify-all} res <- soilKey::classify_all(perfil, on_missing = "silent") names(res) ``` ### SiBCS 5a edicao ```{r sibcs} print(res$sibcs) ``` A descida vai do nivel da Ordem (`Argissolos`) ate o Subgrupo, passando pelos discriminantes: - Matiz Munsell em B (`5YR` / `2.5YR`) -> Subordem **Vermelho-Amarelo** - V% baixa em B -> Grande Grupo **Distrofico** - Atividade da argila baixa, sem cerosidade forte -> Subgrupo **tipico** ### WRB 2022 ```{r wrb} print(res$wrb) ``` WRB devolve o RSG mais qualificadores (em ordem canonica): **Acrisol Dystric Cutanic** (caracter argico + V baixa + presenca de revestimentos argilosos). ### USDA Soil Taxonomy 13a edicao ```{r usda} print(res$usda) ``` USDA-ST devolve a ordem (ate o nivel atualmente disponivel): **Ultisol** (B argilico + saturacao por bases baixa em todo o solum). ## Comparacao cross-system ```{r comparison} data.frame( Sistema = c("SiBCS 5a", "WRB 2022", "USDA-ST 13a"), Classe = c(res$sibcs$name, res$wrb$name, res$usda$name), EvidGrade = c(res$sibcs$evidence_grade %||% NA, res$wrb$evidence_grade %||% NA, res$usda$evidence_grade %||% NA) ) ``` Esses tres rotulos sao **complementares**, nao competidores. O SiBCS captura nuance brasileira (Distrofico, Tb, presenca/ausencia de cerosidade); o WRB captura o consenso internacional (Acrisol); o USDA-ST encaixa no esquema norte-americano (Ultisol). Todos os tres apontam para a mesma realidade: **um solo argico, acido, baixa em bases, vermelho-amarelo**. ## Relatorio HTML ```{r report, eval = FALSE} res$sibcs$report( file = "perfil_RJ1.html", format = "html", pedon = perfil ) # Ou, para os tres sistemas em um arquivo: soilKey::report( list(res$sibcs, res$wrb, res$usda), file = "perfil_RJ1_triplo.html", format = "html", pedon = perfil ) ``` O HTML carrega: nome canonico em cada sistema, qualificadores, evidencia grade, trace dos predicados, ambiguidades, atributos faltantes, e os horizontes formatados estilo planilha de boletim. ## Cruzamento com priore espacial (opcional) Se voce baixou o raster nacional do **MapBiomas Solos Colecao 2** (30 m, classes SiBCS, 2023+), pode cruzar a coordenada do perfil com o mapa para verificar consistencia: ```{r mapbiomas, eval = FALSE} sibcs_no_mapa <- soilKey::lookup_mapbiomas_solos( coords = c(perfil$site$lon, perfil$site$lat), raster_path = "soil_data/mapbiomas/mapbiomas_solos_30m_2023.tif", legend = data.frame( value = c(3), class_name = c("Argissolo Vermelho-Amarelo") ) ) sibcs_no_mapa #> [1] "Argissolo Vermelho-Amarelo" ``` Concordancia entre o classificador e o mapa nacional aumenta a confianca. Discordancia (ex.: classificador diz Argissolo, mapa diz Latossolo) e um sinal de revisao -- o pedologo decide qual fonte e mais confiavel para o caso. ## Cruzamento com SoilGrids 250m (global) Para qualquer coordenada do mundo, `lookup_soilgrids()` (v0.9.48) le direto do endpoint COG da ISRIC sem download: ```{r soilgrids, eval = FALSE} ph_topsoil <- soilKey::lookup_soilgrids( coords = c(perfil$site$lon, perfil$site$lat), property = "phh2o", depth = "0-5cm", quantile = "mean" ) clay_subsoil <- soilKey::lookup_soilgrids( coords = c(perfil$site$lon, perfil$site$lat), property = "clay", depth = "30-60cm", quantile = "mean" ) cat("SoilGrids pH (0-5cm):", ph_topsoil, " | clay subsoil (30-60cm):", clay_subsoil, "%\n") ``` ## Resumo | Etapa | Funcao | Onde | |---|---|---| | Construir o perfil | `PedonRecord$new()` | R | | Diagnosticos manuais | `B_textural()`, `argic()`, `distrofico()`, ... | R | | Tres classificacoes | `classify_all()` | R | | Relatorio | `res$sibcs$report()` ou `soilKey::report()` | R | | Munsell de espectros | `predict_munsell_from_spectra()` (v0.9.47) | R | | Quimica de espectros | `predict_from_spectra()` (v0.9.46) | R | | Cruzamento Brasil | `lookup_mapbiomas_solos()` (v0.9.48) | R + GeoTIFF | | Cruzamento global | `lookup_soilgrids()` (v0.9.48) | R + HTTPS | | Cruzamento Europa | `lookup_esdb()` (v0.9.44) | R + GeoTIFF | | App interativo | `run_classify_app()` | Shiny | Esse e o caminho **reproduzivel** que o pacote oferece: o pedologo chega com horizontes + cores Munsell + analises de laboratorio, roda **um comando** (`classify_all()`), e recebe os tres rotulos junto com o trace explicando exatamente quais diagnosticos dispararam em cada sistema. Em ~10 linhas de R.