📄 Sobre os Dados

Permissões e Uso: Todos os dados do Climate TRACE estão disponíveis gratuitamente sob a Licença Pública Internacional Creative Commons Atribuição 4.0, salvo indicação em contrário.

Forma sugerida de citação: Para fontes de diferentes setores ou dados globais acessados e baixados, utilize a seguinte citação: Climate TRACE (2025). Climate TRACE Emissions Inventory v4.2.0. Disponível em: https://climatetrace.org. Acessado em: 28/04/2025.

Para citações específicas por setor, consulte a seção correspondente na plataforma.

📁 Arquivos Disponíveis

A seguir, uma breve descrição dos arquivos incluídos no pacote de dados baixado da plataforma Climate TRACE:

🔗 Observação: A lista completa de setores de emissão para os quais a Climate TRACE fornece dados está disponível no site: https://climatetrace.org/sectors.

Para alguns setores, há dados geoespaciais adicionais não incluídos neste pacote de download. Para solicitá-los, entre em contato pelo e-mail: .

📄 Sobre os Dados

Para mais informações sobre a origem, metodologia e estrutura dos dados utilizados, acesse o documento oficial disponibilizado pela Climate TRACE:

📥 Clique aqui para baixar o arquivo about_the_data.pdf e about_the_data_v4_2_0.pdf

🔍📁 Encontrando os arquivos .csv

Para esta análise, vamos utilizar os arquivos no formato:

<nome-do-subsetor>_country_emissions.csv

Esses arquivos contêm as estimativas anuais/mensais de emissões e remoções de CO₂ organizadas por município, subsetor e etc.

emissions_sources_files <- list.files("../data-raw/",
             full.names = TRUE,
             recursive = TRUE,
           pattern = "emissions_sources_v4_2_0.csv")

🛠️ Criando função para ler \(1\) arquivo

A função my_file_read recebe o caminho de um arquivo .csv como entrada, lê o conteúdo do arquivo, remove as colunas que começam com “other” (colunas auxiliares menos relevantes para a análise), e adiciona uma nova coluna chamada directory contendo o caminho original do arquivo, útil para rastrear a origem dos dados em etapas subsequentes.

my_file_read <- function(file_path) {
  read.csv(file_path, 
           stringsAsFactors = FALSE)  |> 
    # dplyr::select(!dplyr::starts_with("other")) |> 
    dplyr::mutate(dplyr::across(dplyr::starts_with("other"),as.character)) |> 
    dplyr::mutate(
      directory = file_path,
      native_source_id = as.character(native_source_id))
}

🧩 Aplicando a função de leitura aos arquivos

emissions_sources_files: contém os caminhos completos dos arquivos .csv que queremos importar (obtidos com list.files()).

my_file_read: é a função definida anteriormente que realiza a leitura e pequenas transformações no arquivo.

map_dfr(): aplica a função a cada arquivo da lista e junta tudo em um único data.frame. map vem do conceito de programação funcional chamado “mapear uma função sobre uma estrutura de dados”. Isso significa: Aplicar uma função a cada elemento de um vetor ou lista, retornando uma nova estrutura com os resultados.

glimpse(): mostra um resumo estruturado dos dados finais.

# Empilhando todos os arquivos no objeto dados, pela Aplicanção 
# da função a todos os arquivos encontrados
dados_emissoes <- purrr::map_dfr(
  emissions_sources_files, 
  my_file_read)

🛠️ Tratamento (preprocessing/transformation):

Agora precisamos converter tipos de dados (como de character para Date), criar novas variáveis (como o year a partir de end_time) e reorganizar ou transformar variáveis para análise.

Correções nominais

Criamos uma tabela de correções para padronizar nomes de localidades com acentuação incorreta ou variações de grafia observadas nos dados originais.

correcoes <- c(
  "Itapoa" = "Itapoá",
  "Maraba" = "Marabá",
  "Ribeirao" = "Ribeirão",
  "Sao Goncalo" = "São Gonçalo",
  "Sao Jose" = "São José",
  "Ribeirao" = "Ribeirão",
  "Ceilândia" = "Brasília",
  "Gama" = "Brasília",
  "Itapoã" = "Brasília",
  "Icaivera" = "Betim",
  "Taquaralto" = "Palmas",
  "São João del-Rei" = "São João del Rei"
)

Tratamento de nomes e tipos de fonte

