Ferramentas do usuário

Ferramentas do site


lidar:projetos:rcode_alsmodelo

Essa é uma revisão anterior do documento!


# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Inventário com dados LiDAR na Fazenda Modelo ~~~~~~~~~~~~~~~~~~~~~~~~
#
# Autor: Luiz Carlos Estraviz Rodriguez
#        Departamento de Ciências Florestais
#        ESALQ/USP - 17/Out/2022
#
# Inventário florestal da Fazenda Modelo
#   - download dos dados mantidos em um repositório público github
#      - shape files dos talhões florestais
#      - LiDAR multitemporal (2013 e 2014)
#   - armazenamento local na pasta C:/LiDAR/:
#
# Linguagem de programação:
#       R (v 4.2)
#       pacote lidR* (v 4.0.2 May 4th, 2022) Jean Romain Roussel
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rm(list=ls(all=TRUE))                                   # Limpa memória
gc()
options(timeout=1000) # Reset timeout oferecendo mais tempo de download

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Instala packages, caso ainda não tenham sido instalados
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if(!require(tidyverse))              # Para manipulação de tabelas tidy
  install.packages("tidyverse")
library(tidyverse)
if(!require(sf))                           # Para manipulação de shapes
  install.packages("sf")
library(sf)
if(!require(lidR))                    # Para manipulação de dados LiDAR
  install.packages("lidR")
library(lidR)
if(!require(foreach))                         # Para loops inteligentes
  install.packages("foreach")
library(foreach)
if(!require(kableExtra))                        # Para melhores tabelas
  install.packages("kableExtra")
library(kableExtra)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Download do shape da Fazenda Modelo (2 layers: talhoes e parcelas)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gitOnde <- "https://github.com/FlorestaR/dados/blob/main/5_LIDARF/Modelo/SHAPES"
gitNome <- "fazmodelo.zip"
gitArqv <- file.path(gitOnde, gitNome) %>% paste0("?raw=true")

tmpd <- tempdir(check = TRUE)                    # diretório temporário
zipf <- file.path(tmpd, "shapes.zip")              # arquivo temporário

if(!file.exists(zipf))  # garante download de dados binários (wb)
  download.file(gitArqv, mode="wb", destfile = zipf) 

unzip(zipf, exdir = tmpd)     # shape é unziped no diretório temporário
unlink(zipf)                                  # deleta o arquivo zipado

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Lê atributos dos talhoes
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
shpArq <- paste0(tmpd, "/Modelo_talhoes.shp")       # shape com talhões
talhoesComGeo <- sf::read_sf(shpArq)                # completo com geom
talhoesSemGeo <- tibble(sf::st_drop_geometry(talhoesComGeo))  # s/ geom

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Lê atributos das parcelas
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
shpArq <- paste0(tmpd, "/Modelo_parcelas.shp")     # shape com parcelas
parcelasComGeo <- sf::read_sf(shpArq)               # completo com geom
parcelasSemGeo <-tibble(sf::st_drop_geometry(parcelasComGeo)) # s/ geom

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Cria coluna IDINV na tabela "talhões", extraída da tabela "parcelas"
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
talhoes <-
parcelasSemGeo %>%
  group_by(SUBTALHAO) %>%
  summarise(IDINV = unique(IDINV)) %>%
  left_join(talhoesSemGeo) %>%
  select("SUBTALHAO", "IDINV", "AREA") %>%
  arrange(SUBTALHAO) %>% as.data.frame

talhoesComGeo <- inner_join(talhoesComGeo, talhoes, by="SUBTALHAO") %>%
  select("OBJECTID", "SUBTALHAO", "IDINV", "geometry")

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Reorganiza colunas da tabela "parcelas"
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
parcelas <-
  parcelasSemGeo %>%
  select(SUBTALHAO, CHAVE2, DATAREALIZ, IDINV, AREAPARCEL, MHDOM, VTCC, AB) %>% 
  arrange(SUBTALHAO) %>% as.data.frame

