Universidade Federal de Santa Maria - UFSM

Departamento de Física

Prof. Jônatan Tatsch

Aluno Roilan Hernandez Valdes


1. Tipos e propriedades do solo da bacia

1.1. Mapas de solo

Os mapas de solos ou levantamentos pedológicos fornecem informações sobre à formação e distribuição geográfica dos diferentes solos de uma região. Nesses mapas as manchas ou delineamentos representam os diversos tipos de solos. A confecção desses mapas é baseada na identificação dos solos de uma região por equipes de pedólogos que decidem a melhor forma de agrupar e separar os tipos de solos por meio do exame da morfologia do solo, de mapas cartográficos e fotos aéreas (Lepsch, 2002).

As manchas de solos ou unidades de mapeamento raramente têm limites bem definidos. As vezes é impossível separar diferentes tipos de solos e por isso a descrição das classes de solo que ocorrem numa área do mapa é denominada associação de solos. A associação dá indicação da posição topográfica ocupada na paisagem, por exemplo, os compartimentos mais elevados das colinas ocupadas por Latossolos, os Argissolos nas partes medianas e os Neossolos nas porções inferiores das encostas.

Os mapas pedológicos são classificados quanto ao grau de detalhamento (ou tamanho da escala), em ordem decrescente como: a)detalhados (pequenas áreas), b) de reconhecimento, c) exploratórios, d) generalizados e e) esquemáticos (grandes áreas).

1.2. Fonte de dados

A estrutura e textura do solo são parâmetros essenciais para simulação hidrológica. Atualmente há uma diversidade de mapas de solos disponíveis com informações das propriedades do solo. Entre os mapas com cobertura global e com informações quantitativas sobre as propriedades do solos destacam-se:

1.3. Parâmetros hídricos do solo

No Modelo Hidrológico Distribuído da Biosfera (DBHM) as propriedades do solo necessárias são:

  • potencial matricial de saturação, \(\psi_{s}(m)\);
  • condutividade hidráulica de saturação, \(K_{s}(m/s)\);
  • porosidade, \(\theta_{s}(m^3/m^3)\);
  • parâmetro de forma da curva de retenção de água no solo, \(b(-)\), algumas vezes o seu inverso, \(1/b\), é chamado de índice de distribuição do tamanho de poros;

Essas informações são armazenadas em uma tabela disponível no arquivo ascii Texture.DAT, elaborada a partir das informações de textura do solo dos levantamentos pedológicos. Esse arquivo está disponível na página do curso no Moodle. Ele deve ser baixado e salvo no diretório ../data_base.

Existem diversas fórmulas empíricas para estimar os parâmetros hídricos do solo a partir de propriedades materiais do solo. Essas equações são chamadas de funções de pedotransferência. Para construção da tabela Texture.DAT foram utilizadas as equações de Cosby et al. (1984) que permitem estimar esses parâmetros a partir da porcentagem de argila (\(P_{ARGILA}\)), areia (\(P_{AREIA}\)) e silte (\(P_{SILTE}\)) do solo seco:

\[ \begin{aligned} \psi_{s}=-0.01\times10^{(1.54-(0.0095\times P_{AREIA})+(0.0063\times P_{SILTE}))} \\ K_{s}=7.05556 \times 10^{-6}\times 10^{(-0.6+(0.0126\times P_{AREIA}) - 0.0064\times P_{ARGILA})} \\ \theta_{s}=(50.5 - (0.142\times P_{AREIA}) - (0.037\times P_{ARGILA}))\\ b=3.10+0.157\times P_{ARGILA} \\ \end{aligned} \]

A opção default de mapa de solo do DBHM é o FAO/UNESCO Soil Map of the World. O mapa de solos do mundo da FAO-UNESCO, na escala de 1:5.000.000, está na projeção geográfica (latlon ou longlat).

As primeiras e as últimas linhas da tabela de parâmetros do solo Texture.DAT são mostradas abaixo. Um resumo estatístico das propriedades hídricas dos solos globais estimadas a partir das equações de Cosby et al. (1984) é mostrado a seguir.