Aplicou-se a tabela de correções aos nomes das fontes emissoras (source_name) e foram atribuídos os tipos de fonte (source_type) quando ausentes, com base em padrões contidos nos nomes originais. Além disso, foi criada uma nova coluna com o nome da fonte tratado (source_name_trat), removendo os sufixos descritivos como "Municipality" e "Urban Area". Em adição a coluna directory, que armazena o caminho dos arquivos originais, foi tratada para remover trechos desnecessários, mantendo apenas a estrutura hierárquica útil à análise. Por fim, as colunas foram reorganizadas para facilitar a visualização e manuseio dos dados, colocando identificadores e nomes das fontes no início da tabela.

dados_emissoes <- dados_emissoes |> 
  dplyr::mutate(
    start_time = lubridate::as_date(start_time),
    end_time = lubridate::as_date(end_time),
    created_date = lubridate::as_date(created_date),
    modified_date = lubridate::as_date(modified_date),
    year = lubridate::year(end_time),
    month = lubridate::month(end_time),
    source_name = stringr::str_replace_all(source_name, correcoes),
    source_type = ifelse(is.na(source_type),
                         ifelse(stringr::str_detect(source_name,"Municipality"),
                                "Municipality",          ifelse(stringr::str_detect(source_name,"Urban Area"),"Urban Area",NA)),source_type),source_name_trat = stringr::str_remove(source_name,
  " Municipality| Urban Area"),
    directory = stringr::str_remove(
      directory,"../data-raw/BRA/DATA/|_emissions_sources_v4_2_0.csv"
    ),
  ) |> 
  dplyr::relocate(source_id, source_name, source_name_trat)
dplyr::glimpse(dados_emissoes)
## Rows: 5,302,740
## Columns: 51
## $ source_id              <int> 10812934, 10812934, 10812934, 10812934, 1081293…
## $ source_name            <chr> "Abadia de Goiás Municipality", "Abadia de Goiá…
## $ source_name_trat       <chr> "Abadia de Goiás", "Abadia de Goiás", "Abadia d…
## $ source_type            <chr> "Municipality", "Municipality", "Municipality",…
## $ iso3_country           <chr> "BRA", "BRA", "BRA", "BRA", "BRA", "BRA", "BRA"…
## $ sector                 <chr> "agriculture", "agriculture", "agriculture", "a…
## $ subsector              <chr> "cropland-fires", "cropland-fires", "cropland-f…
## $ start_time             <date> 2021-01-01, 2021-02-01, 2021-03-01, 2021-04-01…
## $ end_time               <date> 2021-01-31, 2021-02-28, 2021-03-31, 2021-04-30…
## $ lat                    <dbl> -16.78557, -16.78557, -16.78557, -16.78557, -16…
## $ lon                    <dbl> -49.4521, -49.4521, -49.4521, -49.4521, -49.452…
## $ geometry_ref           <chr> "gadm_BRA.9.1_2", "gadm_BRA.9.1_2", "gadm_BRA.9…
## $ gas                    <chr> "co2e_100yr", "co2e_100yr", "co2e_100yr", "co2e…
## $ emissions_quantity     <dbl> 29.57574, 41.94162, 121.26125, 167.09094, 109.8…
## $ temporal_granularity   <chr> "month", "month", "month", "month", "month", "m…
## $ activity               <dbl> 4.005757, 5.680600, 16.423702, 22.630905, 14.87…
## $ activity_units         <chr> "area [ha]", "area [ha]", "area [ha]", "area [h…
## $ emissions_factor       <dbl> 7.383308, 7.383308, 7.383308, 7.383308, 7.38330…
## $ emissions_factor_units <chr> "t of CO2e_100yr per area [ha]", "t of CO2e_100…
## $ capacity               <dbl> 143.3574, 143.3574, 143.3574, 143.3574, 143.357…
## $ capacity_units         <chr> "ha", "ha", "ha", "ha", "ha", "ha", "ha", "ha",…
## $ capacity_factor        <dbl> 0.02794245, 0.03962544, 0.11456474, 0.15786353,…
## $ other1                 <chr> "BRA.9_1", "BRA.9_1", "BRA.9_1", "BRA.9_1", "BR…
## $ other1_def             <chr> "Id: level 1 GADM", "Id: level 1 GADM", "Id: le…
## $ other2                 <chr> "BRA.9.1_2", "BRA.9.1_2", "BRA.9.1_2", "BRA.9.1…
## $ other2_def             <chr> "Id: level 2 GADM", "Id: level 2 GADM", "Id: le…
## $ other3                 <chr> "2", "2", "2", "2", "2", "2", "2", "2", "2", "2…
## $ other3_def             <chr> "Aggregation_type", "Aggregation_type", "Aggreg…
## $ other4                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other4_def             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other5                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other5_def             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other6                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other6_def             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other7                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other7_def             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other8                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other8_def             <chr> "FUA_Area", "FUA_Area", "FUA_Area", "FUA_Area",…
## $ other9                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other9_def             <chr> "FUA_population_2015", "FUA_population_2015", "…
## $ other10                <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ other10_def            <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ created_date           <date> 2023-10-06, 2023-10-06, 2023-10-06, 2023-10-06…
## $ modified_date          <date> 2025-04-14, 2025-04-14, 2025-04-14, 2025-04-14…
## $ sector_id              <int> 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,…
## $ native_source_id       <chr> "BRA.9.1_2", "BRA.9.1_2", "BRA.9.1_2", "BRA.9.1…
## $ reporting_entity       <chr> "climate-trace", "climate-trace", "climate-trac…
## $ lat_lon                <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ directory              <chr> "agriculture/cropland-fires_emissions_sources_v…
## $ year                   <dbl> 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021,…
## $ month                  <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3,…

