Faxina e Processamento de Dados de CH4 Atmosférico (XCH4) Gosat

Buscamos todos arquivos NetCDF (.nc) no diretório e subdiretórios da pasta data-raw e retorna caminhos completos para processamento. Posteriormente a função de leitura, semelhante à anterior abre cada arquivo NetCD, extrai \(7\) variáveis-chave para análise e fecha a conexão após leitura retornando um dataframe padronizado

Variáveis extraídas:

## Lista com caminho e nomes dos arquivo a serem lidos - xco2
list_of_files <- list.files("data-raw/CH4_GOS_OCPR/",
                            pattern = ".nc",
                            full.names = TRUE,
                            all.files = TRUE,
                            recursive = TRUE)

## função para ler arquivos NCD4
ncdf_reader <- function(file_path){
  nc_file <- ncdf4::nc_open(file_path)
  df <- data.frame(
    "longitude"=ncdf4::ncvar_get(nc_file,varid="longitude"),
    "latitude"=ncdf4::ncvar_get(nc_file,varid="latitude"),
    "time"=ncdf4::ncvar_get(nc_file,varid="time"),
    "xch4"=ncdf4::ncvar_get(nc_file,varid="xch4"),
    "xch4_quality_flag"=ncdf4::ncvar_get(nc_file,varid="xch4_quality_flag"),
    "xch4_incerteza"=ncdf4::ncvar_get(nc_file,varid="xch4_uncertainty"),
    "path" = file_path
  )
  ncdf4::nc_close(nc_file)
  return(df)
}

Processamento em Lote dos Dados

Semelhante ao processamento anterior, seleciona apenas dados dentro da “caixa delimitadora” do Brasil e utiliza um filtro rápido antes da análise espacial precisa. Usa o polígono exato do Brasil ({pol_br}) para filtrar pontos costeiros/ilhas e retorma como resultado um dataframe unificado (dff) com apenas medições válidas. Cada lote preserva metadados originais (path do arquivo). A paralelização pode ser usada nesse momento.

dff_1 <- purrr::map_df(list_of_files[1:1000],ncdf_reader)
readr::write_rds(dff_1,"data-raw/dff_1.rds")
dff_2 <- purrr::map_df(list_of_files[1001:2000],ncdf_reader)
readr::write_rds(dff_2,"data-raw/dff_2.rds")
dff_3 <- purrr::map_df(list_of_files[2001:3000],ncdf_reader)
readr::write_rds(dff_3,"data-raw/dff_3.rds")
dff_4 <- purrr::map_df(list_of_files[3001:length(list_of_files)],ncdf_reader)
readr::write_rds(dff_4,"data-raw/dff_4.rds")

df1 <- readr::read_rds("data-raw/dff_1.rds")
df1 <- df1 |>
  dplyr::filter(longitude >= -80 &
                  longitude <= -32,
                latitude >= -34 &
                  latitude <= 10)
dplyr::glimpse(df1)

df2 <- readr::read_rds("data-raw/dff_2.rds") |>
  dplyr::filter(longitude >= -80 &
                  longitude <= -32,
                latitude >= -34 &
                  latitude <= 10)
dplyr::glimpse(df2)

df3 <- readr::read_rds("data-raw/dff_3.rds") |>
  dplyr::filter(longitude >= -80 &
                  longitude <= -32,
                latitude >= -34 &
                  latitude <= 10)
dplyr::glimpse(df3)

df4 <- readr::read_rds("data-raw/dff_4.rds") |>
  dplyr::filter(longitude >= -80 &
                  longitude <= -32,
                latitude >= -34 &
                  latitude <= 10)
dplyr::glimpse(df3)
dff <- rbind(df1,df2,df3,df4)

dff <- dff |>
  dplyr::mutate(
    flag_br = def_pol(longitude, latitude, pol_br)
  )

Extraímos os contornos das \(5\) regiões do Brasil usando {geobr} e posteriormente ajustamos os polígonos para remover pontos a leste da longitude -34° (ilhas oceânicas) e corrigir distorções em áreas costeiras específicas. A saída é objeto pol_br, o polígono do Brasil ajustado e o pol_nordeste, o polígono do Nordeste ajustado.

