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: 2024/03/23 20:17 (edição externa)