# Imprime tabela de talhões
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AreaTotal <- talhoes$AREA %>% sum
NotaDeRodape <- paste0(": ", AreaTotal)
talhoes %>%
  kbl(caption = "Talhões da Fazenda Modelo", align = "r") %>%
  kable_classic(full_width = F) %>%
  footnote(general = NotaDeRodape, 
           general_title = "Área total",
           footnote_as_chunk = T)

# Imprime tabela de parcelas
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
parcelas %>%
  kbl(caption = "Parcelas da Fazenda Modelo", align = "r") %>%
  kable_classic(full_width = F)

# Número Total de Unidades Amostrais (N) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
parcelaAreaMedia <- mean(parcelas$AREAPARCEL) / 10000           # em ha
tamanhoPopulacao <- round(AreaTotal / parcelaAreaMedia , 0)

# Mapa dos talhões com localização das parcelas (EPSG: 31983)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ggplot() +                # plot dos talhões e parcelas (col por idade)
  geom_sf(data =  talhoesComGeo, colour = "black", fill="white") +
  geom_sf(data = parcelasComGeo, aes(colour = IDINV)) +
  coord_sf(datum=st_crs(31983)) +        # Especifica sistema de coord.
  scale_y_continuous(breaks = seq(from=7356500,to=7359000, by=200)) +
  scale_x_continuous(breaks = seq(from=206200, to=207600,  by=200))

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Amostragem Casual Simples (ACS): VTCC estimação e inferência
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Função para cálculo do Intervalo de Confiança
calcCI = function(err, n, alpha=.05){
  return(
    qt(1 - alpha/2, n-1) * err #/ sqrt(n)
  )
}

# Função para cálculo dos parâmetros de estimação e inferência
calcPars = function(df, N, alpha=.05){
  means = apply(df, 2, mean)
  vars   = apply(df, 2, function(y){
    (var(y) / length(y)) * ((N - length(y)) / N)
  })
  err = sqrt(vars)
  cis = calcCI(err, nrow(df), alpha)
  err_pc = 100*cis/means
  out = rbind(means, vars, err, cis, err_pc, nrow(df)) %>% as.data.frame
  row.names(out) = c('media', 'var', 'dp', 'ic', 'erro', 'n')
  names(out) = names(df)
  return(out)
}

variaveisDeInteresse <- c("MHDOM", "VTCC", "AB")
df <- parcelas %>% select(all_of(variaveisDeInteresse))

simplePars  <- df %>% calcPars(tamanhoPopulacao)

# Função para cálculo da intensidade amostral recomendada
# (ha por parcela) da ACS que garante ~10% de erro 
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tamanhoIdealACS = function(y, N, errDesired=.10, alpha=.10){
  B  = errDesired * mean(y)
  qt = qt(1 - alpha/2, length(y)-1)
  n  = N*var(y)*qt^2 / (N * B^2 + qt^2 * var(y))
  return(n)
}
IA <- round(AreaTotal/tamanhoIdealACS(df$VTCC,tamanhoPopulacao),0)

# Resultados do inventário (estimação + inferência) por ACS
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IAS <- paste0(" usada: 1 parc/", round(AreaTotal/simplePars$VTCC[6],0), " ha.")
IAI <- paste0("\n Necessárias p/ erro de 10%: 1 parc/", IA, " ha.")
NotaDeRodape <- paste0(IAS, IAI)
simplePars %>%
  kbl(caption = "Amostragem Casual Simples", align = "r") %>%
  kable_classic(full_width = F) %>%
  footnote(general = NotaDeRodape,
           general_title = "Intensidade amostral",
           footnote_as_chunk = T)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Amostragem Casual Estratificada (ACE): VTCC estimação e inferência
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Grupos de estratificação
grupos = c("IDINV")
rightAges = talhoes$IDINV < 6 & talhoes$IDINV > 2

# Box-plot das variáveis de interesse por nível de estratificação
par(mfrow=c( length(grupos), length(variaveisDeInteresse) ))
attach(parcelas)
for(i in grupos){
  for(j in variaveisDeInteresse){
    plot( get(i) %>% factor , get(j), main = j, sub=i)
  }
}
detach(parcelas)

