Universidade Federal de Santa Maria - UFSM
Departamento de Física
Prof. Jônatan Tatsch
Aluno Roilan Hernandez Valdes
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).
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:
No Modelo Hidrológico Distribuído da Biosfera (DBHM) as propriedades do solo necessárias são:
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.
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
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")
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"
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)
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)
soil.asc raster com número das unidades de mapeamento de solo da FAO, com -9999 (NA) atribuído para células fora da área da bacia;
Texture.DAT tabela de parâmetros hídricos do solo associada a cada número da unidade de mapeamento do solo;
LEPSCH, Igo F. Formação e Conservação Dos Solos. Ofina de Textos. São Paulo. 2002.