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:
PedonRecord no formato canonico do
soilKey;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.
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.
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)])
#> Classes 'data.table' and 'data.frame': 5 obs. of 6 variables:
#> $ designation: chr "A" "AB" "Bt1" "Bt2" ...
#> $ top_cm : num 0 20 55 115 170
#> $ bottom_cm : num 20 55 115 170 220
#> $ ph_h2o : num 5.5 5.3 5 5 5.1
#> $ clay_pct : num 18 28 45 42 38
#> $ bs_pct : num 35 25 20 18 20
#> - attr(*, ".internal.selfref")=<pointer: 0x105e256b0>Construindo o PedonRecord (R6 com site +
horizons):
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
#>
#> ── PedonRecord ──
#>
#> Site: id=RJ-1-Itaguai | (-22.8600, -43.7800) | BR | on sedimentos argilosos do
#> Terciario
#> Horizons (5):
#> 1) A 0-20 cm clay=18.0 silt=30.0 sand=52.0 CEC=8.0 pH=5.5 OC=1.5
#> 2) AB 20-55 cm clay=28.0 silt=25.0 sand=47.0 CEC=6.0 pH=5.3 OC=0.6
#> 3) Bt1 55-115 cm clay=45.0 silt=20.0 sand=35.0 CEC=5.5 pH=5.0 OC=0.3
#> 4) Bt2 115-170 cm clay=42.0 silt=22.0 sand=36.0 CEC=4.5 pH=5.0 OC=0.2
#> 5) BC 170-220 cm clay=38.0 silt=24.0 sand=38.0 CEC=4.0 pH=5.1 OC=0.2Antes 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:
# 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")
#> B_textural (SiBCS): TRUE argic (WRB): TRUE
# Atividade da argila (SiBCS Cap 5)
ta <- soilKey::atividade_argila_alta(perfil)
cat("atividade_argila_alta:", ta$passed, "\n")
#> atividade_argila_alta: FALSE
# Saturacao por bases (V%) -- distrofico se V < 50
distr <- soilKey::distrofico(perfil)
cat("distrofico:", distr$passed, "\n")
#> distrofico: TRUEOs tres devem disparar TRUE para um Argissolo distrofico
tipico.
A funcao classify_all() corre os tres sistemas e devolve
um ClassificationResult por sistema:
res <- soilKey::classify_all(perfil, on_missing = "silent")
names(res)
#> [1] "wrb" "sibcs" "usda" "summary"print(res$sibcs)
#>
#> ── ClassificationResult (SiBCS 5a edicao) ──
#>
#> Name: Argissolos Vermelhos Distroficos tipicos, argilosa, moderado, Tmob
#> RSG/Order: Argissolos
#> Evidence grade: A
#>
#> ── Ambiguities
#> - V: Indeterminate -- missing 1 attribute(s): slickensides
#> - E: Indeterminate -- missing 2 attribute(s): al_ox_pct, fe_ox_pct
#> - G: Indeterminate -- missing 1 attribute(s): redoximorphic_features_pct
#> - F: Indeterminate -- missing 1 attribute(s): plinthite_pct
#>
#> ── Missing data that would refine result
#> slickensides, al_ox_pct, fe_ox_pct, redoximorphic_features_pct, plinthite_pct
#>
#> ── Key trace
#> (10 RSGs tested before assignment)
#> 1. ?? -- NA
#> 2. ?? -- NA
#> 3. PV Argissolos Vermelhos -- NA
#> 4. ?? -- NA
#> 5. PVd Argissolos Vermelhos Distroficos -- NA
#> 6. ?? -- NA
#> 7. PVdTp Argissolos Vermelhos Distroficos tipicos -- NA
#> 8. ?? -- NAA descida vai do nivel da Ordem (Argissolos) ate o
Subgrupo, passando pelos discriminantes:
5YR / 2.5YR) ->
Subordem Vermelho-Amareloprint(res$wrb)
#>
#> ── ClassificationResult (WRB 2022) ──
#>
#> Name: Ferralic Cutanic Acrisol (Loamic, Dystric, Ochric, Profondic, Rhodic,
#> Rubic, Chromic)
#> RSG/Order: Acrisols
#> Qualifiers: Ferralic, Cutanic, Loamic, Dystric, Ochric, Profondic, Rhodic,
#> Rubic, Chromic, FALSE, FALSE, FALSE, FALSE, top_cm, bottom_cm, FALSE, top_cm,
#> bottom_cm, FALSE, FALSE, FALSE, FALSE, plinthite_pct, FALSE, plinthite_pct,
#> FALSE, plinthite_pct, TRUE, FALSE, redoximorphic_features_pct, FALSE,
#> redoximorphic_features_pct, FALSE, al_ox_pct, fe_ox_pct,
#> phosphate_retention_pct, volcanic_glass_pct, FALSE, volcanic_glass_pct, FALSE,
#> slickensides, TRUE, FALSE, FALSE, coarse_fragments_pct, FALSE, FALSE,
#> p_mehlich3_mg_kg, FALSE, p_mehlich3_mg_kg, FALSE, FALSE, FALSE, FALSE, TRUE,
#> FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE,
#> coarse_fragments_pct, TRUE
#> Evidence grade: A
#>
#> ── Ambiguities
#> - AT: Indeterminate -- missing 1 attribute(s): p_mehlich3_mg_kg
#> - TC: Indeterminate -- missing 3 attribute(s): artefacts_pct,
#> geomembrane_present, technic_hardmaterial_pct
#> - CR: Indeterminate -- missing 1 attribute(s): permafrost_temp_C
#> - LP: Indeterminate -- missing 1 attribute(s): coarse_fragments_pct
#> - VR: Indeterminate -- missing 1 attribute(s): slickensides
#> - SC: Indeterminate -- missing 1 attribute(s): ec_dS_m
#> - PZ: Indeterminate -- missing 2 attribute(s): al_ox_pct, fe_ox_pct
#> - PT: Indeterminate -- missing 1 attribute(s): plinthite_pct
#> - ST: Indeterminate -- missing 1 attribute(s): redoximorphic_features_pct
#> - DU: Indeterminate -- missing 1 attribute(s): duripan_pct
#> - GY: Indeterminate -- missing 1 attribute(s): caso4_pct
#> - CL: Indeterminate -- missing 1 attribute(s): caco3_pct
#>
#> ── Missing data that would refine result
#> p_mehlich3_mg_kg, artefacts_pct, geomembrane_present, technic_hardmaterial_pct,
#> permafrost_temp_C, coarse_fragments_pct, slickensides, ec_dS_m,
#> redoximorphic_features_pct, al_ox_pct, fe_ox_pct, phosphate_retention_pct,
#> volcanic_glass_pct, plinthite_pct, top_cm, bottom_cm, duripan_pct, caso4_pct,
#> caco3_pct
#>
#> ── Key trace
#> (25 RSGs tested before assignment)
#> 1. HS Histosols -- failed
#> 2. AT Anthrosols -- NA (1 attrs missing)
#> 3. TC Technosols -- NA (3 attrs missing)
#> 4. CR Cryosols -- NA (1 attrs missing)
#> 5. LP Leptosols -- NA (1 attrs missing)
#> 6. SN Solonetz -- failed
#> 7. VR Vertisols -- NA (1 attrs missing)
#> 8. SC Solonchaks -- NA (1 attrs missing)
#> 9. GL Gleysols -- failed (1 attrs missing)
#> 10. AN Andosols -- failed (4 attrs missing)
#> 11. PZ Podzols -- NA (2 attrs missing)
#> 12. PT Plinthosols -- NA (1 attrs missing)
#> 13. PL Planosols -- failed
#> 14. ST Stagnosols -- NA (1 attrs missing)
#> 15. NT Nitisols -- failed
#> 16. FR Ferralsols -- failed
#> 17. CH Chernozems -- failed (2 attrs missing)
#> 18. KS Kastanozems -- failed (2 attrs missing)
#> 19. PH Phaeozems -- failed (2 attrs missing)
#> 20. UM Umbrisols -- failed
#> 21. DU Durisols -- NA (1 attrs missing)
#> 22. GY Gypsisols -- NA (1 attrs missing)
#> 23. CL Calcisols -- NA (1 attrs missing)
#> 24. RT Retisols -- failed
#> 25. AC Acrisols -- PASSEDWRB devolve o RSG mais qualificadores (em ordem canonica): Acrisol Dystric Cutanic (caracter argico + V baixa + presenca de revestimentos argilosos).
print(res$usda)
#>
#> ── ClassificationResult (USDA Soil Taxonomy) ──
#>
#> Name: Typic Kandiudults
#> RSG/Order: Ultisols
#> Evidence grade: A
#>
#> ── Missing data that would refine result
#> permafrost_temp_C, al_ox_pct, fe_ox_pct, phosphate_retention_pct, slickensides,
#> site$soil_moisture_regime
#>
#> ── Key trace
#> (7 RSGs tested before assignment)
#> 1. ?? -- NA
#> 2. ?? -- NA
#> 3. HC Udults -- NA
#> 4. ?? -- NA
#> 5. HCC Kandiudults -- NA
#> 6. ?? -- NA
#> 7. HCCD Typic Kandiudults -- NAUSDA-ST devolve a ordem (ate o nivel atualmente disponivel): Ultisol (B argilico + saturacao por bases baixa em todo o solum).
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)
)
#> Sistema
#> 1 SiBCS 5a
#> 2 WRB 2022
#> 3 USDA-ST 13a
#> Classe
#> 1 Argissolos Vermelhos Distroficos tipicos, argilosa, moderado, Tmob
#> 2 Ferralic Cutanic Acrisol (Loamic, Dystric, Ochric, Profondic, Rhodic, Rubic, Chromic)
#> 3 Typic Kandiudults
#> EvidGrade
#> 1 A
#> 2 A
#> 3 AEsses 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.
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.
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:
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.
Para qualquer coordenada do mundo, lookup_soilgrids()
(v0.9.48) le direto do endpoint COG da ISRIC sem download:
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")| 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.