# Estimativa da população para amostragem estratificada
popFromStrata = function(factorStrataList){
  popEstimates = foreach(i = factorStrataList, .combine = 'c') %do% {
    gpMeans = lapply(i, function(x) x[1,,drop=F]) %>% do.call(what = rbind)
    gpVars  = lapply(i, function(x) x[2,,drop=F]) %>% do.call(what = rbind)
    cols = 1:(ncol(gpMeans)-4)
    popMean   = apply(gpMeans[,cols], 2, 
                      function(x) sum(x*gpMeans$N) ) /tamanhoPopulacao
    popVar    = apply(gpVars[,cols], 2, 
                      function(x) sum( x * (gpVars$N/tamanhoPopulacao)^2 ) )
    popStdErr = sqrt(popVar)
    popCI     = calcCI(popStdErr, sum(gpMeans$n))
    popPars = data.frame(
      media = popMean,
      var   = popVar,
      dp    = popStdErr,
      ic    = popCI,
      erro  = 100 * popCI / popMean,
      n     = sum( sapply(i, function(x) mean(x$n)) )
    )
    return(list(popPars))
  }
  names(popEstimates) = names(factorStrataList)
  return(popEstimates)
}

stratPars = foreach(
  grp = grupos, .combine = 'rbind') %:% 
  foreach(
    niv = parcelas[,grp] %>% unique %>% 
      as.character %>% sort, .combine = 'rbind'
  ) %do% {
  inGroup = talhoes[,grp] == niv
  popSize = round(
    sum(talhoes[rightAges & !is.na(inGroup) & inGroup,]$AREA) / 
      parcelaAreaMedia)
  inGroup = parcelas[,grp] == niv
  tempPars = parcelas[inGroup, variaveisDeInteresse, drop=F]
  inventory = calcPars(tempPars, popSize)
  inventory$grupo = grp
  inventory$nivel = niv
  inventory$n     = nrow(tempPars)
  inventory$N     = popSize
  return(inventory)
  }

stratPars %<>% base::split(f = stratPars$grupo) %>% 
  lapply(function(x) split(x, x$nivel))
globalStratPars = popFromStrata(stratPars)

# Intensidade amostral (ha por parcela) da ACE que garante ~10% de erro 
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tamanhoIdealACE = function(y, g, Nh, errDesired=.05){
  vars = by(y, g, stats::var)
  Wh   = by(y, g, length) / length(y)
  Nh = Nh[ names(Nh) %in% g ]
  B = errDesired * mean(y)
  n = sum( Nh^2 * vars / Wh ) / ( (sum(Nh)^2 * B^2)/4 + sum(Nh * vars) )
  }
stratAreas <- round(
  by(st_area(talhoesComGeo), talhoes$IDINV, sum) /
    (parcelaAreaMedia*10000), 0)
IA <- round(AreaTotal/tamanhoIdealACE(parcelas$VTCC,
                                      parcelas$IDINV, stratAreas, .10), 0)

# Resultados do inventário (estimação + inferência) por ACE
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IAS <- paste0(" usada: 1 parc/", round(AreaTotal/simplePars$VTCC[6],0), " ha.")
IAI <- paste0("\n Necessárias p/ erro de 10%: 1 parc/", IA, " ha.")
NotaDeRodape <- paste0(IAS, IAI)
globalStratPars[[grupos]] %>% t %>%             # transpõe o data frame
  kbl(caption = paste0("Amostragem Casual Estratificada por ", grupos),
      align = "r") %>%
  kable_classic(full_width = F) %>%
  footnote(general = NotaDeRodape,
           general_title = "Intensidade amostral",
           footnote_as_chunk = T)

# Gráfico para análise da precisão dos métodos amostrais
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
errs = 1:20
scsPlotn <- tamanhoIdealACS(parcelas$VTCC, tamanhoPopulacao,
                            errDesired = errs/100)
cssPlotn <- tamanhoIdealACE(parcelas$VTCC, parcelas$IDINV, stratAreas,
                            errDesired = errs/100)
