lidar:projetos:rcode_alsmodelo
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_alsmodelo [2023/11/26 12:34] – lcer | lidar:projetos:rcode_alsmodelo [2023/11/27 10:41] (atual) – removida lcer | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| - | [[ lidar: | ||
| - | |||
| - | < | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # Inventário com dados LiDAR na Fazenda Modelo ~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # | ||
| - | # Autor: Luiz Carlos Estraviz Rodriguez | ||
| - | # Departamento de Ciências Florestais | ||
| - | # ESALQ/USP - 25/Nov/2023 | ||
| - | # | ||
| - | # Inventário florestal da Fazenda Modelo | ||
| - | # - download dos dados mantidos em um repositório github público | ||
| - | # - shape files dos talhões florestais | ||
| - | # - LiDAR multitemporal (2013 e 2014) | ||
| - | # - sugestão de pasta para armazenamento local: | ||
| - | # C:/ | ||
| - | # | ||
| - | # Linguagem de programação: | ||
| - | # R (v 4.3) | ||
| - | # | ||
| - | # | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | rm(list=ls(all=TRUE)) | ||
| - | gc() | ||
| - | |||
| - | |||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # 1. Leitura e organização de dados | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | ||
| - | if(!require(tidyverse)) | ||
| - | install.packages(" | ||
| - | library(tidyverse) | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # Download do shape da Fazenda Modelo (2 layers: talhoes e parcelas) | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | gitOnde <- " | ||
| - | gitNome <- " | ||
| - | gitArqv <- file.path(gitOnde, | ||
| - | |||
| - | tmpd <- tempdir(check = TRUE) # diretório temporário | ||
| - | zipf <- file.path(tmpd, | ||
| - | |||
| - | options(timeout=1000) # Reset timeout oferecendo mais tempo de download | ||
| - | if(!file.exists(zipf)) | ||
| - | download.file(gitArqv, | ||
| - | |||
| - | unzip(zipf, exdir = tmpd) # shape é unziped no diretório temporário | ||
| - | unlink(zipf) | ||
| - | |||
| - | |||
| - | if(!require(sf)) | ||
| - | install.packages(" | ||
| - | library(sf) | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # Lê atributos dos talhoes | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | shpArq <- paste0(tmpd, | ||
| - | talhoesComGeo <- read_sf(shpArq) | ||
| - | talhoesSemGeo <- tibble(sf:: | ||
| - | |||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # Lê atributos das parcelas | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | shpArq <- paste0(tmpd, | ||
| - | parcelasComGeo <- read_sf(shpArq) | ||
| - | parcelasSemGeo <- tibble(sf:: | ||
| - | |||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # Cria coluna IDINV na tabela " | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | talhoes <- | ||
| - | parcelasSemGeo %>% | ||
| - | group_by(SUBTALHAO) %>% | ||
| - | summarise(IDINV = unique(IDINV)) %>% | ||
| - | left_join(talhoesSemGeo) %>% | ||
| - | select(" | ||
| - | arrange(SUBTALHAO) %>% as.data.frame | ||
| - | |||
| - | talhoesComGeo <- inner_join(talhoesComGeo, | ||
| - | select(" | ||
| - | |||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # Reorganiza colunas da tabela " | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | parcelas <- | ||
| - | parcelasSemGeo %>% | ||
| - | select(SUBTALHAO, | ||
| - | arrange(SUBTALHAO) %>% as.data.frame | ||
| - | |||
| - | # Cria diretórios e pastas para onde os tiles LiDAR serão copiados | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | prjNome <- ' | ||
| - | dirNome <- paste0(' | ||
| - | dir.create(dirNome, | ||
| - | |||
| - | # Salva e imprime dados reorganizados | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | dirNome <- paste0(dirNome, | ||
| - | dir.create(dirNome, | ||
| - | |||
| - | # Leitura da mais atual versão rio para facilmente ler e salvar Excel | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | if (!require(" | ||
| - | if (!require(rio)) | ||
| - | library(rio) | ||
| - | # Salva dados em planilha Excel | ||
| - | arqNome <- paste0(dirNome, | ||
| - | export(list(talhoes = talhoes, | ||
| - | parcelas | ||
| - | file = arqNome) | ||
| - | |||
| - | # Mostra tabelas no Viewer | ||
| - | # Use o " | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | if(!require(kableExtra)) | ||
| - | install.packages(" | ||
| - | library(kableExtra) | ||
| - | # Mostra talhões | ||
| - | AreaTotal <- talhoes$AREA %>% sum | ||
| - | NotaDeRodape <- paste0(": | ||
| - | talhoes %>% | ||
| - | kbl(caption = " | ||
| - | kable_classic(full_width = F) %>% | ||
| - | footnote(general = NotaDeRodape, | ||
| - | | ||
| - | | ||
| - | # Mostra parcelas | ||
| - | parcelas %>% | ||
| - | kbl(caption = " | ||
| - | kable_classic(full_width = F) | ||
| - | |||
| - | # Cria diretório para salvar mapas, figuras e gráficos | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | dirNome <- paste0(' | ||
| - | dir.create(dirNome, | ||
| - | dirNome <- paste0(dirNome, | ||
| - | dir.create(dirNome, | ||
| - | |||
| - | # Cria mapa dos talhões com localização das parcelas (EPSG: 31983) | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | arqNome <- paste0(dirNome, | ||
| - | png(arqNome, | ||
| - | |||
| - | ggplot() + # plot dos talhões e parcelas (cor por idade) | ||
| - | geom_sf(data = talhoesComGeo, | ||
| - | geom_sf(data = parcelasComGeo, | ||
| - | scale_fill_discrete(name = " | ||
| - | guides(fill = guide_legend(reverse=F)) + | ||
| - | coord_sf(datum=st_crs(31983)) + # Especifica sistema de coord. | ||
| - | scale_y_continuous(breaks = seq(from=7356500, | ||
| - | scale_x_continuous(breaks = seq(from=206200, | ||
| - | |||
| - | dev.off() | ||
| - | |||
| - | # ---- | ||
| - | |||
| - | |||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # 2. Amostragem Casual Simples (ACS) | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ---- | ||
| - | |||
| - | # Função para cálculo do Intervalo de Confiança | ||
| - | calcCI = function(err, | ||
| - | 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, | ||
| - | 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/ | ||
| - | out = rbind(means, | ||
| - | row.names(out) = c(' | ||
| - | names(out) = names(df) | ||
| - | return(out) | ||
| - | } | ||
| - | |||
| - | # Cria lista com variáveis de interesse | ||
| - | variaveisDeInteresse <- c(" | ||
| - | # Cria dataframe com valores observados das variáveis de interesse | ||
| - | df <- parcelas %>% select(all_of(variaveisDeInteresse)) | ||
| - | |||
| - | # Calcula o número máximo de unidades amostrais possíveis (N) | ||
| - | parcelaAreaMedia <- mean(parcelas$AREAPARCEL) / 10000 # por ha | ||
| - | N_ACS <- round(AreaTotal / parcelaAreaMedia , 0) # N | ||
| - | |||
| - | # Resultados do inventário (estimação + inferência) | ||
| - | # pelo método Amostragem Casual Simples (ACS) | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | paramEstatisticosACS | ||
| - | |||
| - | # Função para cálculo da intensidade amostral recomendada | ||
| - | # (ha por parcela) da ACS que garante ~10% de erro (altere se desejar) | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | erro <- 10 | ||
| - | tamanhoIdealACS = function(y, N, errDesired=erro/ | ||
| - | 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) | ||
| - | } | ||
| - | # Intensidade amostral usada | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | IAS <- paste0(" | ||
| - | round(AreaTotal/ | ||
| - | |||
| - | # Intensidade amostral que seria necessária para ACS | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | IA <- round(AreaTotal/ | ||
| - | erroTexto <- as.character(erro) | ||
| - | IAI <- paste0(" | ||
| - | "%: 1 parc/", | ||
| - | |||
| - | # Mostra resultados da ACS no Viewer | ||
| - | # Use o " | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | NotaDeRodape <- paste0(IAS, IAI) | ||
| - | paramEstatisticosACS %>% | ||
| - | kbl(caption = " | ||
| - | kable_classic(full_width = F) %>% | ||
| - | footnote(general = NotaDeRodape, | ||
| - | | ||
| - | | ||
| - | # ---- | ||
| - | |||
| - | |||
| - | # ********************************************************************* | ||
| - | # 3. Amostragem Casual Estratificada (ACE) | ||
| - | # **************************************************************** ---- | ||
| - | # Escolhe variável de estratificação | ||
| - | grupos = c(" | ||
| - | |||
| - | # Box-plot da variável de interesse por nível de estratificação | ||
| - | par(mfrow=c( length(grupos), | ||
| - | 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, | ||
| - | gpMeans = lapply(i, function(x) x[1,, | ||
| - | gpVars | ||
| - | cols = 1: | ||
| - | popMean | ||
| - | function(x) sum(x*gpMeans$N) ) /N_ACS | ||
| - | popVar | ||
| - | function(x) sum( x * (gpVars$N/ | ||
| - | popStdErr = sqrt(popVar) | ||
| - | popCI = calcCI(popStdErr, | ||
| - | 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) | ||
| - | } | ||
| - | |||
| - | |||
| - | if(!require(foreach)) | ||
| - | install.packages(" | ||
| - | library(foreach) | ||
| - | |||
| - | # Cria vetor de (True ou False) para marcar dados que estejam dentro | ||
| - | # do intervalo de idades de interesse (entre 2 e 6) | ||
| - | rightAges = talhoes$IDINV > 2 & talhoes$IDINV < 6 | ||
| - | |||
| - | # Resultados do inventário (estimação + inferência) | ||
| - | # pelo método Amostragem Casual Estratificada (ACE) | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | paramEstatisticosACE = foreach( | ||
| - | grp = grupos, .combine = ' | ||
| - | foreach( | ||
| - | niv = parcelas[, | ||
| - | as.character %>% sort, .combine = ' | ||
| - | ) %do% { | ||
| - | inGroup = talhoes[, | ||
| - | popSize = round( | ||
| - | sum(talhoes[rightAges & !is.na(inGroup) & inGroup, | ||
| - | parcelaAreaMedia) | ||
| - | inGroup = parcelas[, | ||
| - | tempPars = parcelas[inGroup, | ||
| - | inventory = calcPars(tempPars, | ||
| - | inventory$grupo = grp | ||
| - | inventory$nivel = niv | ||
| - | inventory$n | ||
| - | inventory$N | ||
| - | return(inventory) | ||
| - | } | ||
| - | paramEstatisticosACE %<>% base:: | ||
| - | lapply(function(x) split(x, x$nivel)) | ||
| - | globalparamEstatisticosACE = popFromStrata(paramEstatisticosACE) | ||
| - | |||
| - | # Função para cálculo da intensidade amostral recomendada | ||
| - | # (ha por parcela) da ACE que garante ~10% de erro (altere se desejar) | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | erro <- 10 | ||
| - | tamanhoIdealACE = function(y, g, Nh, errDesired=erro/ | ||
| - | 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 ) / | ||
| - | ((B^2 * (sum(Nh)^2))/ | ||
| - | return(n) | ||
| - | } | ||
| - | |||
| - | # Calcula o número possível de unidades amostrais (N) por estrato | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | parcPorEstrato <- round( | ||
| - | by(st_area(talhoesComGeo), | ||
| - | (mean(parcelas$AREAPARCEL)), | ||
| - | IA <- round(AreaTotal/ | ||
| - | g = parcelas$IDINV, | ||
| - | Nh = parcPorEstrato), | ||
| - | |||
| - | # Intensidade amostral usada por estrato | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | IAE <- round(by(st_area(talhoesComGeo)/ | ||
| - | | ||
| - | IAS <- paste0(" | ||
| - | |||
| - | # Intensidade amostral que seria necessária para ACE | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | erroTexto <- as.character(erro) | ||
| - | IAI <- paste0(" | ||
| - | "%: 1 parc / ", IA, " ha.") | ||
| - | |||
| - | NotaDeRodape <- paste0(IAS, IAI) | ||
| - | globalparamEstatisticosACE[[grupos]] %>% t %> | ||
| - | kbl(caption = paste0(" | ||
| - | align = " | ||
| - | kable_classic(full_width = F) %>% | ||
| - | footnote(general = NotaDeRodape, | ||
| - | | ||
| - | | ||
| - | |||
| - | # Gráfico de número de amostras necessárias por erro amostral aceitável | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | prjNome <- ' | ||
| - | dirNome <- paste0(' | ||
| - | dir.create(dirNome, | ||
| - | dirNome <- paste0(dirNome, | ||
| - | dir.create(dirNome, | ||
| - | arqNome <- paste0(dirNome, | ||
| - | |||
| - | erro = 1:20 | ||
| - | scsPlotn <- tamanhoIdealACS(parcelas$VTCC, | ||
| - | errDesired = erro/100) | ||
| - | cssPlotn <- tamanhoIdealACE(parcelas$VTCC, | ||
| - | parcPorEstrato, | ||
| - | # dsPlotn = dubleSamplePlotNumber(plotMetrics$PC_VOL_TOT, | ||
| - | # | ||
| - | # | ||
| - | |||
| - | png( arqNome, 30, 20, ' | ||
| - | # jpeg(arqNome, | ||
| - | |||
| - | plot( scsPlotn ~ erro, type=' | ||
| - | ylim=c(0, | ||
| - | axes=F) | ||
| - | lines(erro, cssPlotn, col=' | ||
| - | # 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(' | ||
| - | | ||
| - | # legend = c(' | ||
| - | |||
| - | dev.off() | ||
| - | |||
| - | |||
| - | # Salva resultados em planilha Excel | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | prjNome <- ' | ||
| - | dirNome <- paste0(' | ||
| - | dir.create(dirNome, | ||
| - | dirNome <- paste0(dirNome, | ||
| - | dir.create(dirNome, | ||
| - | |||
| - | arqNome <- paste0(dirNome, | ||
| - | export(list(ACS = paramEstatisticosACS, | ||
| - | ACE37 = paramEstatisticosACE$IDINV$' | ||
| - | ACE52 = paramEstatisticosACE$IDINV$' | ||
| - | file = arqNome) | ||
| - | |||
| - | # save.image(file=' | ||
| - | # load(' | ||
| - | |||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # Este script foi atualizado em Novembro/ | ||
| - | # na seguinte sequência, as mais recentes versões do pacote lidR*: | ||
| - | # | ||
| - | # | ||
| - | # | ||
| - | # | ||
| - | # * lidR latest development version | ||
| - | # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| - | # ---- | ||
| - | </ | ||
| - | |||
| - | ---- | ||
| - | Referências sobre o pacote //lidR// para processamento de dados LiDAR: | ||
| - | |||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
lidar/projetos/rcode_alsmodelo.1701002043.txt.gz · Última modificação: (edição externa)
