lidar:projetos:rcode_invcomlidar
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Próxima revisão | Revisão anterior | ||
lidar:projetos:rcode_invcomlidar [2023/11/27 10:38] – criada lcer | lidar:projetos:rcode_invcomlidar [2024/03/23 20:17] (atual) – edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
[[ lidar: | [[ lidar: | ||
- | |||
< | < | ||
Linha 8: | Linha 7: | ||
# Autor: Luiz Carlos Estraviz Rodriguez | # Autor: Luiz Carlos Estraviz Rodriguez | ||
# Departamento de Ciências Florestais | # Departamento de Ciências Florestais | ||
- | # ESALQ/USP - 25/Nov/2023 | + | # ESALQ/USP - 02/Dez/2023 |
# | # | ||
# Inventário florestal da Fazenda Modelo | # Inventário florestal da Fazenda Modelo | ||
Linha 14: | Linha 13: | ||
# - shape files dos talhões florestais | # - shape files dos talhões florestais | ||
# - LiDAR multitemporal (2013 e 2014) | # - LiDAR multitemporal (2013 e 2014) | ||
- | # - sugestão de pasta para armazenamento local: | + | # - sugestão de pastas locais |
- | # C:/LiDAR/ | + | # C:/ |
+ | # C:/GitRepo/ | ||
+ | # projetos sincronizados no github | ||
# | # | ||
# Linguagem de programação: | # Linguagem de programação: | ||
# R (v 4.3) | # R (v 4.3) | ||
- | # pacote | + | # RStudio (v. 2023.09.1 Build 494) |
+ | # | ||
# | # | ||
+ | # 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 diretórios | + | if(!require(sf)) |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | prjNam <- " | + | library(sf) |
- | wrkDir <- str_c(' | + | |
- | | + | |
- | | + | |
- | lidDir <- str_c(' | + | |
- | dir.create(lidDir, showWarnings = F) | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | if(!require(tidyterra)) |
- | # Define os nomes dos tiles LiDAR multitemporais que serão lidos do | + | |
- | # repositório, | + | library(tidyterra) |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | gitOnde < | + | |
- | gitNome <-c("L0004-C0005.laz", | + | |
- | " | + | |
- | " | + | |
- | # anoData <- c(" | + | |
- | anoData <- c(" | + | |
- | # Faz o download dos tiles | + | if(!require(terra)) # Package para processar mapas raster |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | options(timeout=1000) # Reset timeout oferecendo mais tempo de download | + | library(terra) |
- | for (ano in anoData) { | + | |
- | dirLAZ <- paste0(lidDir, | + | |
- | | + | |
- | for (nome in gitNome){ | + | |
- | gitFile <- paste0(gitOnde, | + | |
- | | + | |
- | if(!file.exists(localFl)) | + | |
- | download.file(gitFile, | + | |
- | } | + | |
- | } | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | if(!require(stars)) |
- | # Download dos shapes da Fazenda Modelo | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | library(stars) |
- | gitOnde <- " | + | |
- | gitNome <- " | + | |
- | gitArqv <- file.path(gitOnde, gitNome) %>% paste0("? | + | |
- | tmpd <- tempdir(check = TRUE) # diretório temporário | + | if(!require(tools)) |
- | zipf <- file.path(tmpd, "shapes.zip" | + | |
+ | library(tools) | ||
- | options(timeout=1000) # Reset timeout oferecendo mais tempo de download | + | if(!require(RColorBrewer)) # Package com mais paletas |
- | if(!file.exists(zipf)) # garante download | + | |
- | | + | library(RColorBrewer) |
- | shpDir <- str_c(wrkDir, '/ | + | if(!require(progress)) |
- | | + | |
- | unzip(zipf, exdir = shpDir) # shape é unziped | + | library(progress) |
- | unlink(zipf) | + | |
- | # ---- | + | |
+ | if(!require(reshape2)) | ||
+ | install.packages(" | ||
+ | library(reshape2) | ||
+ | |||
+ | if(!require(mapview)) | ||
+ | install.packages(" | ||
+ | library(mapview) | ||
- | # ********************************************************************* | ||
- | # 2: A Amostragem Dupla (AD) com variável auxiliar LiDAR começa aqui. | ||
- | # **************************************************************** ---- | ||
# devtools:: | # devtools:: | ||
# devtools:: | # devtools:: | ||
if(!require(lidR)) | if(!require(lidR)) | ||
- | install.packages(" | + | install.packages(" |
- | | + | library(lidR) |
- | | + | # alternativamente as duas linhas acima |
- | library(lidR) | + | |
- | if(!require(future)) # Package que permite ao lidR rodar algumas | + | if(!require(RCSF)) # |
- | install.packages(" | + | install.packages(" |
+ | library(RCSF) | ||
+ | |||
+ | if(!require(future)) | ||
+ | install.packages(" | ||
library(future) | library(future) | ||
- | |||
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Define quantos cores vão ser usados no processamento paralelo | ||
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
cores <- as.integer(parallel:: | cores <- as.integer(parallel:: | ||
- | if (cores > 4L){cores <- cores - 1L} else {cores <- 3L} | ||
plan(multisession, | plan(multisession, | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Leitura dos catálogos de dados LiDAR (2013 e 2014) | + | # Define pastas |
- | # Exibe conteúdo do catálogo | + | |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | dirLAZ <- paste0(lidDir, | + | prjNam |
- | ctg <- readLAScatalog(dirLAZ) | + | |
- | opt_select(ctg) | + | |
- | plot(ctg) | + | |
- | if(!require(mapview)) # Permite criar plots com mapas de fundo | + | dirProjet <- str_c(' |
- | | + | if (!dir.exists(dirProjet)) { # |
- | library(mapview) | + | |
- | plot(ctg, mapview = TRUE, map.type = " | + | |
+ | } | ||
+ | setwd(dirProjet) # Define pasta default de trabalho | ||
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | datDir <- str_c(' |
- | # Recorta nuvens usando os limites dos talhões com buffer | + | if (!dir.exists(datDir)) { # Cria diretórios caso não existam |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | opt_chunk_buffer(ctg) <- 10 # 10 m buffer | + | |
- | opt_output_files(ctg) <- paste0(tempfile(), " | + | } |
- | ctg_tal = clip_roi(ctg, tal_shp) | + | |
- | plot(ctg_tal, | + | lidDir |
- | plot(ctg_tal, | + | if (!dir.exists(lidDir)) { |
- | + | | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | } |
- | # Classifica pontos de solo | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | if(!require(RCSF)) | + | |
- | install.packages(" | + | |
- | library(RCSF) | + | |
- | opt_output_files(ctg_tal) | + | |
- | ctg <- classify_ground(ctg_tal, | + | |
- | rm(ctg_tal) | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | # Normaliza as nuvens de pontos dos talhões | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | opt_output_files(ctg) <- paste0(tempdir(), | + | |
- | ctg <- normalize_height(ctg, | + | |
- | + | ||
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | # Converte e salva o novo conjunto de tiles normalizado | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | dirLAZ <- paste0(dirLAZ, | + | |
- | opt_output_files(ctg) <- | + | |
- | paste0(dirLAZ, | + | |
- | opt_chunk_buffer(ctg) <- 20 # com buffers ao redor de cada tile | + | |
- | opt_chunk_size(ctg) <- 300 # retile para tiles de 300 m | + | |
- | opt_laz_compression(ctg) <- TRUE # mantém formato LAZ | + | |
- | ctg <- catalog_retile(ctg) | + | |
- | plot(ctg, mapview = TRUE, map.type = " | + | |
- | + | ||
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | # Lê o shape e atributos dos talhoes | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | if(!require(sf)) | + | |
- | install.packages(" | + | |
- | library(sf) | + | |
- | shpArq | + | |
- | tal_shp <- st_read(shpArq) | + | |
- | st_is_valid(tal_shp) | + | |
- | plot(tal_shp, add = TRUE, col = " | + | |
- | + | ||
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | # Lê os centróides das parcelas de inventário convencional | + | |
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | |
- | shpArq | + | |
- | par_shp <- st_read(shpArq) | + | |
- | st_is_valid(par_shp) | + | |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
# Este bloco cria funções que permitem produzir gráficos esteticamente | # Este bloco cria funções que permitem produzir gráficos esteticamente | ||
# caprichados para apresentar os índices de correlação de Pearson | # caprichados para apresentar os índices de correlação de Pearson | ||
- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
# Parâmetros dos gráficos | # Parâmetros dos gráficos | ||
txt.size = 6 | txt.size = 6 | ||
Linha 218: | Linha 153: | ||
# Função para embelazamento da cormat | # Função para embelazamento da cormat | ||
- | if(!require(reshape2)) | ||
- | install.packages(" | ||
- | library(reshape2) | ||
graphCormat <- function(cormat){ | graphCormat <- function(cormat){ | ||
# Resets font size for correlation matrix graph | # Resets font size for correlation matrix graph | ||
Linha 256: | Linha 188: | ||
return(p) | return(p) | ||
} | } | ||
- | # ----- | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Estudo | + | # Estimativas. e estatísticas de qualidade da inferência, |
+ | # 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 | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | ||
- | opt_filter(ctg) <- " | ||
- | # Cálculo " | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | D <- plot_metrics(ctg, .stdmetrics_z, par_shp, radius = 11.28) | + | # 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 | ||
+ | " | ||
+ | gitNome <-c(" | ||
+ | " | ||
+ | " | ||
+ | anoData <- c(" | ||
+ | # anoData <- c(" | ||
- | # Escolhe um subgrupo de métricas e dados para estudo da correlação | + | # Download dos tiles |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | X <- tibble(D) %>% select(VTCC, MHDOM, IDINV, zmean, | + | options(timeout=1000) # Reset timeout oferecendo mais tempo de download |
- | zq90, zq95, pzabovezmean, pzabove2) | + | for (ano in anoData) { # guarda na sub-pasta de dados LiDAR por ano |
+ | dirLAZ | ||
+ | dir.create(dirLAZ, showWarnings = T) | ||
+ | for (nome in gitNome){ | ||
+ | gitFile <- str_c(gitOnde, ano, "/" | ||
+ | | ||
+ | if(!file.exists(localFl)) | ||
+ | download.file(gitFile, mode=" | ||
+ | } | ||
+ | } | ||
- | # Prepara o gráfico para análise das correlações | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | cormat | + | # Define o nome do arquivo com os dados espacializados disponíveis para |
- | cormat | + | # a área de estudo, faz o download e salva esses dados na devida pasta |
- | p <- graphCormat(cormat) | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
+ | gitOnde | ||
+ | " | ||
+ | gitNome | ||
+ | gitArqv <- file.path(gitOnde, gitNome) %> | ||
- | grfDir | + | tmpd <- tempdir(check = TRUE) # diretório temporário |
+ | zipf <- file.path(tmpd, | ||
+ | |||
+ | # Download e unzip do coonteúdo do arquivo zipado | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | options(timeout=1000) | ||
+ | if(!file.exists(zipf)) { | ||
+ | download.file(gitArqv, | ||
+ | } | ||
+ | |||
+ | shpDir | ||
+ | if (!dir.exists(shpDir)) { # Cria diretório caso não exista | ||
+ | | ||
+ | } | ||
+ | |||
+ | unzip(zipf, exdir = shpDir) | ||
+ | unlink(zipf) | ||
+ | # ---- | ||
- | fileGrf <- paste0(grfDir, | ||
- | nomeGrf <- " | ||
- | jpeg(fileGrf, | ||
- | plot(p + labs(title=nomeGrf)) | ||
- | dev.off() | ||
- | # Análise de regressão por quadrados mínimos ordinários (OLS) para | ||
- | # determinação do modelo de predição. | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | m <- lm(VTCC ~ zq90 + IDINV, data = X) | + | # 3. Processamento da variável auxiliar LiDAR e estudo da correlação |
- | summary(m) | + | # das métricas LiDAR com os parâmetros de interesse |
- | plot(X$VTCC, | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- |
- | abline(0,1) | + | |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Gera métricas para Área Total | + | # Leitura do catálogo de dados LiDAR (2013 ou 2014) |
+ | # Exibe conteúdo do catálogo e confere se os mapas de tiles são iguais | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # É possível gerar uma função que calcula qualquer métrica desejada | + | dirLAZ |
+ | ctg_orig <- readLAScatalog(dirLAZ) # LEITURA DAS NUVENS DE PONTOS LiDAR | ||
+ | opt_select(ctg_orig) <- " | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | metriLiDAR < | + | # Lê shape e atributos dos talhoes |
- | if (length(z)< | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | | + | shpArq |
- | | + | tal_shp |
- | | + | st_is_valid(tal_shp) # confere se os elementos do shape estão OK |
- | | + | |
- | | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | | + | # Os tiles de dados originais abrangem uma área maior do que a |
- | | + | # necessária. Para reduzir a informação LiDAR que será usada, uma |
- | | + | # alternativa é usar os limites dos talhões mais um buffer de 10m |
- | names(metris) <- c(" | + | # como " |
- | " | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | return(metris) | + | dirTal |
+ | if (!dir.exists(dirTal)) { | ||
+ | | ||
} | } | ||
+ | opt_chunk_buffer(ctg_orig) <- 10 # 10 m buffer | ||
+ | opt_output_files(ctg_orig) <- str_c(dirTal, | ||
+ | opt_laz_compression(ctg_orig) <- TRUE # Mantém formato LAZ | ||
+ | ctg_talh = clip_roi(ctg_orig, | ||
- | # Aplica | + | # Para plotar |
+ | # basta ler o respectivo arquivo salvo pela função clip_roi(), | ||
+ | # como no exemplo abaixo: | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | prjNam | + | # las <- readLAS(ctg_tal$filename[3]) |
- | wrkDir <- str_c(' | + | # plot(las) |
- | lidDir <- str_c(wrkDir, '/ | + | |
- | ctgDir <- str_c(lidDir, | + | |
- | arq1a <- paste0(lidDir, anoData[1], '/TALHAO/301a.laz') | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | arq1d <- paste0(lidDir, anoData[1], '/ | + | # Classifica pontos de solo (este passo pode ser bem lento) |
- | arq2a <- paste0(lidDir, anoData[1], '/TALHAO/ | + | # ... espere até que o sinal " |
- | arq2c <- paste0(lidDir, anoData[1], '/ | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
+ | dirNoN | ||
+ | if (!dir.exists(dirNoN)) { | ||
+ | | ||
+ | } | ||
+ | opt_output_files(ctg_talh) | ||
+ | ctg_gNoN | ||
- | las <- readLAS(arq1a) | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | d1a <- hexagon_metrics(las, metriLiDAR(Z), area = 400) | + | # Normaliza as nuvens de pontos dos talhões |
- | plot(d1a, pal = heat.colors, axes = TRUE, key.pos = NULL, reset = FALSE) | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
+ | dirNrm | ||
+ | if (!dir.exists(dirNrm)) { | ||
+ | dir.create(dirNrm, showWarnings | ||
+ | } | ||
+ | opt_output_files(ctg_gNoN ) <- str_c(dirNrm, "/ | ||
+ | ctg_gSiN | ||
- | las <- readLAS(arq1d) | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | d1d <- hexagon_metrics(las, metriLiDAR(Z), area = 400) | + | # Retile dos talhões normalizados para geração de um conjunto de núvens |
- | plot(d1d, pal = heat.colors, | + | # mais apropriado para a correta clipagem das parcelas |
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | dirTNrm | ||
+ | if (!dir.exists(dirTNrm)) { | ||
+ | dir.create(dirTNrm, showWarnings | ||
+ | } | ||
+ | # ctg_gSiN <- readLAScatalog(dirTNrm) | ||
+ | opt_output_files(ctg_gSiN) <- # Onde guardar as nuvens normalizadas | ||
+ | str_c(dirTNrm, "/ | ||
+ | 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) | ||
+ | rm(ctg_gNoN, ctg_gSiN, ctg_orig, ctg_talh) # limpa da memória catálogos | ||
- | las <- readLAS(arq2a) | + | # Lê shape e atributos das parcelas p/ acessar parâmetros de interesse |
- | d2a <- hexagon_metrics(las, metriLiDAR(Z), | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | plot(d2a, pal = heat.colors, | + | shpPar |
+ | par_shp | ||
+ | st_is_valid(par_shp) # confere se os elementos do shape estão OK | ||
- | las <- readLAS(arq2c) | + | dirParc |
- | d2c <- hexagon_metrics(las, metriLiDAR(Z), area = 400) | + | if (!dir.exists(dirParc)) { |
- | plot(d2c, pal = heat.colors, | + | |
- | # ---- | + | } |
+ | # Exibe localização dos tiles, talhoes e parcelas | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | plot(ctg_tile, | ||
+ | plot(ctg_tile) | ||
+ | plot(tal_shp, | ||
+ | plot(par_shp, | ||
+ | # Clipa e salva as núvens das parcelas, e calcula | ||
+ | # métricas para cada " | ||
+ | # 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, | ||
- | # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | + | # Escolhe um subgrupo de métricas e dados para estudo da correlação |
- | # AGORA É SUA VEZ | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | # ESTUDO DIRIGIDO ... | + | X <- tibble(D) %>% select(VTCC, |
- | # PRODUZA O MAPA DE ESTIMATIVAS DE VOLUME | + | zq45, zq75, zq95, zpcum2, zpcum4, zpcum6, |
- | # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | + | |
+ | # Prepara o gráfico para análise das correlações | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | cormat <- X %>% cor() | ||
+ | cormat <- round(cor(cormat), | ||
+ | p <- graphCormat(cormat) | ||
+ | grfDir <- str_c(dirProjet, | ||
+ | if (!dir.exists(grfDir)) { # Cria pasta, caso não exista | ||
+ | dir.create(grfDir, | ||
+ | } | ||
+ | fileGrf <- str_c(grfDir, | ||
+ | tituGrf <- " | ||
- | # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | + | # Abre "impressora" |
- | # O BLOCO A SEGUIR SERÁ UTIL SE QUISER | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | # | + | jpeg(fileGrf, |
- | # DE COMPARAÇÃO ENTRE ACS, ACE E AD !! | + | plot(p + labs(title=tituGrf)) |
- | # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ----- | + | dev.off() |
- | # Funções | + | # Análise de regressão por quadrados mínimos ordinários (OLS) para |
- | # Amostragem dupla | + | # determinação do modelo de predição. |
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | doubleSampleRegPars = function(y, x, xLarge, alpha=.05){ | + | m <- lm(VTCC ~ zq95 + IDINV, data = X) # Análise de Regressão Linear |
- | n = length(y) | + | summary(m) # Mostra os resultados da regressão |
- | beta = ( sum(y*x, na.rm=T) - ( sum(x, na.rm=T)*sum(y, na.rm=T) / n )) | + | plot(X$VTCC, predict(m)) # Gráfico de observado vs predito |
- | / ( sum(x^2, na.rm=T) - (sum(x, na.rm=T)^2 / n) ) | + | abline(0,1) |
+ | |||
+ | # ---- | ||
+ | |||
+ | |||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # 4. Criação de mapas raster com as métricas mais promissoras | ||
+ | # É 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 | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | ctg_taln <- readLAScatalog(dirDadosLiDAR) | ||
+ | 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, | ||
+ | # | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | interesse <- " | ||
+ | |||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # 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 = 2*nNuvens) # Reset da barra de progresso | ||
+ | for (i in 1:nNuvens) { | ||
+ | nuvem <- ctg_taln$filename[i] | ||
+ | talhao | ||
| | ||
- | | + | |
- | | + | filter |
| | ||
- | | + | |
- | | + | inteRaster <- (las %> |
- | stderr = sqrt(vardsr) | + | pixel_metrics(.stdmetrics_z, res = 20))[[interesse]] |
- | ci = calcCI(stderr, | + | |
| | ||
- | | + | |
+ | writeRaster(inteRaster, rstNome, overwrite=TRUE) # Salva arquivo tif | ||
| | ||
- | | + | |
+ | rstNome <- str_c(dirDadosRaster, | ||
+ | # 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) | ||
+ | titulo | ||
+ | ' | ||
+ | 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 = " | ||
+ | breaks = intL, limits = limL)+ggtitle(titulo) | ||
+ | png(rstNome, | ||
+ | print(p) | ||
+ | dev.off() | ||
} | } | ||
- | # Função para determinação da quantidade ideal de parcelas amostrais, | ||
- | # isto é, da intensidade amostral que gera erro admissível | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | dubleSamplePlotNumber = function(y, x, xLarge, Cpg = 300, | + | # !!! Método alternativo: |
- | errDesired | + | # Criação de mapas raster para a métrica de interesse |
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # 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, select | ||
+ | # filter = " | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # # Cria parâmetros para melhorar a legenda do gráfico raster | ||
+ | # | ||
+ | # 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()) + | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # dev.off() # Fecha " | ||
+ | # } | ||
+ | |||
+ | # Cálculo de mapas raster como função dos mapas rasters de métricas | ||
+ | # criados nos passos anteriores. | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | ctg_taln <- readLAScatalog(dirDadosLiDAR) | ||
+ | nNuvens | ||
+ | |||
+ | # Criação de mapas raster formato tif para as métricas de interesse | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # zq40, zq45, zq50, zq55, zq60, zq65, zq70, zq75, zq80, zq85, zq90, | ||
+ | # zq95, zpcum1, zpcum2, zpcum3, zpcum4, zpcum5, zpcum6, zpcum7, | ||
+ | # | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | interesse <- " | ||
+ | |||
+ | # Criação de lista de mapas raster criados nos passos anteriores | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | listaRasters <- list() | ||
+ | for (i in 1:nNuvens) { | ||
+ | nuvem <- ctg_taln$filename[i] | ||
+ | talhao | ||
+ | rstNome <- str_c(dirDadosRaster, | ||
| | ||
- | | + | |
- | 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) | + | |
} | } | ||
+ | # Junta os rasters para gerar um mapa único com a métrica de interesse | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | rastersJuntos <- do.call(merge, | ||
- | spatialPlotMetrics | + | # 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, | ||
+ | | ||
+ | coord_sf(datum=st_crs(31983)) + # Gráfico numa certa projeção | ||
+ | scale_fill_whitebox_c(palette = " | ||
+ | breaks = intL, limits = limL)+ggtitle(titulo) | ||
+ | rstNome | ||
+ | png(rstNome, | ||
+ | print(p) | ||
+ | dev.off() # Fecha " | ||
- | lims = spatialPlotMetrics %>% names %in% c('zmean', 'DNT' | + | # Lê o arquivo shape com os limites e atributos dos talhoes |
- | lidarOnly = spatialPlotMetrics[,lims[1]: | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
+ | dirShape <- str_c('C:/GitRepo/',prjNam, '/SHAPES' | ||
+ | arqShape <- str_c(dirShape, '/ | ||
- | interestVars = c(' | + | # Cria estrutura de dados (data frame) com os atributos dos talhoes |
- | corrMat = cor(spatialPlotMetrics[, | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | corrMat = corrMat[, | + | poligonos <- vect(arqShape) |
- | handPick = c(' | + | # Plota mapa de rasters juntados sobreposto com os limites dos talhões |
- | vars = c(' | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | handp = as.data.frame(cbind(vars, handPick)) | + | plot(rastersJuntos) |
- | doubleSamplePars = foreach(i = interestVars, .combine | + | plot(poligonos, add = TRUE, col = " |
- | aux = corrMat[i,] | + | # ---- |
- | #pick = which( aux == max(aux) | + | |
- | pick = handp$handPick[vars == i] | + | |
- | XL = metrics[, | + | |
- | + | ||
- | est = doubleSampleRegPars(spatialPlotMetrics[, | + | |
- | spatialPlotMetrics[, | + | |
- | | + | |
- | names(est) = i | + | |
- | + | ||
- | est %<>% t %>% as.data.frame | + | |
- | est$aux = pick | + | |
- | + | ||
- | return(est) | + | |
- | } | + | |
- | doubleSamplePars <- doubleSamplePars %>% select(-rho) %>% t() | ||
- | doubleSamplePars %>% | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | | + | # 5 . Cria um novo raster com as estimativas de VOLUME para produção |
- | | + | # do mapa de VTCC. A esrimativa será obtida a partir do modelo |
+ | # | ||
+ | # | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | ||
- | # Gráfico para análise da precisão | + | # A lista poligonos$SUBTALHAO contém os nomes dos talhões da Fazenda |
+ | # Modelo: | ||
+ | # correspondentes idades na mesma ordem, para inclusão no objeto | ||
+ | # com informações sobres os poligonos | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | erro = 1:20 | + | Idades |
- | scsPlotn | + | poligonos$IDINV |
- | errDesired = erro/100) | + | |
- | tamanhoIdealACE(y = parcelas$VTCC, | + | |
- | g = parcelas$IDINV, | + | |
- | Nh = parcPorEstrato, | + | |
- | erro/100) | + | |
- | cssPlotn | + | valoresAtrib |
- | errDesired = erro/100) | + | |
- | dsPlotn = dubleSamplePlotNumber(spatialPlotMetrics$VTCC, | + | # Cria um novo raster com a idade do respectivo polígono atribuída ao |
- | spatialPlotMetrics$zq99, | + | # respectivo pixel sobreposto |
- | | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
+ | rastersIdade <- rasterize(poligonos, rastersJuntos, | ||
+ | | ||
+ | res=res(rastersJuntos)) %>% rename(IDINV = layer) | ||
- | png(' | + | # Junta rasters, mantendo os respecivos valores em layers separados, |
- | plot( scsPlotn ~ erro, type=' | + | # renomeia as colunas e assim, agora rastersJuntos tem as varíaveis |
- | | + | # necessárias para estimar o parâmetro |
- | | + | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
- | lines(erro, cssPlotn, col=' | + | rastersFinal <- c(rastersJuntos, rastersIdade) |
- | 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() | + | |
+ | # Usa a equação ajustada (final do bloco 3 deste script) para estimar | ||
+ | # o parâmetro de interesse | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | # Este script foi atualizado em Novembro/2023 depois de instalar, | + | rastersVolume <- -444.142 + 24.630 * rastersFinal[" |
+ | 20.133 * rastersFinal[" | ||
+ | rastersVolume <- rastersVolume %>% rename(VTCC = zq95) | ||
+ | |||
+ | # Junta layer VTCC como novo layer no raster final | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | rastersFinal = c(rastersFinal, | ||
+ | |||
+ | # Cria novo raster de volumes mudando para zero valores negativos | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | vtcc <- ifel(rastersFinal[[" | ||
+ | minmax(vtcc)[1] | ||
+ | minmax(vtcc)[2] | ||
+ | |||
+ | # Apaga rasters intermediários | ||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | rm(inteRaster, | ||
+ | |||
+ | # ///////////////////////////////////////////////////////////////////// | ||
+ | # 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 = vtcc, aes()) + | ||
+ | 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() | ||
+ | |||
+ | |||
+ | # ---- | ||
+ | |||
+ | # ///////////////////////////////////////////////////////////////////// | ||
+ | # TENTE AGORA CRIAR A TABELA COM A ESTIMATIVA DE VOLUME CALCULADA | ||
+ | # PELA AMOSTRAGEM DUPLA (SEMELHANTE À QUE FIZEMOS PARA ACS E ACE) | ||
+ | # ///////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | |||
+ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
+ | # 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 481: | Linha 708: | ||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
# ---- | # ---- | ||
+ | |||
</ | </ | ||
Linha 488: | 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.1701081520.txt.gz · Última modificação: 2024/03/23 20:17 (edição externa)