# dsPlotn = dubleSamplePlotNumber(plotMetrics$PC_VOL_TOT,
#                                 plotMetrics$avgCrownHeight,
#                                 cropMetrics$avgCrownHeight, 300, errs/100)

png('nParcelas.png', 15, 10, 'cm', res = 200)
plot( scsPlotn ~ errs, type='l', col='red', lwd=2, 
      ylim=c(0,200), ylab='Número de parcelas', xlab='Erro amostral (%)',
      axes=F)
lines(errs, cssPlotn, col='green', lwd=2)
# lines(errs, dsPlotn, col='blue', lwd=2)
box()
axis(1)
axis(2, at = c(25, 50, 75, 100, 125, 150, 175, 200))
abline(v=10, col='black', lwd=2, lty=2)
lines(c(0,15), rep(100, 2), col='black', lty=2, lwd=2)
# lines(c(0,5), rep(dsPlotn[5], 2), col='blue', lty=2, lwd=2)
# lines(c(0,5), rep(cssPlotn[5], 2), col='green', lty=2, lwd=2)
legend('topright', col=rainbow(3), lwd=2,
       legend = c('ACS', 'ACE'))
       # legend = c('ACS', 'ACE', 'AD'))
dev.off()

# save.image(file='Modelo_inventario.RData')
# load('Modelo_inventario.RData')

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Leitura de dados LidAR
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# Define os nomes dos tiles LiDAR multitemporais que serão lidos do
# repositório, os respectivos anos e o URL completo do github
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gitOnde <-"https://github.com/FlorestaR/dados/blob/main/5_LIDARF/Modelo/CLOUDS/"
gitNome <-c("L0004-C0005.laz", "L0004-C0006.laz",
            "L0005-C0005.laz", "L0005-C0006.laz",
            "L0006-C0005.laz", "L0006-C0006.laz")
anoData <- c("A13", "A14")

# Cria diretórios e pastas para onde os tiles LiDAR serão copiados
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lidarDir <- "C:/LiDAR/";        dir.create(lidarDir, showWarnings = T)
lidarDir <- "C:/LiDAR/Modelo/"; dir.create(lidarDir, showWarnings = T)

# Faz o download dos tiles
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for (ano in anoData) {
   dirLAZ <- paste0(lidarDir, ano)
   dir.create(dirLAZ, showWarnings = T)
   for (nome in gitNome){
      gitFile <- paste0(gitOnde, ano, "/", ano, nome, "?raw=true")
      localFl <- paste0(dirLAZ, "/", nome)
      if(!file.exists(localFl))        # garante download binário (wb)
              download.file(gitFile, mode="wb", destfile = localFl)
   }
}

# Leitura dos dois catálogos de dados LiDAR (2013 e 2014)
# Exibe conteúdo do catálogo e confere se os mapas de tiles são iguais
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

dirLAZ1 <- paste0(lidarDir, anoData[1])
ctg1    <- readLAScatalog(dirLAZ1)
print(ctg1@data)
plot(ctg1)

dirLAZ2 <- paste0(lidarDir, anoData[2])
ctg2    <- readLAScatalog(dirLAZ2)
print(ctg2@data)
plot(ctg2)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Amostragem Dupla (AD): VTCC estimação e inferência
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Função ldiR
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
metricas <-function(z, RN){                              # métricas básicas
     if (length(z)<= 0) return(NULL)
     zKeep = z[RN == 1]
     metricas   <- list(
       n        <- length(z),  
       zmean    <- mean(z),
       zsd      <- sd(z),
       zskew    <- (sum((z - zmean)^3)/n)/(sum((z - zmean)^2)/n)^(3/2),
       zkurt    <- n * sum((z - zmean)^4)/(sum((z - zmean)^2)^2),
       zq25     <- quantile(z, 0.25),
       zq50     <- quantile(z, 0.50),
       zq75     <- quantile(z, 0.75),
       zq90     <- quantile(z, 0.90),
       zq95     <- quantile(z, 0.95),
       zq99     <- quantile(z, 0.99),
       zrelief  <- mean(z)/max(z),
       zabvmean <- (length(z[z>mean(z)])/length(z))*100,
       dns      <- length(z[z>7.0]) / length(z),
       DNT      <- (length(z[z>mean(z[zKeep])])/length(z))*100
     )
     names(metricas) <- c("n","zmean","zsd","zskew","zkurt",
                          "zq25","zq50","zq75","zq90","zq95","zq99",
                          "zrelief","zabvmean",
                          "dns", "DNT")
     return(metricas)
}
   