require(knitr)
texture <- read.table("../data_base/Texture.DAT")
names(texture) <- c("snum","poros","psis","ks","bexp","slp","yield")
kable(texture[1:5, ], format = "markdown", align = "c")
snum poros psis ks bexp slp yield
1 0.4890 -0.2309868 9.0e-07 8.17 0.3193533 0.1293500
2 0.4575 -0.3568617 2.2e-06 2.91 0.1245232 0.2407031
3 0.4890 -0.7585776 9.0e-07 4.50 0.0950675 0.2035375
4 0.4890 -0.7585776 9.0e-07 2.91 0.1866606 0.2183750
5 0.4890 -0.7585776 9.0e-07 2.91 0.2548026 0.2183750
kable(texture[nrow(texture):(nrow(texture)-5), ], 
      format = "markdown", 
      align = "c")
snum poros psis ks bexp slp yield
4931 6998 0.447 -0.2309868 3e-06 8.17 0.2055172 0.202625
4930 6997 0.447 -0.2309868 3e-06 8.17 0.2055172 0.202625
4929 6723 0.489 -0.7585776 9e-07 2.91 0.1434993 0.218375
4928 6722 0.489 -0.2309868 9e-07 8.17 0.0399680 0.070000
4927 6721 0.489 -0.7585776 9e-07 2.91 0.0474465 0.218375
4926 6720 0.489 -0.2309868 9e-07 8.17 0.3065021 0.129350
## convertendo ks de m/s para mm/h
texture$ks <- texture$ks*3600*1000
kable(summary(texture), , format = "markdown", align = "c")
snum poros psis ks bexp slp yield
Min. : 1 Min. :0.3630 Min. :-0.75858 Min. : 3.318 Min. : 2.910 Min. :0.03990 Min. :0.0700
1st Qu.:1556 1st Qu.:0.4638 1st Qu.:-0.75858 1st Qu.: 3.318 1st Qu.: 2.910 1st Qu.:0.06238 1st Qu.:0.1739
Median :3947 Median :0.4890 Median :-0.35686 Median : 3.318 Median : 2.910 Median :0.11572 Median :0.2184
Mean :3600 Mean :0.4714 Mean :-0.45918 Mean : 8.721 Mean : 4.672 Mean :0.13326 Mean :0.2019
3rd Qu.:5308 3rd Qu.:0.4890 3rd Qu.:-0.23099 3rd Qu.: 6.712 3rd Qu.: 7.680 3rd Qu.:0.18666 3rd Qu.:0.2186
Max. :6998 Max. :0.4890 Max. :-0.03715 Max. :50.760 Max. :13.245 Max. :0.37139 Max. :0.2722

A variável SNUM (Número da unidade de mapeamento do solo, tradução do termo Soil Mapping Unit Number) será usada para associar os parâmetros do solo na tabela ao raster gerado a partir do arquivo shapefile de solos da FAO.

1.4. Pré-requisitos

1.4.1. Instalação de softwares

Bibliotecas do Linux (OPCIONAL)

Alguns dados pedológicos são disponibilizadas em arquivos no formato usado pelo Microsoft Access. Para converter os arquivos na extensão .mdb podemos usar um script em Python que converte as tabelas contidas na base de dados .mdb para .csv. Mas primeiro instalamos o programa mdbtools.

  $ apt-get update 
  $ apt-get install mdbtools
  

Copie o texto abaixo e cole em um arquivo texto e salve-o como AccessDump.py.

  #!/usr/bin/env python
  #
  # AccessDump.py
  # A simple script to dump the contents of a Microsoft Access Database.
  # It depends upon the mdbtools suite:
  #   http://sourceforge.net/projects/mdbtools/
   import sys, subprocess # the subprocess module is new in python v 2.4
   DATABASE = sys.argv[1]
   # Get the list of table names with "mdb-tables"
   table_names = subprocess.Popen(["mdb-tables", "-1", DATABASE], 
                                  stdout=subprocess.PIPE).communicate()[0]
   tables = table_names.split('\n')
   # Dump each table as a CSV file using "mdb-export",
   # converting " " in table names to "_" for the CSV filenames.
   for table in tables:
   if table != '':
           filename = table.replace(" ","_") + ".csv"
           file = open(filename, 'w')
           print("Dumping " + table)
           contents = subprocess.Popen(["mdb-export", DATABASE, table],
                                       stdout=subprocess.PIPE).communicate()[0]
           file.write(contents)
           file.close()