Devido à exitência de valores de coordenadas como valores NA, associados à fontes do tipo "Urban Area", esse trecho de código realiza tratamento geoespacial, garantindo que cada fonte emissora do tipo "Municipality" esteja corretamente associada a uma coordenada geográfica (latitude e longitude). O objeto dados_emissoes_municipality é criado e será usado dentro das funções a seguir busca de coordenadas geográficas e substituição de NAs.

dados_emissoes_municipality <-  dados_emissoes |> 
  dplyr::filter(source_type == "Municipality") |> 
  dplyr::group_by(source_name_trat,lat,lon) |> 
  dplyr::summarise(
    lon = mean(lon, na.rm=TRUE),
    lat = mean(lat, na.rm=TRUE)
  ) |> dplyr::ungroup()

🧩 Funções auxiliares para busca de coordenadas

As funções get_lat(muni) e get_lon(muni) recebem um nome de município tratado, usam esse nome para filtrar a tabela dados_emissoes_municipality e retornam, respectivamente, a latitude e longitude associadas. O uso de slice(1) garante que apenas o primeiro valor seja retornado, mesmo que haja múltiplos registros. Portanto, é uma função de busca para preencher valores faltantes de lat e lon no dados_emissoes.

get_lat <- function(muni){
  muni <- muni[1]
  lat <- dados_emissoes_municipality |> 
    dplyr::filter(source_name_trat == muni) |> dplyr::slice(1) |> dplyr::pull(lat)
  return(lat)
}

get_lon <- function(muni){
  muni <- muni[1]
  lon <- dados_emissoes_municipality |> 
    dplyr::filter(source_name_trat == muni) |> dplyr::slice(1) |> dplyr::pull(lon)
  return(lon)
}

🔄 Atualização dos dados principais com coordenadas faltantes

Inicalmente agrupamos os dados por source_name (nome original da fonte emissora) para que a função retorne os valores de lat e lon para cada source_name_trat. Em cada grupo, verifica-se lat ou lon está ausente. Se estiver, busca o valor correspondente nas tabelas auxiliares, usando as funções criadas. Se não estiver ausente, mantém o valor original. Ao final, remove qualquer linha que ainda esteja sem lat (e, implicitamente, lon).

dados_emissoes <- dados_emissoes |> 
  dplyr::group_by(source_name) |> 
  dplyr::mutate(
    lat=ifelse(is.na(lat),get_lat(source_name_trat),lat),
    lon=ifelse(is.na(lon),get_lon(source_name_trat),lon)
  ) |> 
  dplyr::filter(!is.na(lat))

🌎 Carregando dados geográficos do Brasil

Nesta etapa, utilizamos o pacote {geobr} para importar informações geográficas oficiais do Brasil. Esses dados são importantes para análises espaciais e visualizações no contexto ambiental e territorial. Os seguintes objetos são criados:

Essas camadas podem ser sobrepostas a dados de emissões para entender a distribuição espacial em relação a áreas protegidas, territórios indígenas ou regiões ecológicas específicas.

Para maiores informações acesse Introduction to geobr (R)

country_br <- geobr::read_country(showProgress = FALSE)
municipality <- geobr::read_municipality(showProgress = FALSE)|> 
  dplyr::rename(target = name_muni )
states <- geobr::read_state(showProgress = FALSE) |> 
  dplyr::rename(target = abbrev_state )
biomes <- geobr::read_biomes(showProgress = FALSE) |> 
  dplyr::rename(target = name_biome)