# Ajuste dos shapefiles
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   
shp1 <- parcelasSemGeo %>% filter(AREAPARCEL == 380.13) 
shp2 <- parcelasSemGeo %>% filter(AREAPARCEL == 399.73)
   
   
sf1 <- sf::st_as_sf(shp1, coords = c("LAT_UTM23S","LONG_UTM23"), crs = st_crs(31982))
plot(sf1[2])
dub_buffer1 <-  st_buffer(sf1, 11)
plot(dub_buffer1[2])
   
sf2 <- sf::st_as_sf(shp2, coords = c("LAT_UTM23S","LONG_UTM23"), crs = st_crs(31982))
plot(sf2[2])
dub_buffer2 <-  st_buffer(sf2, 11.28)
plot(dub_buffer2[2])
   
parcelasComGeo <- rbind(dub_buffer1, dub_buffer2)
plot(parcelasComGeo[1])
   
pontos        <- rbind(sf1, sf2)
   
# Gera os pixel metrics
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#metrics = read.csv(paste0(wrkDir,'/RESLTS/all_inf.csv'))[,-1]
opt_chunk_buffer(ctg1) <- 25
opt_filter(ctg1) <- "-drop_z_below 0" # Ignora pontos abaixo de 0
metrics   <- pixel_metrics(ctg1,~metricas(Z, ReturnNumber), res = 20, pkg = "terra")
plot(metrics$zmean)
metrics   <- raster::crop(metrics,talhoesComGeo)
resultDir <- paste0('C:/3D/ALS/Modelo/RESLTS/')
dir.create(resultDir)
write.csv(metrics, paste0(resultDir,'pixel_metrics.csv'))
metrics   <- read.csv(paste0(resultDir,'pixel_metrics.csv'))
plot(talhoesComGeo)
# Métricas das parcelas
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
opt_chunk_buffer(ctg2) <- 25
opt_filter(ctg2)       <- "-drop_z_below 0" # Ignora pontos abaixo de 0
spatialPlotMetrics <- plot_metrics(ctg1, ~metricas(Z, ReturnNumber), pontos, radius = 11.28)
spatialPlotMetrics <- spatialPlotMetrics %>% st_drop_geometry()
 
# Funções para a
# Amostragem dupla
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
doubleSampleRegPars = function(y, x, xLarge, alpha=.05){
     n = length(y)
     beta = ( sum(y*x, na.rm=T) - ( sum(x, na.rm=T)*sum(y, na.rm=T) / n ) ) / ( sum(x^2, na.rm=T) - (sum(x, na.rm=T)^2 / n) )
     
     rho = cor(y,x)
     N = length(xLarge)
     
     ydsr = mean(y, na.rm=T) + beta * ( mean(xLarge, na.rm=T) - mean(x, na.rm=T) )
     vardsr = (var(y, na.rm=T)/n)*(1 - (rho^2)*(N-n)/N)
     stderr = sqrt(vardsr)
     ci     = calcCI(stderr, n, alpha)
     
     out = c(media = ydsr, var = vardsr, dp = stderr, ic = ci, erro = 100*ci/ydsr, n=n, rho=rho)
     
     return(out)
}
# ideal number of plots for double sampling
dubleSamplePlotNumber = function(y, x, xLarge, Cpg = 300, errDesired = .05, alpha = .05){
     
     rho = cor(x,y)
     a = var(y) * (1 - rho^2)
     b = var(y) * rho^2
     
     B = errDesired * mean(y)
     qt = qt(1 - alpha/2, length(y)-1)
     
     nG = (sqrt( a*b*Cpg ) + b) / (B^2 / qt^2)
     nP = (sqrt( a*b/Cpg ) + a) / (B^2 / qt^2)
     
     return(nP)
}
   
   
spatialPlotMetrics  <- spatialPlotMetrics  %>% mutate(VTCC = ifelse(VTCC <50, VTCC*10,VTCC))
   