Para extrair as tabelas do arquivo .mdb em arquivos textos com valores separados por vírgula (csv) digite no terminal linux:

  $ chmod +x AccessDump.py
  $ ./AccessDump.py arquivo.mdb
  
Pacotes do R (OPCIONAL)
install.packages(pkgs = "gdalUtils", dependencies = TRUE)
install.packages(pkgs = "plotrix", dependencies = TRUE)
install.packages(pkgs = "aqp", dependencies = TRUE)
install.packages(pkgs = "dismo", dependencies = TRUE)
install.packages(pkgs = "pixmap", dependencies = TRUE)
install.packages(pkgs = "colorRamps", dependencies = TRUE)
install.packages(pkgs = "quantregForest", dependencies = TRUE)
install.packages(pkgs = "plotKML", 
                 dependencies = TRUE,
                 repos="http://R-Forge.R-project.org") 

1.4.2. Configurações básicas no R

Vamos carregar os pacotes necessários e definir algumas variáveis com a localização dos diretórios e dados, similar ao realizado nas etapas anteriores.

## carregando pacotes necessários
pcks <- c("raster", "rgdal", "RSAGA", "adehabitat", "maptools", "sp", "fields", "stringr", "lattice", "rasterVis", "knitr", "RColorBrewer")
## looping no nomes dos pacotes para carregá-los
l_load_pcks <- sapply(X = pcks, 
                      FUN = require, 
                      character.only = T)
l_load_pcks
      raster        rgdal        RSAGA   adehabitat     maptools 
        TRUE         TRUE         TRUE         TRUE         TRUE 
          sp       fields      stringr      lattice    rasterVis 
        TRUE         TRUE         TRUE         TRUE         TRUE 
       knitr RColorBrewer 
        TRUE         TRUE 

Definindo opções, nome do usuário, diretório de trabalho (WD) e carregando funções armazenadas em scripts.


NOTA: altere o parâmetro username de acordo com a sua configuração

## configurando opção para mostrar barra de progresso durante operações com raster
rasterOptions(progress = "text")
## defina seu nome de usuario que definira o caminho até o diretório scripts
user_name <- system("echo $USER", intern =  TRUE )
#user_name <- "pqgfapergs1"
## caminho para o diretório do DBHM
## substitui a string user pela valor da variável user_name
dbhm_path <- gsub(pattern = "user",
                  replacement = user_name, 
                  x = "/home/user/DBHM/")
dbhm_path
[1] "/home/hidro2roilan/DBHM/"
## definindo diretório de trabalho (combina my_path e caminho até subdir scripts)
script_dir <- paste0(dbhm_path, "data_process/geo_data/scripts")
script_dir
[1] "/home/hidro2roilan/DBHM/data_process/geo_data/scripts"
## define diretório de trabalho
setwd(script_dir)
## verifica diretório de trabalho configurado
getwd()
[1] "/home/hidro2roilan/DBHM/data_process/geo_data/scripts"
## script para escrita no formato ascii DBHM
source("raster2ascii_dbhm.R")
## criando vetor com 24 cores
cores <- unlist(c(t(sapply(c("Paired", "Set3", "Pastel1"), 
                           function(x) brewer.pal(12, x))
                    )
                  )
                )
cores
 [1] "#A6CEE3" "#1F78B4" "#B2DF8A" "#33A02C" "#FB9A99" "#E31A1C" "#FDBF6F"
 [8] "#FF7F00" "#CAB2D6" "#6A3D9A" "#FFFF99" "#B15928" "#8DD3C7" "#FFFFB3"
