Este tutorial mostra como acessar manualmente os dados do Climate TRACE/CTrees pela internet, realizando o download direto via navegador.
Role a lista até encontrar Brazil (ou outro pais de
interesse) e clique no link CSV correspondente.
Isso iniciará o download de um arquivo compactado no formato
.zip
.
O arquivo baixado conterá os dados de emissões/remoções
por setor subsetor e tipo de gás para o pais selecionado.
Para garantir a reprodutibilidade deste material, estamos disponibilizando os dados baixados da plataforma Climate TRACE para o Brasil, no dia 28/04/2025, correspondentes à versão V4-2-0 do banco de dados.
Esses arquivos serão utilizados como referência para todas as análises descritas ao longo deste documento.
Após o download:
.zip
;data-raw/
do seu projeto em R.🧼 Com o arquivo no lugar certo, prossiga para a etapa de tratamento e faxina dos dados -
02_tratamento_dados
– Faxina, filtragem e organização dos dados.
█████╗ ██████╗ ██╗
██╔══██╗██╔══██╗██║
███████║██████╔╝██║
██╔══██║██╔═══╝ ██║
██║ ██║██║ ██║
╚═╝ ╚═╝╚═╝ ╚═╝
██████╗████████╗
██╔════╝╚══██╔══╝
██║ ██║
██║ ██║
╚██████╗ ██║
╚═════╝ ╚═╝
A API Climate TRACE oferece acesso a dados globais de emissões de gases de efeito estufa. Este guia explora todos os endpoints e recursos até agora disponiveis.
Informação e documentação podem ser acessadas em API-ClimateTRACE
Todas as funções aqui utilizadas estão documentadas em climatetrace_api.R
source("../R/climatetrace_api.R")
INICIANDO EXTRAÇÃO DE METADADOS… PROCESSANDO DEFINIÇÕES…
1.1 Paises Disponiveis
# Obtendo lista de paises
paises <- get_countries()
#
# # Tabela com os primeiros 10 paises
# knitr::kable(head(paises, 10), caption = "Amostra de Paises") |>
# kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12)
#
# # Total de paises
# cat("Total de paises disponiveis:", nrow(paises))
DT::datatable(paises)
1.2 Continentes Disponiveis
# Obtendo lista de continentes
tryCatch({
continentes <- get_continents()
if (is.list(continentes) || is.vector(continentes)) {
cat("Continentes disponiveis:\n")
print(continentes)
} else if (is.data.frame(continentes)) {
# knitr::kable(continentes, caption = "Continentes") |>
# kableExtra::kable_styling(bootstrap_options = c("striped", "hover"))
DT::datatable(continentes)
}
}, error = function(e) {
cat("Obtendo continentes via documentação:\n")
continentes_doc <- c("Asia", "South America", "North America",
"Oceania", "Antarctica", "Africa", "Europe")
print(continentes_doc)
})
#> Continentes disponiveis:
#> [1] "North America" "Asia" "Africa" "Europe"
#> [5] "South America" "Oceania" "Antarctica" "Unknown"
1.3 Setores de Emissão
# Obtendo setores
setores <- get_sectors()
# Verificando a estrutura para diagnóstico
cat("Estrutura dos dados de setores:\n")
#> Estrutura dos dados de setores:
str(setores, max.level = 1)
#> chr [1:10] "manufacturing" "fossil-fuel-operations" "agriculture" ...
# Lidando com diferentes formatos de resposta possiveis
if (is.list(setores)) {
# Se for uma lista, extraimos os nomes
setores_list <- names(setores)
# Criando dataframe com setores (limitado a 20 para evitar erros de tamanho)
setores_df <- data.frame(Setor = head(setores_list, 20))
# Mostrando tabela de setores
# knitr::kable(setores_df, caption = "Setores Disponiveis na API (top 20)") |>
# kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12)
# cat("\nTotal de setores disponiveis:", length(setores_list))
#
DT::datatable(setores_df)
# Se houver mais de 20 setores, mostramos o restante como texto
if (length(setores_list) > 20) {
cat("\n\nSetores adicionais:\n")
cat(paste(setores_list[21:min(40, length(setores_list))], collapse = ", "))
if (length(setores_list) > 40) {
cat(", ...")
}
}
} else {
# Caso a estrutura seja diferente, mostramos apenas os dados brutos
cat("Dados de setores em formato não-estruturado:\n")
print(head(setores))
}
#> Dados de setores em formato não-estruturado:
#> [1] "manufacturing" "fossil-fuel-operations" "agriculture"
#> [4] "transportation" "power" "fluorinated-gases"
1.4 Subsetores de Emissão
# Obtendo subsetores
subsetores <- get_subsectors()
# Verificando a estrutura para diagnóstico
cat("Estrutura dos dados de subsetores:\n")
#> Estrutura dos dados de subsetores:
str(subsetores, max.level = 1)
#> chr [1:72] "aluminum" "bauxite-mining" ...
# Lidando com diferentes formatos de resposta possiveis
if (is.list(subsetores)) {
# Se for uma lista, extraimos os nomes
subsetores_list <- names(subsetores)
# Criando dataframe com subsetores (limitado a 20 para evitar erros de tamanho)
subsetores_df <- data.frame(Subsetor = head(subsetores_list, 20))
# Mostrando tabela de subsetores
# knitr::kable(subsetores_df, caption = "Subsetores Disponiveis na API (top 20)") |>
# kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12)
#
# cat("\nTotal de subsetores disponiveis:", length(subsetores_list))
DT::datatable(setores_df)
# Se houver mais de 20 subsetores, mostramos o restante como texto
if (length(subsetores_list) > 20) {
cat("\n\nSubsetores adicionais (mostrando até 40):\n")
cat(paste(subsetores_list[21:min(40, length(subsetores_list))], collapse = ", "))
if (length(subsetores_list) > 40) {
cat(", ...")
}
}
} else {
# Caso a estrutura seja diferente, mostramos apenas os dados brutos
cat("Dados de subsetores em formato não-estruturado:\n")
print(head(subsetores))
}
#> Dados de subsetores em formato não-estruturado:
#> [1] "aluminum"
#> [2] "bauxite-mining"
#> [3] "biological-treatment-of-solid-waste-and-biogenic"
#> [4] "cement"
#> [5] "chemicals"
#> [6] "coal-mining"
1.5 Gases disponiveis
# Obtendo tipos de gases
tryCatch({
gases <- get_gases()
if (is.list(gases) || is.vector(gases)) {
cat("Gases disponiveis:\n")
print(gases)
} else if (is.data.frame(gases)) {
# knitr::kable(gases, caption = "Gases") |>
# kableExtra::kable_styling(bootstrap_options = c("striped", "hover"))
DT::datatable(gases)
}
}, error = function(e) {
cat("Obtendo gases via documentação:\n")
gases_doc <- c("n2o", "co2e", "co2", "ch4", "co2e_20yr", "co2e_100yr")
print(gases_doc)
})
#> Gases disponiveis:
#> [1] "bc" "c10f18" "c2f6" "c3f8"
#> [5] "c4f10" "c5f12" "c6f14" "c6h6"
#> [9] "c-c3f6" "c-c4f8" "cf4" "cfcs"
#> [13] "ch2o" "ch3oh" "ch4" "co"
#> [17] "co2" "co2e" "co2e_100yr" "co2e_20yr"
#> [21] "h2s" "hcfc-141b" "hcfc-142b" "hcs"
#> [25] "hfc-125" "hfc-134" "hfc-134a" "hfc-143"
#> [29] "hfc-143a" "hfc-152" "hfc-152a" "hfc-161"
#> [33] "hfc-227ea" "hfc-23" "hfc-236cb" "hfc-236ea"
#> [37] "hfc-236fa" "hfc-245ca" "hfc-245fa" "hfc-32"
#> [41] "hfc-365mfc" "hfc-41" "hfc-43-10-mee" "hfcs"
#> [45] "hg" "n2o" "nf3" "nh3"
#> [49] "nmvoc" "no2" "nox" "o3"
#> [53] "oc" "pahs" "pb" "pfcs"
#> [57] "pm10" "pm2_5" "sf6" "so2"
#> [61] "sox" "vocs"
1.6 Grupos de Paises
# Obtendo grupos de paises
tryCatch({
grupos <- get_groups()
if (is.list(grupos) || is.vector(grupos)) {
cat("Grupos disponiveis:\n")
print(head(grupos, 10))
cat("Total de grupos:", length(grupos))
} else if (is.data.frame(grupos)) {
# knitr::kable(head(grupos, 10), caption = "Amostra de Grupos") |>
# kableExtra::kable_styling(bootstrap_options = c("striped", "hover"))
# cat("Total de grupos:", nrow(grupos))
DT::datatable(grupos)
}
}, error = function(e) {
cat("Não foi possivel obter informações sobre grupos.\n")
cat("Use o endpoint /v6/definitions/groups para explorar os grupos disponiveis.")
})
#> Grupos disponiveis:
#> $ailac
#> [1] "CRI" "GTM" "HND" "PAN" "CHL" "COL" "PRY" "PER"
#>
#> $aosis
#> [1] "COM" "MUS" "SYC" "STP" "CPV" "GNB" "SGP" "TLS" "MDV" "ATG" "BHS" "BRB"
#> [13] "CUB" "DMA" "DOM" "GRD" "HTI" "JAM" "KNA" "LCA" "VCT" "TTO" "BLZ" "FJI"
#> [25] "PNG" "SLB" "VUT" "KIR" "MHL" "FSM" "NRU" "PLW" "COK" "NIU" "WSM" "TON"
#> [37] "TUV" "GUY" "SUR"
#>
#> $arab_league
#> [1] "COM" "DJI" "SOM" "DZA" "EGY" "LBY" "MAR" "SDN" "TUN" "MRT" "BHR" "IRQ"
#> [13] "JOR" "KWT" "LBN" "OMN" "QAT" "SAU" "PSE" "SYR" "ARE" "YEM"
#>
#> $basic
#> [1] "ZAF" "CHN" "IND" "BRA"
#>
#> $coalition_for_rainforest_nations
#> [1] "KEN" "MDG" "MWI" "MOZ" "UGA" "ZMB" "CMR" "CAF" "COG" "COD" "GNQ" "GAB"
#> [13] "SDN" "BWA" "LSO" "NAM" "ZAF" "GHA" "LBR" "MLI" "NGA" "SLE" "CHN" "KHM"
#> [25] "IDN" "LAO" "MYS" "SGP" "THA" "VNM" "BGD" "IND" "PAK" "DMA" "DOM" "JAM"
#> [37] "LCA" "BLZ" "CRI" "GTM" "HND" "NIC" "FJI" "PNG" "SLB" "VUT" "WSM" "ARG"
#> [49] "BOL" "BRA" "ECU" "GUY" "PRY" "SUR" "URY"
#>
#> $eig
#> [1] "KOR" "GEO" "LIE" "MCO" "CHE" "MEX"
#>
#> $eu
#> [1] "CYP" "BGR" "CZE" "HUN" "POL" "ROU" "SVK" "DNK" "EST" "FIN" "IRL" "LVA"
#> [13] "LTU" "SWE" "HRV" "GRC" "ITA" "MLT" "PRT" "SVN" "ESP" "AUT" "BEL" "FRA"
#> [25] "DEU" "LUX" "NLD"
#>
#> $g20
#> [1] "ZAF" "CHN" "JPN" "KOR" "IDN" "IND" "SAU" "TUR" "CYP" "CZE" "HUN" "POL"
#> [13] "ROU" "RUS" "SVK" "DNK" "EST" "FIN" "IRL" "LVA" "LTU" "SWE" "GBR" "HRV"
#> [25] "GRC" "ITA" "MLT" "PRT" "SVN" "ESP" "FRA" "DEU" "LUX" "NLD" "MEX" "CAN"
#> [37] "USA" "AUS" "ARG" "BRA"
#>
#> $g7
#> [1] "JPN" "GBR" "ITA" "FRA" "DEU" "CAN" "USA"
#>
#> $g77
#> [1] "BDI" "COM" "DJI" "ERI" "ETH" "KEN" "MDG" "MWI" "MUS" "MOZ" "RWA" "SYC"
#> [13] "SOM" "SSD" "UGA" "TZA" "ZMB" "ZWE" "AGO" "CMR" "CAF" "TCD" "COG" "COD"
#> [25] "GNQ" "GAB" "STP" "DZA" "EGY" "LBY" "MAR" "SDN" "TUN" "BWA" "SWZ" "LSO"
#> [37] "NAM" "ZAF" "BEN" "BFA" "CPV" "CIV" "GMB" "GHA" "GIN" "GNB" "LBR" "MLI"
#> [49] "MRT" "NER" "NGA" "SEN" "SLE" "TGO" "TJK" "TKM" "CHN" "PRK" "MNG" "BRN"
#> [61] "KHM" "IDN" "LAO" "MYS" "MMR" "PHL" "SGP" "THA" "TLS" "VNM" "AFG" "BGD"
#> [73] "BTN" "IND" "IRN" "MDV" "NPL" "PAK" "LKA" "AZE" "BHR" "IRQ" "JOR" "KWT"
#> [85] "LBN" "OMN" "QAT" "SAU" "PSE" "SYR" "ARE" "YEM" "ATG" "BHS" "BRB" "CUB"
#> [97] "DMA" "DOM" "GRD" "HTI" "JAM" "KNA" "LCA" "VCT" "TTO" "BLZ" "CRI" "SLV"
#> [109] "GTM" "HND" "NIC" "PAN" "FJI" "PNG" "SLB" "VUT" "KIR" "MHL" "FSM" "NRU"
#> [121] "WSM" "TON" "ARG" "BOL" "BRA" "CHL" "COL" "ECU" "GUY" "PRY" "PER" "SUR"
#> [133] "URY" "VEN"
#>
#> Total de grupos: 17
A API Climate TRACE permite obter dados detalhados sobre fontes especificas de emissão:
2.1 Buscar Fontes de Emissão (Assets)
# Buscando fontes de emissão no Brasil para o setor de uso de terra
fontes_brasil <- search_assets(
countries = "BRA",
sectors = "forestry-and-land-use",
year = 2022,
limit = 5
)
# Explorando a estrutura da resposta
cat("Estrutura da resposta para assets:\n")
#> Estrutura da resposta para assets:
str(fontes_brasil, max.level = 1)
#> List of 2
#> $ bbox : num [1:4] -63.179 -12.38 -51.372 0.312
#> $ assets:'data.frame': 5 obs. of 13 variables:
# Extraindo informações básicas das fontes (se disponiveis)
if (!is.null(fontes_brasil) && "features" %in% names(fontes_brasil)) {
cat("\nExemplo de fontes encontradas:\n")
# Criando dataframe com informações básicas
fontes_info <- lapply(fontes_brasil$features, function(feature) {
if (is.null(feature$properties)) {
return(data.frame(id = feature$id, type = NA, name = NA))
} else {
return(data.frame(
id = feature$id,
type = ifelse(is.null(feature$properties$type), NA, feature$properties$type),
name = ifelse(is.null(feature$properties$name), NA, feature$properties$name)
))
}
})
fontes_df <- do.call(rbind, fontes_info)
# Mostrando tabela com as fontes
knitr::kable(fontes_df, caption = "Fontes de Emissão - Brasil (Setor Florestal)") |>
kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12)
}
2.3 Emissões por Fonte
# Obtendo emissões agregadas por fonte
emissoes_fontes <- get_asset_emissions(
countries = "BRA",
sectors = "forestry-and-land-use",
years = 2022,
gas = "co2e"
)
# Explorando a estrutura
cat("Estrutura da resposta para emissões por fonte:\n")
#> Estrutura da resposta para emissões por fonte:
str(emissoes_fontes, max.level = 1)
#> List of 1
#> $ BRA:'data.frame': 1 obs. of 5 variables:
# Mostrando amostra dos dados em formato de tabela
if (is.data.frame(emissoes_fontes) && nrow(emissoes_fontes) > 0) {
knitr::kable(head(emissoes_fontes, 10), caption = "Emissões por Fonte - Brasil (2022)") |>
kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12)
cat("Total de registros:", nrow(emissoes_fontes))
}
3.1 Emissões Agregadas por Pais
# Obtendo emissões agregadas para um grupo de paises
paises_amostra <- c("BRA", "USA", "CHN", "IND", "RUS")
emissoes_paises <- get_country_emissions(
countries = paises_amostra,
sector = "forestry-and-land-use",
since = 2020,
to = 2022
)
# Estrutura da resposta
cat("Estrutura da resposta para emissões por pais:\n")
#> Estrutura da resposta para emissões por pais:
str(emissoes_paises, max.level = 1)
#> 'data.frame': 5 obs. of 8 variables:
#> $ country : chr "BRA" "CHN" "IND" "RUS" ...
#> $ continent : chr "null" "null" "null" "null" ...
#> $ rank : int 5 1 3 4 2
#> $ previousRank : int 5 1 3 4 2
#> $ assetCount : logi NA NA NA NA NA
#> $ emissions :'data.frame': 5 obs. of 5 variables:
#> $ worldEmissions :'data.frame': 5 obs. of 5 variables:
#> $ emissionsChange:'data.frame': 5 obs. of 5 variables:
# Criando tabela com dados principais
if (is.data.frame(emissoes_paises) && nrow(emissoes_paises) > 0) {
# Extraindo dados principais
emissoes_resumo <- data.frame(
Pais = emissoes_paises$country,
Continente = emissoes_paises$continent,
Rank = emissoes_paises$rank
)
# Adicionando emissões de CO2 (se disponivel)
if ("emissions" %in% names(emissoes_paises)) {
if (is.data.frame(emissoes_paises$emissions) && "co2" %in% names(emissoes_paises$emissions)) {
emissoes_resumo$CO2_Mt <- emissoes_paises$emissions$co2 / 1e6 # Convertendo para Mt
}
if (is.data.frame(emissoes_paises$emissions) && "co2e_100yr" %in% names(emissoes_paises$emissions)) {
emissoes_resumo$CO2e_100yr_Mt <- emissoes_paises$emissions$co2e_100yr / 1e6
}
}
# Adicionando nomes dos paises
paises_info <- get_countries()
emissoes_resumo$Nome_Pais <- paises_info$name[match(emissoes_resumo$Pais, paises_info$alpha3)]
# Reordenando colunas
if ("Nome_Pais" %in% names(emissoes_resumo)) {
emissoes_resumo <- emissoes_resumo |>
select(Nome_Pais, Pais, Continente, everything())
}
# Mostrando tabela
# knitr::kable(emissoes_resumo, caption = "Emissões por Pais (2020-2022)") |>
# kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12)
DT::datatable(emissoes_resumo)
}
GERANDO EXEMPLOS DE CÓDIGO PARA CASOS DE USO COMUNS…
# Buscando emissões do subsetor de desmatamento para os principais paises
paises_tropicais <- c("BRA", "IDN", "COD", "MYS", "PER")
desmatamento <- get_country_emissions(
countries = paises_tropicais,
sector = "forestry-and-land-use",
subsectors = "forest-land-clearing",
since = 2020,
to = 2022
)
# Criando tabela com os resultados
if (is.data.frame(desmatamento) && nrow(desmatamento) > 0) {
# Extraindo dados principais
desmat_resumo <- data.frame(
Pais = desmatamento$country,
CO2_Mt = ifelse("emissions" %in% names(desmatamento) &&
"co2" %in% names(desmatamento$emissions),
desmatamento$emissions$co2 / 1e6, NA)
)
# Adicionando nomes dos paises
paises_info <- get_countries()
desmat_resumo$Nome_Pais <- paises_info$name[match(desmat_resumo$Pais, paises_info$alpha3)]
# Reordenando e ordenando por emissão
desmat_resumo <- desmat_resumo |>
select(Nome_Pais, Pais, CO2_Mt) |>
arrange(desc(CO2_Mt))
# Mostrando tabela
# knitr::kable(desmat_resumo, caption = "Emissões por Desmatamento (2020-2022)") |>
# kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12)
DT::datatable(desmat_resumo)
}
# Buscando dados de remoções de carbono
remocoes <- get_country_emissions(
countries = c("BRA", "USA", "CHN", "RUS", "CAN"),
sector = "forestry-and-land-use",
subsectors = "removals",
since = 2020,
to = 2022
)
# Criando tabela com os resultados
if (is.data.frame(remocoes) && nrow(remocoes) > 0) {
if("emissions" %in% names(remocoes) &&
"co2" %in% names(remocoes$emissions)){
vetor_remocao_CO2_Mt <- -remocoes$emissions$co2 / 1e6
}else{
NA
}
remoc_resumo <- data.frame(
Pais = remocoes$country,
Remocao_CO2_Mt = vetor_remocao_CO2_Mt
)
# Adicionando nomes dos paises
paises_info <- get_countries()
remoc_resumo$Nome_Pais <- paises_info$name[match(remoc_resumo$Pais, paises_info$alpha3)]
# Reordenando e ordenando por remoção
remoc_resumo <- remoc_resumo |>
select(Nome_Pais, Pais, Remocao_CO2_Mt) |>
arrange(desc(Remocao_CO2_Mt))
# Mostrando tabela
# knitr::kable(remoc_resumo, caption = "Remoções de Carbono (2020-2022)") |>
# kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12)
DT::datatable(remoc_resumo)
}
DOCUMENTANDO PARÂMETROS DE API… CRIANDO REFERÊNCIA TÉCNICA…
1. Endpoint: /v6/assets (Fontes de Emissão)
Parâmetro | Tipo | Descrição |
---|---|---|
countries | array[string] | Lista de códigos de paises (3 letras) |
sectors | array[string] | Lista de setores |
subsectors | string | Lista de subsetores |
year | integer | Ano (2020-2050) |
limit | integer | Máximo de itens retornados (0-1000) |
offset | integer | Deslocamento para paginação (0-100) |
continents | array[string] | Lista de continentes |
adminId | integer | ID de área administrativa |
2. Endpoint: /v6/assets/emissions (Emissões por Fonte)
Parâmetro | Tipo | Descrição |
---|---|---|
adminId | integer | ID de área administrativa |
years | array[integer] | Lista de anos |
subsectors | string | Lista de subsetores |
sectors | array[string] | Lista de setores |
continents | array[string] | Lista de continentes |
groups | array[string] | Lista de grupos |
countries | array[string] | Lista de códigos de paises |
gas | string | Tipo de gás (n2o, co2e, co2, ch4, co2e_20yr, co2e_100yr) |
3. Endpoint: /v6/country/emissions (Emissões por Pais)
Parâmetro | Tipo | Descrição |
---|---|---|
since | integer | Ano inicial (2000-2050) |
to | integer | Ano final (2000-2050) |
sector | array[string] | Lista de setores |
subsectors | string | Lista de subsetores |
continents | array[string] | Lista de continentes |
groups | array[string] | Lista de grupos |
countries | array[string] | Lista de códigos de paises |
DOCUMENTAÇÃO COMPLETA… GUIA DE REFERÊNCIA GERADO…
# Obtendo dados
brasil_florestal <- get_country_emissions(
countries = "BRA",
sector = "forestry-and-land-use",
since = 2015,
to = 2022
)
# Criando pasta se não existir
if (!dir.exists("data")) dir.create("data")
# Salvando como RDS (formato nativo do R)
saveRDS(brasil_florestal, "data/brasil_florestal_2015_2022.rds")
# Salvando como CSV (para uso em outros softwares)
if (is.data.frame(brasil_florestal)) {
write.csv(brasil_florestal, "data/brasil_florestal_2015_2022.csv", row.names = FALSE)
}
DOCUMENTAÇÃO OFICIAL: https://api.climatetrace.org