conservation <- geobr::read_conservation_units(showProgress = FALSE) |> 
  dplyr::rename(target = name_conservation_unit)
indigenous <- geobr::read_indigenous_land(showProgress = FALSE) |> 
  dplyr::rename(target = terrai_nom)

🗺️ Plotando espacialmente os ponto

Nesta etapa, vamos representar os dados no espaço geográfico, gerando mapas que permitem visualizar a distribuição dos pontos de interesse. A plotagem espacial é fundamental para identificar padrões, áreas de maior concentração e possíveis anomalias nos dados.

Criando o mapa com sobreposição

Terras Indígenas reconhecidas

indigenous    |> 
  ggplot2::ggplot() +
  ggplot2::geom_sf(fill="white", color="black",
          size=.15, show.legend = FALSE) +
  ggplot2::geom_point(
    data = dados_emissoes  |> 
      dplyr::filter(
        year == 2021),
     ggplot2::aes(lon,lat)) +
  ggplot2::theme_bw()

Áreas de conservação

conservation    |> 
  ggplot2::ggplot() +
  ggplot2::geom_sf(fill="white", color="black",
          size=.15, show.legend = FALSE) +
  ggplot2::geom_point(
    data = dados_emissoes  |> 
      dplyr::filter(
        year == 2021),
     ggplot2::aes(lon,lat)) +
  ggplot2::theme_bw()

🧭 Função para verificar se pontos estão dentro de um polígono

A função def_pol() tem como objetivo verificar se pontos (definidos por coordenadas x e y) estão dentro de um polígono geográfico.

Ela utiliza a função point.in.polygon() do pacote {sp} para realizar essa verificação espacial. Isso é útil para saber, por exemplo, quais fontes de emissão estão dentro de um determinado bioma ou unidade de conservação.

def_pol <- function(x, y, pol){
  as.logical(sp::point.in.polygon(
    point.x = x,         # Coordenadas X dos pontos
    point.y = y,         # Coordenadas Y dos pontos
    pol.x = pol[,1],     # Coordenadas X do polígono (coluna 1 do objeto pol)
    pol.y = pol[,2]      # Coordenadas Y do polígono (coluna 2 do objeto pol)
  ))
}

🧩 Função get_geobr_pol()

A função tem como entrada: um índice i e um objeto do {geobr} (geobr_obj) — que contém geometrias (como states, biomes, etc.). O processo acessa o slot $geom, que é uma lista de geometrias (um sfc do {sf}), usa purrr::pluck(i) para pegar a geometria do estado i (ex: 1º estado) e converte essa geometria (um POLYGON ou MULTIPOLYGON) em uma matriz com as.matrix() — essencial para usar em funções como point.in.polygon() depois. A saída da função é uma matriz com as coordenadas do polígono do estado selecionado.

get_geobr_pol <- function(i, geobr_obj) {
  pol<-geobr_obj$geom |> 
    purrr::pluck(i) |> 
    as.matrix()
  return(pol) 
}

📦 Função get_geobr()

serve para determinar a qual unidade dentro do geobr_obj pertence um ponto geográfico, com base nas coordenadas x (longitude) e y (latitude), a partir da geometria específica.

get_geobr <- function(x, y, geobr_obj){
  target <- geobr_obj$target
  list_pol <- purrr::map(
    1:nrow(geobr_obj), 
    get_geobr_pol,
    geobr_obj = geobr_obj)
  names(list_pol) <- target
  
  x <- as.vector(x[1])
  y <- as.vector(y[1])
  resul <- "Other"

  for(i in 1:nrow(geobr_obj)){
    if(def_pol(x, y, list_pol[[i]])){
      resul <- names(list_pol[i])
      break
    } else {
      resul <- resul
    }
  }
  return(as.vector(resul))
}

# Testando da Função
get_geobr(-47.9292, -15.7801, states) # → "DF" (Brasília)
## [1] "DF"
get_geobr(-47.9292, -15.7801, biomes) # → "Cerrado"
## [1] "Cerrado"
get_geobr(-47.9292, -15.7801, conservation) # → "Other"
## [1] "Other"
get_geobr(-47.9292, -15.7801, indigenous) # → "Other"
## [1] "Other"

Vamos criar um arquivo com todos os pares de coordenadas que ocorrem na base de dados e classificar.

dados_emissoes |> group_by(lon, lat): Agrupa os dados por coordenadas geográficas (longitude e latitude).

summarise(year_m = mean(year)): Faz um resumo calculando a média do ano (year), mas esse valor será descartado logo em seguida.

select(-year_m): Remove a coluna year_m, sobrando só lon e lat no resultado.