[15] "#BEBADA" "#FB8072" "#80B1D3" "#FDB462" "#B3DE69" "#FCCDE5" "#D9D9D9"
[22] "#BC80BD" "#CCEBC5" "#FFED6F" "#FBB4AE" "#B3CDE3" "#CCEBC5" "#DECBE4"
[29] "#FED9A6" "#FFFFCC" "#E5D8BD" "#FDDAEC" "#F2F2F2"

Vamos definir a bacia de interesse através da variável basin_name.


NOTA: altere o parâmetro basin_name de acordo com a bacia de estudo

## defina o nome de sua bacia
# basin_name <- "mogu"
# basin_name <- "vacacai"
  basin_name <- "pauliceia"

1.5. Download do mapa de solos da FAO

O mapa de solos da FAO-UNESCO, Versão 3.6 de Janeiro de 2003, está disponível por meio do sistema geonetwork da FAO. A seguir vamos fazer download do arquivo shapefile do mapa de solos da FAO-UNESCO e salvá-lo no diretório ../data_base.

fao_link <- "http://www.fao.org/geonetwork/srv/en/resources.get?id=14116&fname=DSMW.zip&access=private"
## nome do arquivo de destino
zip_file <- "../data_base/DSMW.zip"
## download do arquivo zip com mapa e dados do solo
ifelse(file.exists(zip_file),print("Downloaded"),download.file(fao_link, destfile = zip_file))
## diretório para extrair o arquivo compactado
extract_dir <- gsub("\\.zip","",zip_file)
## descompactando arquivo
unzip(zip_file, exdir = extract_dir,overwrite = TRUE)

1.6. Rasterização do mapa de solos

As informações da tabela do arquivo shapefile estão descritas no arquivo ../data_base/DSMW/readme.doc. Vamos então ver como carregar estes dados no R e gerar o arquivo raster com tipo de solo para a bacia.

Os mapa de solos da FAO não vem com a projeção definida. O modelo de elevação do terreno (MDET), arquivo raster ../data_base/basin/mdet_basin.tif, na projeção geográfica pode ser usado como referência de domínio espacial.

mdet_basin_ll_file <- gsub("basin", basin_name, "../data_base/basin/mdet_basin.tif")
mdet_basin_ll <- raster(mdet_basin_ll_file)
mdet_basin_ll
class       : RasterLayer 
dimensions  : 85, 75, 6375  (nrow, ncol, ncell)
resolution  : 0.0008333333, 0.0008333333  (x, y)
extent      : -47.66, -47.5975, -21.67417, -21.60333  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : /home/hidro2roilan/DBHM/data_process/geo_data/data_base/pauliceia/mdet_pauliceia.tif 
names       : mdet_pauliceia 
values      : 566, 752  (min, max)

Para visualizarmos os que cobrem a bacia vamos carregar o polígono de contorno da bacia.

basin_alta_pol_file <- gsub("basin", basin_name, "../softs/TauDEM-master/basin/mascara_bacia_alta_pol.shp")
basin_alta_pol <- shapefile(basin_alta_pol_file)
basin_alta_pol
class       : SpatialPolygonsDataFrame 
features    : 1 
extent      : -1401.52, 2298.48, -1622.855, 2877.145  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=-21.64 +lon_0=-47.63 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs 
variables   : 1
names       : DN 
min values  :  1 
max values  :  1 
basin_alta_pol_ll <- spTransform(x = basin_alta_pol, CRSobj = CRS(projection(mdet_basin_ll)))
basin_alta_pol_ll
class       : SpatialPolygonsDataFrame 
features    : 1 
extent      : -47.64356, -47.60776, -21.65459, -21.61412  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 1
names       : DN 
min values  :  1 
max values  :  1 

Vamos importar o shapefile de solos da FAO e recortá-lo usando a extent do raster mdet_basin.tif como referência e definir sua projeção como geográfica.