regiao <- geobr::read_region(showProgress = FALSE)
pol_norte <- regiao$geom |> purrr::pluck(1) |> as.matrix()
pol_nordeste <- regiao$geom |> purrr::pluck(2) |> as.matrix()
pol_sudeste <- regiao$geom |> purrr::pluck(3) |> as.matrix()
pol_sul <- regiao$geom |> purrr::pluck(4) |> as.matrix()
pol_centroeste<- regiao$geom |> purrr::pluck(5) |> as.matrix()

# Retirando alguns pontos
pol_br <- pol_br[pol_br[,1]<=-34,]
pol_br <- pol_br[!((pol_br[,1]>=-38.8 & pol_br[,1]<=-38.6) &
                     (pol_br[,2]>= -19 & pol_br[,2]<= -16)),]

pol_nordeste <- pol_nordeste[pol_nordeste[,1]<=-34,]
pol_nordeste <- pol_nordeste[!((pol_nordeste[,1]>=-38.7 & pol_nordeste[,1]<=-38.6) & pol_nordeste[,2]<= -15),]

# Retirando alguns pontos
pol_br <- pol_br[pol_br[,1]<=-34,]
pol_br <- pol_br[!((pol_br[,1]>=-38.8 & pol_br[,1]<=-38.6) &
                     (pol_br[,2]>= -19 & pol_br[,2]<= -16)),]

pol_nordeste <- pol_nordeste[pol_nordeste[,1]<=-34,]
pol_nordeste <- pol_nordeste[!((pol_nordeste[,1]>=-38.7 & pol_nordeste[,1]<=-38.6) & pol_nordeste[,2]<= -15),]

# Recriando o flag_nordeste
dff <- dff |>
  dplyr::mutate(
    flag_br = def_pol(longitude, latitude, pol_br),
    flag_nordeste = def_pol(longitude, latitude, pol_nordeste)
  )

Correções, - mantém apenas pontos dentro do Brasil (flag_br) ou Nordeste (flag_nordeste) removendo valores inválidos. Tratamento de Datas extrai informações temporais do caminho do arquivo:

 - `date`: Data no formato `YYYY-MM-DD`  
 - `year`/`month`/`day`: Componentes separados  

Classificação por Estado pela função get_geobr_state para identificar o estado de cada coordenada resultado armazenado na coluna state.

data_set <- dff |>
  dplyr::filter(flag_br|flag_nordeste) |>
  dplyr::filter(
    xch4 > 0,
    xch4_quality_flag == 0) |>
    dplyr::mutate(
      path = stringr::str_remove(path, "data-raw/CH4_GOS_OCPR/20...|\\.nc"),
      date = lubridate::as_date(stringr::str_sub(path,27,34)),
      year = lubridate::year(date),
      month = lubridate::month(date),
      day = lubridate::day(date),
      .after = "time"
    )
dplyr::glimpse(data_set)

# Criando a coluna para os estados.
# carregando os poligonos e funções


# Classificando pontos
state <- 0
x <- data_set |> dplyr::pull(longitude)
y <- data_set |> dplyr::pull(latitude)
for(i in 1:nrow(data_set)) state[i] <- get_geobr_state(x[i],y[i])
data_set <- data_set |> cbind(state)
dplyr::glimpse(data_set)
# readr::write_rds(data_set,"data/gosat-xch4.rds")

dff <- readr::read_rds("../data/gosat-xch4.rds")
br |>
  ggplot2::ggplot() +
  ggplot2::geom_sf(fill="white", color="#FEBF57",
                   size=.15, show.legend = FALSE) +
  ggplot2::geom_point(data= dff |>
                        dplyr::sample_n(1000) |>
                        dplyr::filter(flag_br|flag_nordeste) ,
                      ggplot2::aes(x=longitude,y=latitude),
                      shape=3,
                      col="red",
                      alpha=0.2)