lidar:projetos:rcode_invcomlidar
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anteriorRevisão anteriorPróxima revisão | Revisão anterior | ||
lidar:projetos:rcode_invcomlidar [2023/11/28 04:16] – lcer | lidar:projetos:rcode_invcomlidar [2024/03/23 20:17] (atual) – edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 7: | Linha 7: | ||
# Autor: Luiz Carlos Estraviz Rodriguez | # Autor: Luiz Carlos Estraviz Rodriguez | ||
# Departamento de Ciências Florestais | # Departamento de Ciências Florestais | ||
- | # ESALQ/USP - 27/Nov/2023 | + | # ESALQ/USP - 02/Dez/2023 |
# | # | ||
# Inventário florestal da Fazenda Modelo | # Inventário florestal da Fazenda Modelo | ||
Linha 23: | Linha 23: | ||
# | # | ||
# | # | ||
+ | # Bibliografia complementar: | ||
+ | # https:// | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
rm(list=ls(all=TRUE)) | rm(list=ls(all=TRUE)) | ||
gc() | gc() | ||
+ | |||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # 1. Leitura | + | # 1. Carrega pacotes, organiza pastas |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | ||
- | if(!require(tidyverse)) | + | if(!require(tidyverse)) |
install.packages(" | install.packages(" | ||
library(tidyverse) | library(tidyverse) | ||
- | # Define pastas e local de trabalho | + | if(!require(sf)) |
+ | install.packages(" | ||
+ | library(sf) | ||
+ | |||
+ | if(!require(tidyterra)) | ||
+ | install.packages(" | ||
+ | library(tidyterra) | ||
+ | |||
+ | if(!require(terra)) | ||
+ | install.packages(" | ||
+ | library(terra) | ||
+ | |||
+ | if(!require(stars)) | ||
+ | install.packages(" | ||
+ | library(stars) | ||
+ | |||
+ | if(!require(tools)) | ||
+ | install.packages(" | ||
+ | library(tools) | ||
+ | |||
+ | if(!require(RColorBrewer)) | ||
+ | install.packages(" | ||
+ | library(RColorBrewer) | ||
+ | |||
+ | if(!require(progress)) | ||
+ | install.packages(" | ||
+ | library(progress) | ||
+ | |||
+ | if(!require(reshape2)) | ||
+ | install.packages(" | ||
+ | library(reshape2) | ||
+ | |||
+ | if(!require(mapview)) | ||
+ | install.packages(" | ||
+ | library(mapview) | ||
+ | |||
+ | # devtools:: | ||
+ | # devtools:: | ||
+ | if(!require(lidR)) | ||
+ | install.packages(" | ||
+ | library(lidR) | ||
+ | # alternativamente as duas linhas acima | ||
+ | |||
+ | if(!require(RCSF)) | ||
+ | install.packages(" | ||
+ | library(RCSF) | ||
+ | |||
+ | if(!require(future)) | ||
+ | install.packages(" | ||
+ | library(future) | ||
+ | cores <- as.integer(parallel:: | ||
+ | plan(multisession, | ||
+ | |||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # Define pastas e local de trabalho | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
prjNam <- " | prjNam <- " | ||
- | wrkDir | + | dirProjet |
- | if (!dir.exists(wrkDir)) { | + | if (!dir.exists(dirProjet)) { # Cria diretório |
dir.create(' | dir.create(' | ||
- | dir.create(wrkDir, showWarnings = F) | + | dir.create(dirProjet, showWarnings = F) |
} | } | ||
- | setwd(wrkDir) # Define pasta default de trabalho | + | setwd(dirProjet) |
datDir <- str_c(' | datDir <- str_c(' | ||
Linha 57: | Linha 114: | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Define | + | # Este bloco cria funções que permitem produzir gráficos esteticamente |
- | # repositório, os respectivos anos e o URL completo | + | # caprichados para apresentar |
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # Parâmetros | ||
+ | txt.size = 6 | ||
+ | thm.size = (14/5) * txt.size | ||
+ | |||
+ | Tema <- theme( | ||
+ | axis.line | ||
+ | axis.text.x | ||
+ | axis.title.y = element_blank(), | ||
+ | axis.text.y | ||
+ | axis.ticks | ||
+ | legend.justification = c(1, 0), | ||
+ | legend.position | ||
+ | legend.text | ||
+ | legend.title = element_blank(), | ||
+ | panel.border | ||
+ | panel.background = element_blank(), | ||
+ | panel.grid.major = element_line(colour = " | ||
+ | title = element_text(size = thm.size, colour=" | ||
+ | plot.background = element_rect(colour = " | ||
+ | ) | ||
+ | |||
+ | # Função para reordenamento da cormat (correlation matrix) | ||
+ | reorder_cormat <- function(cormat){ | ||
+ | # Use correlation between variables as distance | ||
+ | dd <- as.dist((1-cormat)/ | ||
+ | hc <- hclust(dd) | ||
+ | cormat < | ||
+ | } | ||
+ | |||
+ | # Função para definição | ||
+ | get_upper_tri <- function(cormat){ | ||
+ | cormat[lower.tri(cormat)]< | ||
+ | return(cormat) | ||
+ | } | ||
+ | |||
+ | # Função para embelazamento da cormat | ||
+ | graphCormat <- function(cormat){ | ||
+ | # Resets font size for correlation matrix graph | ||
+ | txt.size = 6 | ||
+ | thm.size = (14/5) * txt.size | ||
+ | upper_tri <- get_upper_tri(cormat) | ||
+ | # Melt the correlation matrix | ||
+ | melted_cormat <- melt(upper_tri, na.rm = TRUE) | ||
+ | p <- ggplot(melted_cormat, | ||
+ | geom_tile(color = " | ||
+ | scale_fill_gradient2(low = " | ||
+ | | ||
+ | | ||
+ | coord_fixed() + | ||
+ | geom_text(aes(Var2, | ||
+ | theme( | ||
+ | axis.line | ||
+ | axis.title.x = element_blank(), | ||
+ | axis.text.x | ||
+ | axis.title.y = element_blank(), | ||
+ | axis.text.y | ||
+ | axis.ticks | ||
+ | legend.direction = " | ||
+ | legend.justification = c(1, 0), | ||
+ | legend.position | ||
+ | legend.text | ||
+ | panel.border | ||
+ | panel.background = element_blank(), | ||
+ | panel.grid.major = element_line(colour = " | ||
+ | title = element_text(size = thm.size, colour=" | ||
+ | plot.background = element_rect(colour = " | ||
+ | ) + | ||
+ | guides(fill = guide_colorbar(barwidth = 7, barheight = 1, | ||
+ | | ||
+ | return(p) | ||
+ | } | ||
+ | |||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # Estimativas. | ||
+ | # da amostragem dupla (double sampling) | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | dsStats = function(y, x, xLarge, alpha=.05){ | ||
+ | n = length(y) | ||
+ | beta = ( sum(y*x, na.rm=T) - ( sum(x, na.rm=T)*sum(y, | ||
+ | |||
+ | rho = cor(y,x) | ||
+ | N = length(xLarge) | ||
+ | |||
+ | ydsr = mean(y, na.rm=T) + beta * ( mean(xLarge, | ||
+ | vardsr = (var(y, na.rm=T)/ | ||
+ | stderr = sqrt(vardsr) | ||
+ | ci = calcCI(stderr, | ||
+ | |||
+ | out = c(media = ydsr, var = vardsr, dp = stderr, ic = ci, erro = 100*ci/ | ||
+ | |||
+ | return(out) | ||
+ | } | ||
+ | |||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # Cálculo do número ideal de unidades amostrais em double sampling, ou | ||
+ | # seja, da intensidade amostral necessária para gerar o erro admissível | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | dsNumberOfPlots = function(y, x, xLarge, Cpg = 300, | ||
+ | | ||
+ | |||
+ | 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) | ||
+ | } | ||
+ | |||
+ | # ---- | ||
+ | |||
+ | |||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # 2. Leitura de dados | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | ||
+ | |||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # Define o nome do arquivo com os dados espacializados disponíveis para | ||
+ | # a área de estudo, faz o download e salva esses dados na devida pasta | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
gitOnde <- | gitOnde <- | ||
Linha 68: | Linha 249: | ||
# anoData <- c(" | # anoData <- c(" | ||
- | # Faz o download | + | # Download |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
options(timeout=1000) # Reset timeout oferecendo mais tempo de download | options(timeout=1000) # Reset timeout oferecendo mais tempo de download | ||
for (ano in anoData) { # guarda na sub-pasta de dados LiDAR por ano | for (ano in anoData) { # guarda na sub-pasta de dados LiDAR por ano | ||
- | | + | |
dir.create(dirLAZ, | dir.create(dirLAZ, | ||
for (nome in gitNome){ | for (nome in gitNome){ | ||
Linha 83: | Linha 264: | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Download dos shapes da Fazenda Modelo (2 layers: talhoes | + | # Define o nome do arquivo com os dados espacializados disponíveis para |
+ | # a área de estudo, faz o download | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
gitOnde <- | gitOnde <- | ||
Linha 93: | Linha 275: | ||
zipf <- file.path(tmpd, | zipf <- file.path(tmpd, | ||
+ | # Download e unzip do coonteúdo do arquivo zipado | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
options(timeout=1000) | options(timeout=1000) | ||
if(!file.exists(zipf)) { | if(!file.exists(zipf)) { | ||
Linha 98: | Linha 282: | ||
} | } | ||
- | shpDir <- str_c(wrkDir, '/ | + | shpDir <- str_c(dirProjet, '/ |
if (!dir.exists(shpDir)) { # Cria diretório caso não exista | if (!dir.exists(shpDir)) { # Cria diretório caso não exista | ||
dir.create(shpDir, | dir.create(shpDir, | ||
Linha 107: | Linha 291: | ||
# ---- | # ---- | ||
- | |||
- | # ********************************************************************* | ||
- | # 2: O processamento da variável auxiliar LiDAR começa aqui | ||
- | # **************************************************************** ---- | ||
- | # devtools:: | ||
- | # devtools:: | ||
- | if(!require(lidR)) | ||
- | install.packages(" | ||
- | # e tiver o package devtools instalado, rode | ||
- | # alternativamente as duas linhas acima. | ||
- | library(lidR) | ||
- | |||
- | if(!require(future)) | ||
- | install.packages(" | ||
- | library(future) | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Define quantos cores vão ser usados no processamento paralelo | + | # 3. Processamento da variável auxiliar LiDAR e estudo da correlação |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | # das métricas LiDAR com os parâmetros de interesse |
- | cores <- as.integer(parallel:: | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- |
- | if (cores > 4L){cores <- cores - 1L} else {cores <- 3L} | + | |
- | plan(multisession, | + | |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
Linha 137: | Linha 304: | ||
ctg_orig <- readLAScatalog(dirLAZ) # LEITURA DAS NUVENS DE PONTOS LiDAR | ctg_orig <- readLAScatalog(dirLAZ) # LEITURA DAS NUVENS DE PONTOS LiDAR | ||
opt_select(ctg_orig) <- " | opt_select(ctg_orig) <- " | ||
- | plot(ctg_orig) | ||
- | |||
- | if(!require(mapview)) | ||
- | install.packages(" | ||
- | library(mapview) | ||
- | plot(ctg_orig, | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
# Lê shape e atributos dos talhoes | # Lê shape e atributos dos talhoes | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | if(!require(sf)) | ||
- | install.packages(" | ||
- | library(sf) | ||
shpArq | shpArq | ||
tal_shp <- st_read(shpArq) | tal_shp <- st_read(shpArq) | ||
st_is_valid(tal_shp) | st_is_valid(tal_shp) | ||
- | plot(tal_shp, | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
Linha 169: | Linha 326: | ||
opt_laz_compression(ctg_orig) <- TRUE # Mantém formato LAZ | opt_laz_compression(ctg_orig) <- TRUE # Mantém formato LAZ | ||
ctg_talh = clip_roi(ctg_orig, | ctg_talh = clip_roi(ctg_orig, | ||
- | plot(ctg_talh, | ||
# Para plotar a nuvem LiDAR de um dos talhões no catálogo ctg_tal, | # Para plotar a nuvem LiDAR de um dos talhões no catálogo ctg_tal, | ||
Linha 182: | Linha 338: | ||
# ... espere até que o sinal " | # ... espere até que o sinal " | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | if(!require(RCSF)) # Pacote complementar da função classify_ground() | + | dirNoN <- str_c(dirTal, |
- | | + | if (!dir.exists(dirNoN)) { |
- | library(RCSF) | + | |
- | opt_output_files(ctg_talh) <- str_c(tempdir(), "/ | + | } |
- | ctg_grnd | + | opt_output_files(ctg_talh) <- str_c(dirNoN, "/ |
+ | ctg_gNoN | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
# Normaliza as nuvens de pontos dos talhões | # Normaliza as nuvens de pontos dos talhões | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | dirNrm <- str_c(dirLAZ, '/NRMLZD' | + | dirNrm <- str_c(dirTal, '/SiNORM' |
if (!dir.exists(dirNrm)) { | if (!dir.exists(dirNrm)) { | ||
dir.create(dirNrm, | dir.create(dirNrm, | ||
} | } | ||
- | dirTaN <- str_c(dirNrm, | + | opt_output_files(ctg_gNoN |
- | if (!dir.exists(dirTaN)) { | + | ctg_gSiN |
- | dir.create(dirTaN, | + | |
- | } | + | |
- | opt_output_files(ctg_grnd) <- str_c(dirTaN, "/ | + | |
- | ctg_taln | + | |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Cria um novo conjunto de tiles normalizados contendo apenas os pontos | + | # Retile |
- | # LiDAR dentro | + | # mais apropriado para a correta clipagem das parcelas |
- | # criado no passo anterior. | + | |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | opt_output_files(ctg_taln) <- # Onde guardar as nuvens normalizadas | + | dirTNrm <- str_c(dirNrm, |
- | str_c(dirNrm, "/FazMod_{XLEFT}_{YBOTTOM}_n" | + | if (!dir.exists(dirTNrm)) { |
- | opt_chunk_buffer(ctg_taln) <- 0 # sem buffers ao redor de cada tile | + | dir.create(dirTNrm, |
- | opt_chunk_size(ctg_taln) <- 300 # em tiles de 300 m | + | } |
- | opt_laz_compression(ctg_taln) <- TRUE # Mantém formato LAZ | + | # ctg_gSiN <- readLAScatalog(dirTNrm) |
- | ctg_tile <- catalog_retile(ctg_taln) # e executa | + | opt_output_files(ctg_gSiN) <- # Onde guardar as nuvens normalizadas |
- | plot(ctg_tile, chunk = TRUE) | + | str_c(dirTNrm, "/FzMod_{XLEFT}_{YBOTTOM}" |
- | plot(ctg_tile, mapview = TRUE, map.type = " | + | opt_chunk_buffer(ctg_gSiN) <- 0 # sem buffers ao redor de cada tile |
+ | opt_chunk_size(ctg_gSiN) <- 300 # em tiles de 300 m | ||
+ | opt_laz_compression(ctg_gSiN) <- TRUE # Mantém formato LAZ | ||
+ | ctg_tile <- catalog_retile(ctg_gSiN) # e executa | ||
+ | rm(ctg_gNoN, ctg_gSiN, ctg_orig, ctg_talh) # limpa da memória catálogos | ||
+ | # Lê shape e atributos das parcelas p/ acessar parâmetros de interesse | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Lê os centróides das parcelas de inventário convencional | + | shpPar |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | par_shp <- st_read(shpPar) |
- | shpArq | + | |
- | par_shp <- st_read(shpArq) | + | |
st_is_valid(par_shp) | st_is_valid(par_shp) | ||
- | # ---- | ||
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | dirParc |
- | # Este bloco cria funções que permitem produzir gráficos esteticamente | + | if (!dir.exists(dirParc)) { |
- | # caprichados para apresentar os índices de correlação de Pearson | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | + | |
- | # Parâmetros dos gráficos | + | |
- | txt.size = 6 | + | |
- | thm.size = (14/5) * txt.size | + | |
- | + | ||
- | Tema <- theme( | + | |
- | axis.line | + | |
- | axis.text.x | + | |
- | axis.title.y = element_blank(), | + | |
- | axis.text.y | + | |
- | axis.ticks | + | |
- | legend.justification = c(1, 0), | + | |
- | legend.position | + | |
- | legend.text | + | |
- | | + | |
- | panel.border | + | |
- | panel.background = element_blank(), | + | |
- | | + | |
- | title = element_text(size = thm.size, colour=" | + | |
- | plot.background = element_rect(colour = " | + | |
- | ) | + | |
- | + | ||
- | # Função para reordenamento da cormat (correlation matrix) | + | |
- | reorder_cormat <- function(cormat){ | + | |
- | # Use correlation between variables as distance | + | |
- | dd <- as.dist((1-cormat)/ | + | |
- | hc <- hclust(dd) | + | |
- | cormat < | + | |
} | } | ||
- | # Função para definição do triângulo superior da cormat | + | # Exibe localização dos tiles, talhoes e parcelas |
- | get_upper_tri <- function(cormat){ | + | |
- | cormat[lower.tri(cormat)]< | + | |
- | return(cormat) | + | |
- | } | + | |
- | + | ||
- | # Função para embelazamento da cormat | + | |
- | if(!require(reshape2)) | + | |
- | install.packages(" | + | |
- | library(reshape2) | + | |
- | graphCormat <- function(cormat){ | + | |
- | # Resets font size for correlation matrix graph | + | |
- | txt.size = 6 | + | |
- | thm.size = (14/5) * txt.size | + | |
- | upper_tri <- get_upper_tri(cormat) | + | |
- | # Melt the correlation matrix | + | |
- | melted_cormat <- melt(upper_tri, na.rm = TRUE) | + | |
- | p <- ggplot(melted_cormat, | + | |
- | geom_tile(color = " | + | |
- | scale_fill_gradient2(low = " | + | |
- | | + | |
- | | + | |
- | coord_fixed() + | + | |
- | geom_text(aes(Var2, | + | |
- | theme( | + | |
- | axis.line | + | |
- | axis.title.x = element_blank(), | + | |
- | axis.text.x | + | |
- | axis.title.y = element_blank(), | + | |
- | axis.text.y | + | |
- | axis.ticks | + | |
- | legend.direction = " | + | |
- | legend.justification = c(1, 0), | + | |
- | legend.position | + | |
- | legend.text | + | |
- | panel.border | + | |
- | panel.background = element_blank(), | + | |
- | panel.grid.major = element_line(colour = " | + | |
- | title = element_text(size = thm.size, colour=" | + | |
- | plot.background = element_rect(colour = " | + | |
- | ) + | + | |
- | guides(fill = guide_colorbar(barwidth = 7, barheight = 1, | + | |
- | | + | |
- | return(p) | + | |
- | } | + | |
- | # ----- | + | |
- | + | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Estudo da correlação das métricas LiDAR com parâmetros de interesse | + | plot(ctg_tile, |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | + | plot(ctg_tile) |
- | opt_filter(ctg_tile) | + | plot(tal_shp, |
+ | plot(par_shp, | ||
- | # Cálculo " | + | # Clipa e salva as núvens das parcelas, e calcula |
- | # para cada " | + | # métricas |
+ | # normalizados usando a função .stdmetrics_z de métricas genéricas | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | opt_output_files(ctg_tile) <- # Onde guardar as nuvens das parcelas | ||
+ | str_c(dirParc, | ||
+ | opt_select(ctg_tile) <- " | ||
+ | opt_filter(ctg_tile) <- " | ||
D <- plot_metrics(ctg_tile, | D <- plot_metrics(ctg_tile, | ||
Linha 318: | Linha 403: | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
X <- tibble(D) %>% select(VTCC, | X <- tibble(D) %>% select(VTCC, | ||
- | | + | |
+ | | ||
# Prepara o gráfico para análise das correlações | # Prepara o gráfico para análise das correlações | ||
Linha 326: | Linha 412: | ||
p <- graphCormat(cormat) | p <- graphCormat(cormat) | ||
- | grfDir <- str_c(wrkDir, '/ | + | grfDir <- str_c(dirProjet, '/ |
if (!dir.exists(grfDir)) { # Cria pasta, caso não exista | if (!dir.exists(grfDir)) { # Cria pasta, caso não exista | ||
dir.create(grfDir, | dir.create(grfDir, | ||
} | } | ||
- | fileGrf <- str_c(grfDir, | + | fileGrf <- str_c(grfDir, |
- | nomeGrf | + | tituGrf |
# Abre " | # Abre " | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | jpeg(fileGrf, | + | jpeg(fileGrf, |
- | plot(p + labs(title=nomeGrf)) | + | plot(p + labs(title=tituGrf)) |
dev.off() | dev.off() | ||
Linha 343: | Linha 429: | ||
# determinação do modelo de predição. | # determinação do modelo de predição. | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | m <- lm(VTCC ~ zq90 + IDINV, data = X) # Análise de Regressão Linear | + | m <- lm(VTCC ~ zq95 + IDINV, data = X) # Análise de Regressão Linear |
summary(m) | summary(m) | ||
plot(X$VTCC, | plot(X$VTCC, | ||
abline(0,1) | abline(0,1) | ||
+ | |||
+ | # ---- | ||
+ | |||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Gera métricas | + | # 4. Criação de mapas raster com as métricas |
+ | # É possível processar a partir deste bloco, desde que já tenham | ||
+ | # sido processadas as linhas 1 a 229 (Bloco 1.) | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | ||
+ | prjNam | ||
+ | dirRaizNuvens <- str_c(' | ||
+ | dirDadosLiDAR <- str_c(dirRaizNuvens, | ||
+ | |||
+ | # Lê catálogo de com as núvens por talhão normalizadas | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # É possível gerar uma função que calcula qualquer métrica desejada. | + | ctg_taln <- readLAScatalog(dirDadosLiDAR) |
- | # A função | + | nNuvens |
+ | |||
+ | # Criação de mapas raster formato tif para as métricas de interesse | ||
+ | # | ||
+ | # | ||
+ | # zsd, zskew, zkurt, zentropy, pzabovezmean, | ||
+ | # zq15, zq20, zq25, zq30, zq35, zq40, zq45, zq50, zq55, zq60, zq65, | ||
+ | # zq70, zq75, zq80, zq85, zq90, zq95, zpcum1, zpcum2, zpcum3, zpcum4, | ||
+ | # | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | metriLiDAR | + | interesse |
- | if (length(z)< | + | |
- | | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | | + | # Criação de mapas raster para a métrica de interesse |
- | | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | | + | dirDadosRaster <- str_c(dirDadosLiDAR, |
- | | + | if (!dir.exists(dirDadosRaster)) { |
- | | + | dir.create(dirDadosRaster, |
- | | + | } |
- | ) | + | |
- | | + | pb <- progress_bar$new(total |
- | " | + | for (i in 1:nNuvens) { |
- | | + | |
+ | | ||
+ | |||
+ | | ||
+ | filter = " | ||
+ | |||
+ | pb$tick() | ||
+ | inteRaster | ||
+ | | ||
+ | |||
+ | rstNome | ||
+ | | ||
+ | |||
+ | pb$tick() # Avança barra de progresso | ||
+ | | ||
+ | # Cria parâmetros para melhorar a legenda do gráfico raster | ||
+ | minL = round(minmax(inteRaster)[1])-1 # Menor valor no raster | ||
+ | maxL = round(minmax(inteRaster)[2])+1 # Maior valor no raster | ||
+ | brkL = round((maxL - minL) / 5) # Legenda com cinco breaks | ||
+ | intL = c(minL + brkL, minL + 2*brkL, minL + 3*brkL, minL + 4*brkL) | ||
+ | | ||
+ | | ||
+ | ' | ||
+ | p <- ggplot() + geom_spatraster(data = inteRaster, aes()) + | ||
+ | guides(fill = guide_legend(reverse=F)) + | ||
+ | coord_sf(datum=st_crs(31983)) + # Gráfico numa certa projeção | ||
+ | scale_fill_whitebox_c(palette = "atlas", | ||
+ | breaks = intL, limits = limL)+ggtitle(titulo) | ||
+ | | ||
+ | print(p) | ||
+ | | ||
} | } | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Produz mapas " | + | # !!! Método alternativo: |
- | # para cada talhão | + | # Criação de mapas raster |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # dirDadosRaster <- str_c(dirDadosLiDAR, | ||
+ | # if (!dir.exists(dirDadosRaster)) { | ||
+ | # | ||
+ | # } | ||
+ | # | ||
+ | # pb <- progress_bar$new(total = 2*nNuvens) # Reset da barra de progresso | ||
+ | # for (i in 1:nNuvens) { | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # las <- readLAS(nuvem, | ||
+ | # filter = " | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # # Cria parâmetros para melhorar a legenda do gráfico raster | ||
+ | # minL = round(minmax(inteRaster)[1])-1 | ||
+ | # maxL = round(minmax(inteRaster)[2])+1 | ||
+ | # brkL = round((maxL - minL) / 5) # Legenda com cinco breaks | ||
+ | # intL = c(minL + brkL, minL + 2*brkL, minL + 3*brkL, minL + 4*brkL) | ||
+ | # limL = c(minL, maxL) | ||
+ | # | ||
+ | # ' | Mín: ', minL, ' | Máx: ', maxL) | ||
+ | # p <- ggplot() + geom_spatraster(data = inteRaster, aes()) + | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # } | ||
- | # Mapa raster | + | # Cálculo de mapas raster |
+ | # criados nos passos anteriores. | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | nuvem <- ctg_taln$filename[1] | + | ctg_taln <- readLAScatalog(dirDadosLiDAR) |
- | las <- readLAS(nuvem, filter = " | + | nNuvens |
- | map <- hexagon_metrics(las, metriLiDAR(Z), | + | |
- | plot(map, pal = heat.colors, | + | |
- | # Mapa raster | + | # Criação de mapas raster |
+ | # | ||
+ | # | ||
+ | # | ||
+ | # zq40, zq45, zq50, zq55, zq60, zq65, zq70, zq75, zq80, zq85, zq90, | ||
+ | # zq95, zpcum1, zpcum2, zpcum3, zpcum4, zpcum5, zpcum6, zpcum7, | ||
+ | # | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | nuvem <- ctg_taln$filename[2] | + | interesse |
- | las <- readLAS(nuvem, | + | |
- | map <- hexagon_metrics(las, | + | |
- | plot(map, pal = heat.colors, | + | |
- | # Mapa raster | + | # Criação |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | nuvem <- ctg_taln$filename[3] | + | listaRasters <- list() |
- | las <- readLAS(nuvem, filter = " | + | for (i in 1:nNuvens) { |
- | map <- pixel_metrics(las, metriLiDAR(Z), res = 10) | + | |
- | plot(map, pal = heat.colors, axes = TRUE, key.pos = NULL, reset = FALSE) | + | |
+ | | ||
+ | |||
+ | listaRasters[[i]] <- rast(rstNome) | ||
+ | } | ||
- | # Mapa raster | + | # Junta os rasters para gerar um mapa único com a métrica |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | nuvem <- ctg_taln$filename[4] | + | rastersJuntos |
- | las <- readLAS(nuvem, filter = " | + | |
- | map <- pixel_metrics(las, | + | |
- | plot(map, pal = heat.colors, | + | |
- | # ---- | + | |
+ | # Cria gráfico caprichado da métrica de interesse com todos os rasters | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | minL = round(minmax(rastersJuntos)[1])-1 | ||
+ | maxL = round(minmax(rastersJuntos)[2])+1 | ||
+ | brkL = round((maxL - minL) / 5) # Legenda com cinco breaks | ||
+ | intL = c(minL + brkL, minL + 2*brkL, minL + 3*brkL, minL + 4*brkL) | ||
+ | limL = c(minL, maxL) | ||
+ | titulo | ||
+ | ' | ||
+ | p <- ggplot() + geom_spatraster(data = rastersJuntos, | ||
+ | guides(fill = guide_legend(reverse=F)) + | ||
+ | coord_sf(datum=st_crs(31983)) + # Gráfico numa certa projeção | ||
+ | scale_fill_whitebox_c(palette = " | ||
+ | breaks = intL, limits = limL)+ggtitle(titulo) | ||
+ | rstNome <- str_c(dirDadosRaster, | ||
+ | png(rstNome, | ||
+ | print(p) | ||
+ | dev.off() | ||
+ | # Lê o arquivo shape com os limites e atributos dos talhoes | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | dirShape <- str_c(' | ||
+ | arqShape <- str_c(dirShape, | ||
- | # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | + | # Cria estrutura de dados (data frame) com os atributos dos talhoes |
- | # AGORA É SUA VEZ | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | # ESTUDO DIRIGIDO ... | + | poligonos <- vect(arqShape) |
- | # PRODUZA O MAPA DE ESTIMATIVAS DE VOLUME | + | |
- | # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | + | |
+ | # Plota mapa de rasters juntados sobreposto com os limites dos talhões | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | plot(rastersJuntos) | ||
+ | plot(poligonos, | ||
+ | # ---- | ||
- | # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
- | # O BLOCO A SEGUIR SERÁ UTIL SE QUISER " | ||
- | # CALCULA AS INFORMAÇÕES NECESSÁRIAS PARA GERAR O QUADRO | ||
- | # DE COMPARAÇÃO ENTRE ACS, ACE E AD !! | ||
- | # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ----- | ||
- | |||
- | # Funções para a | ||
- | # Amostragem dupla | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | doubleSampleRegPars = function(y, x, xLarge, alpha=.05){ | + | # 5 . Cria um novo raster com as estimativas de VOLUME para produção |
- | n = length(y) | + | # do mapa de VTCC. A esrimativa será obtida a partir do modelo |
- | beta = ( sum(y*x, | + | # |
- | / ( 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, | + | |
- | | + | |
- | stderr = sqrt(vardsr) | + | |
- | ci = calcCI(stderr, | + | |
- | + | ||
- | out = c(media = ydsr, var = vardsr, dp = stderr, ic = ci, erro = 100*ci/ | + | |
- | + | ||
- | return(out) | + | |
- | } | + | |
- | # Função para determinação | + | # A lista poligonos$SUBTALHAO contém os nomes dos talhões |
- | # isto é, da intensidade amostral que gera erro admissível | + | # Modelo: |
+ | # correspondentes idades na mesma ordem, para inclusão no objeto | ||
+ | # com informações sobres os poligonos | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | dubleSamplePlotNumber = function(y, x, xLarge, Cpg = 300, | + | Idades <- as.numeric(c(5.2, 3.7, 3.7, 5.2)) |
- | | + | poligonos$IDINV <- Idades |
- | + | ||
- | 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) | + | |
- | } | + | |
+ | valoresAtrib <- poligonos$IDINV | ||
- | spatialPlotMetrics | + | # Cria um novo raster com a idade do respectivo polígono atribuída ao |
- | mutate(VTCC = ifelse(VTCC <50, VTCC*10,VTCC)) | + | # respectivo pixel sobreposto |
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | rastersIdade | ||
+ | field=valoresAtrib, | ||
+ | res=res(rastersJuntos)) %>% rename(IDINV = layer) | ||
- | lims = spatialPlotMetrics %>% names %in% c(' | + | # Junta rasters, mantendo os respecivos valores em layers separados, |
- | lidarOnly = spatialPlotMetrics[, | + | # renomeia as colunas e assim, agora rastersJuntos tem as varíaveis |
+ | # necessárias para estimar o parâmetro de interesse, uma em cada layer. | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | rastersFinal <- c(rastersJuntos, rastersIdade) | ||
- | interestVars = c(' | + | # Usa a equação ajustada |
- | corrMat = cor(spatialPlotMetrics[, | + | # o parâmetro de interesse |
- | corrMat = corrMat[,apply(corrMat, 2, function(x) !any(is.na(x)))] | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
+ | rastersVolume <- -444.142 + 24.630 * rastersFinal[" | ||
+ | | ||
+ | rastersVolume <- rastersVolume %>% rename(VTCC = zq95) | ||
- | handPick = c(' | + | # Junta layer VTCC como novo layer no raster final |
- | vars = c(' | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | handp = as.data.frame(cbind(vars, | + | rastersFinal |
- | doubleSamplePars = foreach(i = interestVars, | + | |
- | aux = corrMat[i, | + | |
- | | + | |
- | | + | |
- | XL = metrics[, | + | |
- | + | ||
- | est = doubleSampleRegPars(spatialPlotMetrics[,i], | + | |
- | spatialPlotMetrics[, | + | |
- | #est = doubleSampleRatioPars(spatialPlotMetrics[, | + | |
- | names(est) = i | + | |
- | + | ||
- | est %<>% t %>% as.data.frame | + | |
- | est$aux = pick | + | |
- | + | ||
- | return(est) | + | |
- | } | + | |
- | doubleSamplePars | + | # Cria novo raster de volumes mudando para zero valores negativos |
- | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
- | doubleSamplePars %>% | + | vtcc <- ifel(rastersFinal[["VTCC"]] < 0, 0, rastersFinal)[["VTCC"]] |
- | kbl(caption = "Amostragem Dupla", | + | minmax(vtcc)[1] |
- | | + | minmax(vtcc)[2] |
- | # Gráfico para análise da precisão dos métodos amostrais | + | # Apaga rasters intermediários |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | erro = 1:20 | + | rm(inteRaster, rastersIdade, rastersJuntos, rastersVolume) |
- | scsPlotn <- tamanhoIdealACS(parcelas$VTCC, tamanhoPopulacao, | + | |
- | errDesired = erro/100) | + | |
- | tamanhoIdealACE(y = parcelas$VTCC, | + | |
- | g = parcelas$IDINV, | + | |
- | Nh = parcPorEstrato, | + | |
- | erro/100) | + | |
- | cssPlotn | + | # ///////////////////////////////////////////////////////////////////// |
- | | + | # MAPA DE ESTIMATIVAS DE VOLUME TOTAL COM CASCA (VTCC) |
+ | # ///////////////////////////////////////////////////////////////////// | ||
+ | minL = round(minmax(vtcc)[1]) | ||
+ | maxL = round(minmax(vtcc)[2]) | ||
+ | brkL = round((maxL - minL) / 6) # Legenda com cinco breaks | ||
+ | intL = c(minL+brkL, | ||
+ | limL = c(minL, maxL) | ||
+ | titulo | ||
+ | ' | ||
+ | p <- ggplot() + geom_spatraster(data | ||
+ | guides(fill = guide_legend(reverse=F)) + | ||
+ | coord_sf(datum=st_crs(31983)) + # Gráfico numa certa projeção | ||
+ | scale_fill_whitebox_c(palette = " | ||
+ | breaks = intL, limits = limL)+ggtitle(titulo) | ||
+ | rstNome <- str_c(dirDadosRaster, | ||
+ | png(rstNome, | ||
+ | print(p) | ||
+ | dev.off() # Fecha " | ||
- | dsPlotn = dubleSamplePlotNumber(spatialPlotMetrics$VTCC, | ||
- | spatialPlotMetrics$zq99, | ||
- | metrics$zq99, | ||
- | png(' | + | # ---- |
- | plot( scsPlotn ~ erro, type=' | + | |
- | | + | # ///////////////////////////////////////////////////////////////////// |
- | | + | # TENTE AGORA CRIAR A TABELA COM A ESTIMATIVA DE VOLUME CALCULADA |
- | lines(erro, cssPlotn, col=' | + | # PELA AMOSTRAGEM DUPLA (SEMELHANTE À QUE FIZEMOS PARA ACS E ACE) |
- | lines(erro, dsPlotn, col=' | + | # ///////////////////////////////////////////////////////////////////// |
- | box() | + | |
- | axis(1) | + | |
- | axis(2, at = c(25, 50, 75, 100, 125, 150, 175, 200)) | + | |
- | abline(v=10, | + | |
- | lines(c(0, | + | |
- | lines(c(0, | + | |
- | lines(c(0, | + | |
- | legend(' | + | |
- | | + | |
- | dev.off() | + | |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Este script foi atualizado em Novembro/2023 depois de instalar, | + | # Este script foi atualizado em Dezembro/2023 depois de instalar, |
# na seguinte sequência, as mais recentes versões do pacote lidR*: | # na seguinte sequência, as mais recentes versões do pacote lidR*: | ||
# | # | ||
Linha 540: | Linha 708: | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
# ---- | # ---- | ||
+ | |||
</ | </ | ||
Linha 547: | Linha 716: | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | |||
+ | e sobre os pacotes //terra// e //sf// para processamento de dados espaciais: | ||
+ | * [[https:// | ||
+ | * [[https:// |
lidar/projetos/rcode_invcomlidar.1701145000.txt.gz · Última modificação: 2024/03/23 20:17 (edição externa)