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.
A seguir, uma breve descrição dos arquivos incluídos no pacote de dados baixado da plataforma Climate TRACE:
detailed_data_schema.csv
- Arquivo com o mapeamento
e a explicação do significado de cada coluna dos dados para todos os
diferentes subsetores.
<nome-do-subsetor>_emissions_sources.csv
-
Contém os dados de emissões no nível de fonte de emissão para todos os
subsetores monitorados pela Climate TRACE.
<nome-do-subsetor>_country_emissions.csv
-
Contém os dados de emissões no nível de país para todos os subsetores
monitorados pela Climate TRACE.
<nome-do-subsetor>_emissions_sources_confidence.csv
- Arquivo que especifica a classificação de confiança dos dados
reportados pelas fontes de emissão, referenciando o arquivo
<nome-do-subsetor>_emissions_sources_ownership.csv
- Contém informações sobre a propriedade das fontes de emissão listadas
no arquivo <subsetor>_emissions_sources.csv.
🔗 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: coalition@climatetrace.org.
Para mais informações sobre a origem, metodologia e estrutura dos dados utilizados, acesse o documento oficial disponibilizado pela Climate TRACE:
.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")
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))
}
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)
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()
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)
}
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))
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:
municipality
: Contém os limites geográficos de todos
os municípios brasileiros.
states
: Contém os limites geográficos de todos os
estados brasileiros.
biomes
: Traz os contornos dos biomas do Brasil (como
Amazônia, Cerrado, Mata Atlântica, etc.).
conservation
: Inclui os limites das Unidades de
Conservação brasileiras, como parques nacionais e reservas
ecológicas.
indigenous
: Contém as terras indígenas oficialmente
reconhecidas.
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)
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()
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)
))
}
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)
}
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:
state → qual estado o ponto pertence;
biome → qual bioma o ponto pertence;
conservation → se está em área de unidade de conservação;
indigenous → se está em terra indígena.
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'
)
)
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)
)
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")