lims = spatialPlotMetrics %>% names %in% c('zmean', 'DNT') %>% which
lidarOnly = spatialPlotMetrics[,lims[1]:lims[2]]
   
interestVars = c('MHDOM','VTCC', 'AB')
corrMat = cor(spatialPlotMetrics[,interestVars], lidarOnly)
corrMat = corrMat[,apply(corrMat, 2, function(x) !any(is.na(x)))]

handPick = c('zq99', 'zq99', 'zq99')
vars     = c('MHDOM','VTCC', 'AB')
handp    = as.data.frame(cbind(vars, handPick))
doubleSamplePars = foreach(i = interestVars, .combine = 'rbind') %do% {
     aux = corrMat[i,]
     #pick = which( aux == max(aux) ) %>% names
     pick = handp$handPick[vars == i]
     XL = metrics[,pick]
     
     est = doubleSampleRegPars(spatialPlotMetrics[,i], spatialPlotMetrics[,pick], XL) %>% data.frame()
     #est = doubleSampleRatioPars(spatialPlotMetrics[,i], spatialPlotMetrics[,pick], XL, populationSize) %>% data.frame()
     names(est) = i
     
     est %<>% t %>% as.data.frame
     est$aux = pick
     
     return(est)
}
   
doubleSamplePars <- doubleSamplePars %>% select(-rho) %>% t()
   
doubleSamplePars %>%
kbl(caption = "Amostragem Dupla", align = "r") %>%
kable_classic(full_width = F) 
   
   # Gráfico para análise da precisão dos métodos amostrais
   # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   errs = 1:20
   scsPlotn <- tamanhoIdealACS(parcelas$VTCC, tamanhoPopulacao,
                               errDesired = errs/100)
   cssPlotn <- tamanhoIdealACE(parcelas$VTCC, parcelas$IDINV, stratAreas,
                               errDesired = errs/100)
   dsPlotn = dubleSamplePlotNumber(spatialPlotMetrics$VTCC,
                                   spatialPlotMetrics$zq99,
                                   metrics$zq99, 300, errs/100)
   
   png('nParcelas.png', 15, 10, 'cm', res = 200)
   plot( scsPlotn ~ errs, type='l', col='red', lwd=2, 
         ylim=c(0,200), ylab='Número de parcelas', xlab='Erro amostral (%)',
         axes=F)
   lines(errs, cssPlotn, col='green', lwd=2)
   lines(errs, dsPlotn, col='blue', lwd=2)
   box()
   axis(1)
   axis(2, at = c(25, 50, 75, 100, 125, 150, 175, 200))
   abline(v=10, col='black', lwd=2, lty=2)
   lines(c(0,15), rep(100, 2), col='black', lty=2, lwd=2)
   lines(c(0,5), rep(dsPlotn[5], 2), col='blue', lty=2, lwd=2)
   lines(c(0,5), rep(cssPlotn[5], 2), col='green', lty=2, lwd=2)
   legend('topright', col=rainbow(3), lwd=2,
   legend = c('ACS', 'ACE', 'AD'))
   dev.off()
   
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Este script foi criado em Julho/2022 depois de instalar, na seguinte
# sequência, as mais recentes versões do pacote lidR*:
#
#   devtools::install_github("Jean-Romain/rlas", dependencies=TRUE)
#   devtools::install_github("Jean-Romain/lidR")
#
#   * lidR latest development version
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Referências sobre o pacote lidR para processamento de dados LiDAR:

e sobre os pacotes terra e sf para processamento de dados espaciais:

lidar/projetos/rcode_alsmodelo.1699805370.txt.gz · Última modificação: 2024/03/23 20:17 (edição externa)