{
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
Baixar o script desta prática (.R)
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")