mutate(...): Para cada par de (lon, lat), ele chama a função get_geobr para classificar:

write_rds(...): Salva o resultado (base_sigla_uf) em um arquivo .rds para usar depois sem precisar recalcular tudo.

base_sigla_uf <- dados_emissoes |>
  dplyr::group_by(lon, lat) |>
  dplyr::summarise(
    year_m = mean(year)
  ) |>
  dplyr::select(-year_m) |>
  # tidyr::drop_na() |>
  dplyr::mutate(
    state = get_geobr(lon, lat, states),
    biome = get_geobr(lon, lat, biomes),
    conservation = get_geobr(lon, lat, conservation),
    indigenous = get_geobr(lon, lat, indigenous)
  )
readr::write_rds(base_sigla_uf,"../data/states_biom_conser_ind-br.rds")

Criando uma nova coluna chamada biomes que é uma versão “ajustada” do biome Faz várias reclassificações baseadas em: Nome original do bioma (biome) e condições de latitude (lat) e longitude (lon).

base_sigla_uf <- readr::read_rds("../data/states_biom_conser_ind-br.rds")
base_sigla_uf <- base_sigla_uf |>
  dplyr::mutate(
    biomes_sig =
      dplyr::case_when(
        biome=='Other'& lon >=-45 & lat <0~'AF',
        biome=='Amazônia'~'AMZ',
        biome=='Other'& lon < -45 & lat >=-10 ~'AMZ',
        biome == 'Mata Atlântica' & lon> -40 & lat < -20 ~'Other',
        biome == 'Mata Atlântica' & lon> -34 & lat > -5 ~'Other',
        biome == 'Mata Atlântica' ~ 'AF',
        biome=='Cerrado'~'CERR',
        biome =='Pampa'~'PMP',
        biome == 'Pantanal' ~ 'PNT',
        biome=='Caatinga'~'CAAT',
        .default = 'Other'
      )
    )

📦 Função get_geobr_municipaly()

serve para determinar a qual município a partir do estado pertence um ponto geográfico, com base nas coordenadas x (longitude) e y (latitude), o estado a partir da geometria do municipio municipaly.

get_geobr_municipaly <- function(x, y, state, geobr_obj){
  state <- as.vector(state[1])
  x <- as.vector(x[1])
  y <- as.vector(y[1])
  resul <- "Other"
  if(state == "Other") {return(resul)}
  geobr_obj <- geobr_obj |> 
    dplyr::filter(abbrev_state == state)
  target <- geobr_obj$target
  list_pol <- purrr::map(
    1:nrow(geobr_obj), 
    get_geobr_pol,
    geobr_obj = geobr_obj)
  names(list_pol) <- target
  
  for(i in 1:nrow(geobr_obj)){
    if(def_pol(x, y, list_pol[[i]])){
      resul <- names(list_pol[i])
      break
    } else {
      resul <- resul
    }
  }
  return(as.vector(resul))
}

# Testando da Função
get_geobr_municipaly(-47.9292, -15.7801, "DF",municipality) # → (Brasília)
## [1] "Brasília"
get_geobr_municipaly(-47.2, -23.1,"SP", municipality) # → (Indaiatuba)
## [1] "Indaiatuba"
get_geobr_municipaly(-57.97413, -22.18186,"SP", municipality) # → (Other)
## [1] "Other"

Vamos criar uma nova base com os pontos classificados por município

base_sigla_uf_muni <- base_sigla_uf |> 
  dplyr::mutate(
    muni = get_geobr_municipaly(lon, lat, state, municipality)
  )

📁 Mesclando e Salvando a base

Buscar as regiões do Brasil a partir de dados oficiais do IBGE, previamente salvos em df_nome.rds. Posteriormente, vamos mesclar as bases e salvar na pasta data com o nome emissions_sources.rds.

brazil_ids <- readr::read_rds("../data/df_nome.rds")
base_sigla_region <- dplyr::left_join(base_sigla_uf_muni,brazil_ids  |> 
                                        dplyr::group_by(sigla_uf,nome_regiao) |> 
                                        dplyr::summarise(count=dplyr::n()) |> 
                                        dplyr::select(sigla_uf,nome_regiao) |>
                                        dplyr::rename(state = sigla_uf,region = nome_regiao),
                                      by = c("state"))
dplyr::left_join(
  dados_emissoes,
  base_sigla_region |> 
    dplyr::ungroup(),
  by = c("lat","lon")
) |> 
  tibble::as_tibble() |> 
  readr::write_rds( "../data/emissions_sources.rds")