## importando shapefile de solos da FAO
soil_fao_ll <- shapefile("../data_base/DSMW/DSMW.shp")
 ## recortando para o domínio do mdet em projeção geográfica
 soil_fao_basin_ll <-  crop(x = soil_fao_ll, y = mdet_basin_ll)
  ## definindo projeção dos polígonos de solos recortados
  proj4string(soil_fao_basin_ll) <- projection(mdet_basin_ll)
   soil_fao_basin_ll  
class       : SpatialPolygonsDataFrame 
features    : 1 
extent      : -47.66, -47.5975, -21.67417, -21.60333  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 12
names       : SNUM, FAOSOIL, DOMSOI, PHASE1, PHASE2, MISCLU1, MISCLU2, PERMAFROST, CNTCODE, CNTNAME,  SQKM, COUNTRY 
min values  : 5467,  Fr1-3a,     Fr,     NA,     NA,       0,       0,          0,      21,      BR, 34710,  BRAZIL 
max values  : 5467,  Fr1-3a,     Fr,     NA,     NA,       0,       0,          0,      21,      BR, 34710,  BRAZIL 
   ## classe do objeto resultante da leitura do shapefile
   class(soil_fao_basin_ll)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"

As informações da tabela do arquivo shapefile podem ser visualizadas acessando os dados do SpatialPolygonsDataFrame.

kable(head(soil_fao_basin_ll@data), format = "markdown", align = "c")
SNUM FAOSOIL DOMSOI PHASE1 PHASE2 MISCLU1 MISCLU2 PERMAFROST CNTCODE CNTNAME SQKM COUNTRY
29902 5467 Fr1-3a Fr NA NA 0 0 0 21 BR 34710 BRAZIL

Vamos criar uma variável do tipo factor a partir da variável soil_fao_basin_ll@data$SNUM. Essa transformação é conveniente para convertê-la em uma variável categórica (ao invés de numérica).

## cria váriavel categórica (fator), para melhor visualização
soil_fao_basin_ll@data$SNUM_fator <- as.factor(soil_fao_basin_ll@data$SNUM)
## número de unidades de mapeamento de solo (SNUM)
nc <- length(unique(soil_fao_basin_ll@data$SNUM))
## sorteando cores para plot de tipo de solos
cores_1 <- sample(cores, nc)
## spatialplot de SpatialPolygonsDataFrame
spplot(obj = soil_fao_basin_ll, 
       zcol = "SNUM_fator", 
       col.regions = cores_1,
       sp.layout = list("sp.polygons", 
                        col = 1, 
                        lwd = 2, 
                        basin_alta_pol_ll)
       )

Para o DBHM é necessário um raster com os mesmos atributos espaciais dos arquivos ascii gerados anteriormente, como por exemplo o ../wsdem_basin.asc. Para isso precisamos projetar o mapa de solos no projeção Azimutal de Área Equivalente de Lambert (LAEA) e depois convertê-lo do formato vetorial (polígonos) para o formato raster. O que poder ser feito com a função rasterize do pacote raster.

## nome do arquivo ascii
wsdem_file <- gsub("basin",basin_name,"../wsdem_basin.asc")
 ## raster do arquivo ascii do medt da bacia
 wsdem <- raster(wsdem_file)
  ## obtém a string da projeção a partir do shapefile do caminho a montante
  ## mais distante do exutório da bacia
  laea <- proj4string(shapefile(gsub("basin", basin_name, "../longestPath_basin.shp")))
   ## trsnaformação da projeção de geográfica para LAEA
   soil_fao_basin_laea <- spTransform(x = soil_fao_basin_ll, CRSobj = CRS(laea))
    soil_fao_basin_laea
