{
library(sf)
library(terra)
library(ggspatial)
library(ggplot2)
library(dplyr)
}Construção de mapas temáticos com o R
Pesquisador contribuidor
Esta prática foi gentilmente preparada pelo pesquisador parceiro Igor Henrique Alves do Nascimento.
Mestre pelo Programa de Pós-Graduação em Biologia de Vertebrados pela Pontifícia Universidade Católica de Minas Gerais (PUC Minas - 2024) e integrante do Laboratório de Genética da Conservação da mesma instituição. Bacharel e Licenciado em Ciências Biológicas pela PUC Minas (2018-2022). Atualmente é doutorando em Biodiversidade e Meio Ambiente pela PUC Minas, com ênfase em ecologia do DNA ambiental em rios neotropicais. Possui interesse pelas áreas de Genética da Conservação, Biologia Molecular e Bioinformática.
Contextualização
A construção de mapas é fundamental para análises espaciais, permitindo representar e interpretar informações geográficas de forma visual e simplificada.
Para elaborar um mapa é necessário integrar dados espaciais (Shapefiles [.shp], rasters [.tif], tabelas [.csv]) a um sistema de informações geográficas (SIG), onde será possível tornar o mapa não apenas informativo, mas esteticamente agradável.
Sistemas de Referências
Os sistemas de coordenadas geográficas são essenciais para localizar pontos na superfície geóide da terra. Quando representado a superfície terrestre em um plano (ex: mapas), é necessário aplicar uma projeção cartográfica específica para sua área de estudo, levando em consideração as deformações de área, formato ou distâncias de cada sistema.
EPSG
Cada sistema de referência é padronizado por um código EPSG (European Petroleum Survey Group), que identifica e padroniza os sistemas de coordenadas. Por exemplo:
EPSG:4326 - WGS84 (Usado globalmente e em GPS)
EPSG:4674 - SIRGAS 2000 (Oficial do Brasil)
EPSG:31983 - UTM Zona 23S, baseado em SIRGAS 2000 (Utilizado no Sudeste Brasileiro)
Prática
Carregar pacotes necessários
Definindo seu diretório de trabalho
Para cada projeto, sempre crie uma pasta onde você vai salvar todos arquivos e scripts, assim você mantém seu trabalho sempre organizado. No comando abaixo, coloque dentro das aspas o caminho para o seu diretório de trabalho.
::: Sempre utilize a tecla
TABpara autocompletar os caminhos a partir do ~ ou / (ou ****, caso no windows). Para isso, coloque o cursor (|, a barra onde sua digitação aparece) entre as ” “.
getwd()
setwd("")
# utilize o tab para autocompletar com o cursor entre as aspasObtenção de dados brutos
Existem diversos bancos de dados de informação cartográfica com shapefiles e raster de diversos locais e temas. Para MG por exemplo, podemos acessar o portal da Secretaria de Estado de Meio Ambiente e Desenvolvimento Sustentável (SEMAD) através do banco de dados IDE-Sisema.
Nesse banco é possível baixar arquivos .shp de diversos tipos, para o estado de MG. Para esta prática iremos utilizar a base de dados:
Restrição Ambiental > Áreas Protegidas > Unidades de Conservação Estaduais
Limites > Unidade da Federação > Limite de Minas Gerais
Em seguida, você poderá carregar os dados para o R
Dados para está prática
Baixar e descompactar shapes
# abixar aruivos
download.file("https://github.com/heronoh/bioinfo/blob/main/aulas/r/arquivos/maps.tar.gz",
destfile = "maps.tar.gz", mode = "wb")
#descompactar arquivos ----
untar("maps.tar.gz", exdir = ".")Ler arquivos
# MG
minas <- st_read("ide_1101_mg_unidade_federacao_pol.shp")Reading layer `ide_1101_mg_unidade_federacao_pol' from data source
`/home/heron/prjcts/bioinfo/aulas/r/arquivos/maps/ide_1101_mg_unidade_federacao_pol.shp'
using driver `ESRI Shapefile'
Simple feature collection with 1 feature and 2 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: -51.04664 ymin: -22.92172 xmax: -39.85605 ymax: -14.23301
Geodetic CRS: SIRGAS 2000
plot(minas)# Parques
# uc_minas <- st_read("/PASTA/SUA_UC.shp")
uc_minas <- st_read("ide_2010_mg_unidades_conservacao_estaduais_pol.shp")Reading layer `ide_2010_mg_unidades_conservacao_estaduais_pol' from data source
`/home/heron/prjcts/bioinfo/aulas/r/arquivos/maps/ide_2010_mg_unidades_conservacao_estaduais_pol.shp'
using driver `ESRI Shapefile'
Simple feature collection with 95 features and 12 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -49.86694 ymin: -22.92176 xmax: -39.93025 ymax: -14.46227
Geodetic CRS: SIRGAS 2000
plot(uc_minas)Note que o arquivo de UCs possui mais de uma área dividida em diversas categorias.
Vamos selecionar apenas a área de interesse:
uc_minas$categoria %>% unique()[1] "PAR" "APA" "REBIO" "FLOE" "MONA" "ESEC" "RVS" "RDS"
# é possível filtrar por qualquer valor desejado, exemplos:
uc_interesse <- uc_minas %>%
dplyr::filter(categoria == "PAR")
# dplyr::filter(bioma == "Mata Atlantica")
# dplyr::filter(nome == "Parque Estadual da Serra do Cipo")Com todos os .shp selecionados, precisamos converter as camadas para o mesmo sistema de coordenadas:
minas_wgs <- sf::st_transform(x = minas,
crs = 4326)
uc_minas_wgs <- sf::st_transform(x = uc_minas,
crs = 4326)
uc_int_wgs <- sf::st_transform(x = uc_interesse,
crs = 4326)Plotar o mapa final
Primeiro vamos visualizar todas as UCs, classificadas por bioma.
Em seguida, visualize sua área de interesse, de acordo com o filter realizado anteriormente.
ggplot()+
geom_sf(data = uc_int_wgs,
aes(fill = bioma))+
scale_fill_viridis_d(option = "turbo")+
geom_sf(data = minas_wgs,
fill = "transparent")+
theme_minimal()+
theme(axis.line = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
plot.background = element_rect(fill = "white",
color = NA),
panel.background = element_rect(fill = "white",
color = NA),
panel.border = element_blank())Trabalhando com Rasters
Rasters são imagens pixeladas, que trazem informações mais complexas para o geoprocessamento.
Cada pixel da imagem possui tamanhos pré-definidos, de acordo com a metodologia abordada em sua produção. Quanto menor o tamanho dos pixels, mais detalhada a imagem será, por exemplo rasters de 30 metros por pixel possuem alta resolução.
Visualizando rasters
Utilizaremos dados de temperatura média anual, disponível na plataforma WorldClim.
Você pode baixar o arquivo recortado para o estado de Minas Gerais aqui.
raster_temp <- terra::rast("wc2.1_30s_bio_1_cortado.tif")- Para visualizar o raster, antes é necessário transformá-lo em um dataframe
raster_temp_df <- as.data.frame(x = raster_temp,
xy = TRUE)
# renomear a coluna de valores do raster
names(raster_temp_df)[3] <- "value"Plotar o mapa temático final
- Vamos criar um mapa da bacia do Rio Doce, com os rios e dados de ocorrência de uma espécie de peixe, disponíveis no SpeciesLink.
# ler shp
bacia <- st_read("bacia_doce.shp")Reading layer `bacia_doce' from data source
`/home/heron/prjcts/bioinfo/aulas/r/arquivos/maps/bacia_doce.shp'
using driver `ESRI Shapefile'
Simple feature collection with 1 feature and 4 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: -43.82564 ymin: -21.17273 xmax: -39.67964 ymax: -17.76581
Geodetic CRS: WGS 84
rios <- st_read("rios_intersec.shp")Reading layer `rios_intersec' from data source
`/home/heron/prjcts/bioinfo/aulas/r/arquivos/maps/rios_intersec.shp'
using driver `ESRI Shapefile'
Simple feature collection with 14245 features and 16 fields
Geometry type: MULTILINESTRING
Dimension: XY
Bounding box: xmin: -43.80275 ymin: -21.16349 xmax: -39.79937 ymax: -17.79984
Geodetic CRS: WGS 84
# definir projeção
bacia_wgs <- st_set_crs(x = bacia,
value = 4326)
# reprojetar para coordenada certa
rios_wgs <- st_transform(x = rios,
crs = 4326)
# Carregar dados a partir de um .csv
ocur_peixes <- read.csv("banco_final_tricho.csv")
# transformar csv em shp
ocur_peixe_shp <- st_as_sf(ocur_peixes,
coords = c("long",
"lat"), crs = 4326)
# cortar dados apenas para a área de interesse
peixes_inter <- st_intersection(ocur_peixe_shp, bacia_wgs)
# plotar o mapa
ggplot()+
geom_raster(data = raster_temp_df,
aes(x = x,
y = y,
fill = value))+
scale_fill_gradient(low = "blue", high = "pink", name = "Temperatura (°C)")+
geom_sf(data = bacia_wgs,
color = "black",
fill = "transparent") +
geom_sf(data = rios_wgs,
color = "cyan") +
geom_sf(data = peixes_inter,
color = "grey40") +
annotation_north_arrow(location = "tr",
which_north = "true",
# pad_x = unit(8, "cm"),
# pad_y = unit(5, "cm"),
style = north_arrow_nautical()) + # elemento obrigatorio
annotation_scale(location = "br",
# pad_x = ,
# pad_y = ,
width_hint = 0.3) +
theme_void() +
labs(title = "Temperatura Média Anual para o ano de 2020")