Oficina sobre Mapas

15/06/2022

Curso-R: Beatriz Milz e Julio Trecenti

Carregar os pacotes

library(ggplot2)

Download dos dados

# para criar a pasta de download
fs::dir_create("dados/")

# URL para baixar
url_sigbm <- "https://app.anm.gov.br/SIGBM/Publico/ClassificacaoNacionalDaBarragem/ExportarExcel"

# Baixar o  arquivo excel
httr::POST(url = url_sigbm, httr::write_disk("dados/sigbm.xlsx"))

Importar os dados brutos

sigbm_bruto <- readxl::read_xlsx("dados/sigbm.xlsx", skip = 4)

Organização

sigbm <- sigbm_bruto |> 
  janitor::clean_names() |> 
  dplyr::mutate(
    lat = parzer::parse_lat(latitude),
    long = parzer::parse_lon(longitude),
    .after = longitude
  )

Objetivo 1: Mapa estático com ggplot2

quantidade_por_uf <- sigbm |>
  dplyr::count(uf, name = "qtd_barragens")
 br_estados <- geobr::read_state(year = 2020)
FALSE 
  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |===                                                                   |   4%
  |                                                                            
  |=====                                                                 |   7%
  |                                                                            
  |========                                                              |  11%
  |                                                                            
  |==========                                                            |  15%
  |                                                                            
  |=============                                                         |  19%
  |                                                                            
  |================                                                      |  22%
  |                                                                            
  |==================                                                    |  26%
  |                                                                            
  |=====================                                                 |  30%
  |                                                                            
  |=======================                                               |  33%
  |                                                                            
  |==========================                                            |  37%
  |                                                                            
  |=============================                                         |  41%
  |                                                                            
  |===============================                                       |  44%
  |                                                                            
  |==================================                                    |  48%
  |                                                                            
  |====================================                                  |  52%
  |                                                                            
  |=======================================                               |  56%
  |                                                                            
  |=========================================                             |  59%
  |                                                                            
  |============================================                          |  63%
  |                                                                            
  |===============================================                       |  67%
  |                                                                            
  |=================================================                     |  70%
  |                                                                            
  |====================================================                  |  74%
  |                                                                            
  |======================================================                |  78%
  |                                                                            
  |=========================================================             |  81%
  |                                                                            
  |============================================================          |  85%
  |                                                                            
  |==============================================================        |  89%
  |                                                                            
  |=================================================================     |  93%
  |                                                                            
  |===================================================================   |  96%
  |                                                                            
  |======================================================================| 100%
# #readr::write_rds(br_estados, "dados/geobr_estados.Rds")
# #br_estados <- readr::read_rds("dados/geobr_estados.Rds")
 dplyr::glimpse(br_estados)
FALSE Rows: 27
FALSE Columns: 6
FALSE $ code_state   <dbl> 11, 12, 13, 14, 15, 16, 17, 21, 22, 23, 24, 25, 26, 27, 2…
FALSE $ abbrev_state <chr> "RO", "AC", "AM", "RR", "PA", "AP", "TO", "MA", "PI", "CE…
FALSE $ name_state   <chr> "Rondônia", "Acre", "Amazônas", "Roraima", "Pará", "Amapá…
FALSE $ code_region  <dbl> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, …
FALSE $ name_region  <chr> "Norte", "Norte", "Norte", "Norte", "Norte", "Norte", "No…
FALSE $ geom         <MULTIPOLYGON [°]> MULTIPOLYGON (((-65.3815 -1..., MULTIPOLYGON…
tabela_com_dados_uf <-
  dplyr::left_join(br_estados, quantidade_por_uf,
                   by = c("abbrev_state" =  "uf")) |> 
   sf::st_simplify(dTolerance = 5000) 

dplyr::glimpse(tabela_com_dados_uf)
## Rows: 27
## Columns: 7
## $ code_state    <dbl> 11, 12, 13, 14, 15, 16, 17, 21, 22, 23, 24, 25, 26, 27, …
## $ abbrev_state  <chr> "RO", "AC", "AM", "RR", "PA", "AP", "TO", "MA", "PI", "C…
## $ name_state    <chr> "Rondônia", "Acre", "Amazônas", "Roraima", "Pará", "Amap…
## $ code_region   <dbl> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,…
## $ name_region   <chr> "Norte", "Norte", "Norte", "Norte", "Norte", "Norte", "N…
## $ qtd_barragens <int> 36, NA, 15, NA, 114, 18, 7, 2, 2, NA, NA, 1, NA, 1, 3, 8…
## $ geom          <MULTIPOLYGON [°]> MULTIPOLYGON (((-65.33169 -..., MULTIPOLYGO…
tabela_com_dados_uf |>
  ggplot() +
  geom_sf()

Complementando o gráfico:

tabela_com_dados_uf |> 
  ggplot() +
  geom_sf(aes(fill = qtd_barragens)) +
  scale_fill_viridis_c() +
  labs(fill = "Quantidade de\nBarragens",
       title = "Quantidade de barragens de mineração por estado no Brasil",
       caption = "Dados obtidos no SIGBM em 15/06/2022.") +
  theme_light() 

Objetivo 2: Mapa de pontos!

library(leaflet)
sigbm |> 
  leaflet() |> 
  #addTiles() |> 
  addProviderTiles("Esri.WorldImagery") |> 
  addMarkers(~ long, ~lat,
             clusterOptions = markerClusterOptions())

Objetivo 3 - Exemplo para a Tainá!

sigbm_summ <- sigbm |> 
  dplyr::mutate(
    volume_atual_m3 = readr::parse_number(
      volume_atual_m3, 
      locale = readr::locale(
        decimal_mark = ",", 
        grouping_mark = "."
      )
    )
  ) |> 
  dplyr::group_by(uf) |> 
  dplyr::summarise(
    qtd_barragens = dplyr::n(),
    altura_media = mean(
      altura_atual_m, na.rm = TRUE
    ),
    emergencia = sum(
      nivel_de_emergencia != "Sem emergência",
      na.rm = TRUE
    ),
    dano_alto = sum(
      dano_potencial_associado == "Alto", 
      na.rm = TRUE
    ),
    volume = sum(
      volume_atual_m3, 
      na.rm = TRUE
    ) 
  )
gera_grafico <- function(coluna, titulo) {
  br_estados |> 
    dplyr::left_join(
      sigbm_summ, c("abbrev_state" = "uf")
    ) |> 
    sf::st_simplify(dTolerance = 5000) |> 
    ggplot2::ggplot() +
    # alternativa:
    # ggplot2::aes(fill = {{coluna}}) +
    ggplot2::aes(fill = .data[[coluna]]) +
    ggplot2::geom_sf() +
    ggplot2::scale_fill_viridis_c() +
    ggplot2::labs(
      title = titulo
    ) +
  theme_light() 
}
gera_grafico("dano_alto", "Dano alto!")

lista <- list(
  "Dano alto!" = "dano_alto",
  "Emergência!!" = "emergencia",
  "Altura média!!" = "altura_media",
  "Volume!!" = "volume"
)

lista_graficos <- purrr::imap(lista, gera_grafico)

patchwork::wrap_plots(
  lista_graficos, 
  ncol = 2
)

Dúvida da Laila

library("rnaturalearth")
library("rnaturalearthdata")

world <- ne_countries(scale = "medium", returnclass = "sf")
class(world)
## [1] "sf"         "data.frame"
ggplot(data = world) +
  geom_sf()