class       : SpatialPolygonsDataFrame 
features    : 1 
extent      : -3101.52, 3359.98, -3799.51, 4076.846  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=-21.64 +lon_0=-47.63 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs 
variables   : 13
names       : SNUM, FAOSOIL, DOMSOI, PHASE1, PHASE2, MISCLU1, MISCLU2, PERMAFROST, CNTCODE, CNTNAME,  SQKM, COUNTRY, SNUM_fator 
min values  : 5467,  Fr1-3a,     Fr,     NA,     NA,       0,       0,          0,      21,      BR, 34710,  BRAZIL,       5467 
max values  : 5467,  Fr1-3a,     Fr,     NA,     NA,       0,       0,          0,      21,      BR, 34710,  BRAZIL,       5467 
      ## define projeção do wsdem
      projection(wsdem) <- laea
       ## rasteriza a variável SNUM (Soil Mapping Unit Number) dos polígonos 
       ## do mapa de solo usando os atributos espaciais do wsdem 
       rasterOptions(progress = "")
       soil_fao_basin_laea <- rasterize(x = soil_fao_basin_laea , 
                                        y = wsdem, 
                                        field = "SNUM")
         soil_fao_basin_laea
class       : RasterLayer 
dimensions  : 14, 12, 168  (nrow, ncol, ncell)
resolution  : 500, 500  (x, y)
extent      : -2901.52, 3098.48, -3322.855, 3677.145  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=-21.64 +lon_0=-47.63 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs 
data source : in memory
names       : layer 
values      : 5467, 5467  (min, max)
         ## range do Número de unidades de mapeamento do solo na bacia
         ncolors <- length(sort(unique(soil_fao_basin_laea[])))
          plot(soil_fao_basin_laea, col = cores_1)
          plot(basin_alta_pol, add = TRUE, lwd = 2)

O raster de tipo de solo deve conter valores apenas para a área da bacia, então vamos carregar o raster de fração de área dentro da bacia e aplicá-lo como máscara.

## raster do arquivo ascii da fração de área dentro da bacia
frac <- raster(gsub("wsdem","frac",wsdem_file))
fracNA <- frac; fracNA[frac == 0] <- NA
## aplicando mascara a bacia
soil <- mask(soil_fao_basin_laea, fracNA)
soil   
class       : RasterLayer 
dimensions  : 14, 12, 168  (nrow, ncol, ncell)
resolution  : 500, 500  (x, y)
extent      : -2901.52, 3098.48, -3322.855, 3677.145  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=-21.64 +lon_0=-47.63 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs 
data source : in memory
names       : layer 
values      : 5467, 5467  (min, max)

A distribuição da frequência de ocorrência dos solos pode ser verificado com a função freq.

## frequência de ocorrência dos tipos de solos
soil_freq <- data.frame(freq(soil, useNA = "no"))
soil_freq$freq <- round((soil_freq$count/sum(soil_freq$count))*100, 1)
kable(soil_freq, format = "markdown", align = "c")
value count freq
5467 64 100

O número da unidade de mapeamento de solo mais frequente é o 5467 com 100 % da área da bacia.

Para salvar o arquivo ascii dos tipos de solo da FAO para bacia usamos a função raster2ascii_dbhm conforme feito nas etapas anteriores do DBHM-GIS.

soil_file <- paste0("../soil_",basin_name,".asc")
raster2ascii_dbhm(r = soil, arqname = soil_file)

Para melhor visualização das categorias de solo na bacia vamos criar uma tabela de atributos com o código da classe de solo.

## Função para definir uma camada como variável categórica
soil <- ratify(soil)
soil_rat <- levels(soil)[[1]]
## número de categorias de solo
nc <- length(sort(unique(soil[])))
## criando tabela de atributos para dados categóricos
soil_rat$class <- as.character(c(t(levels(soil)[[1]])))
levels(soil) <- soil_rat
soil
class       : RasterLayer 
dimensions  : 14, 12, 168  (nrow, ncol, ncell)
resolution  : 500, 500  (x, y)
extent      : -2901.52, 3098.48, -3322.855, 3677.145  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=-21.64 +lon_0=-47.63 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs 
data source : in memory
names       : layer 
values      : 5467, 5467  (min, max)
attributes  :
   ID class
 5467  5467
## plot de variáveis categóricas
levelplot(soil, col.regions = cores_1)

2. Estrutura de diretórios e dados gerados

3. Lista de verificação de arquivos

4. Referências

LEPSCH, Igo F. Formação e Conservação Dos Solos. Ofina de Textos. São Paulo. 2002.