Ferramentas do usuário

Ferramentas do site


lidar:projetos:rcode_invdrone

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Processamento de dados LiDAR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# Autor: Humberto Menecheli
#        Departamento de Ciências Florestais
#        ESALQ/USP - 09/Jun/2022
#
# Processa nuvens LiDAR (plantio/parcela) coletadas com drone em Goiás 
#
# Linguagem de programação:
#       R (v 4.2)
#       pacote lidR* (v 4.0.2 May 4th, 2022) Jean Romain Roussel
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rm(list=ls(all=TRUE))                                   # Limpa memória
gc()

# Carrega pacotes lidR e terra
require(lidR); require (terra)

# Define diretório de trabalho ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lidarDir<- "C:/LiDAR/"

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ESTUDO DA NUVEM de pontos LiDAR obtidos abaixo da copa em parcela
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lidarPar <- "eparcela.las"

# Define nome completo do aquivo com a nuvem LiDAR da parcela ~~~~~~~~~
parcelArq <- paste0(lidarDir, lidarPar)

# Leitura parcial dos dados LiDAR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
par1 <- readLAS(parcelArq,              # lê apenas XYZ, e classificação
                select = "xyzc")  
print(par1@data)
summary(par1@data)

# A nuvem de pontos pertence a uma parcela circular com área de 400m2.
# Para conferir o perímetro dessa parcela, vamos plotar alguns pontos
# nessa borda. Primeiramente, podemos definir uma função que cria n
# coordenadas na borda de um círculo com centro e raio conhecidos.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
borda <- function(x_centro, y_centro, raio, n_pontos){
  angulo <- seq(0, 2 * pi, length = n_pontos)
  x      <- raio * cos(angulo) + x_centro
  y      <- raio * sin(angulo) + y_centro
  pontos <- cbind(x, y)
  return(pontos)
}

# Cálculo do centro da parcela ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
xcentral <- round(mean(par1@data$X), digits =1)
ycentral <- round(mean(par1@data$Y), digits =1)

# Uso da função borda para gerar as coordenadas de 20 pontos no
# perímetro da parcela círcular de área igual a 400 m2,
# ou seja, raio =~ 11.18 m2
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
raio  <- 11.18
coord <- borda(xcentral, ycentral, raio, 20)

# Inclusão das coordenadas do ponto central ~~~~~~~~~~~~~~~~~~~~~~~~~~~
coord <- rbind(coord, c(xcentral, ycentral))

# A função vect(), do pacote "terra", permite criar um objeto espacial
# para as coordenadas geradas. Definiremos como CRS dessas coordenadas,
# o mesmo atribuído originalmente à nuvem de pontos (EPSG:31982).
crsNuvem <- par1@crs$input
pts <- vect(coord, type="points", crs = crsNuvem)

# As coordenadas podem agora ser plotadas em um mapa 2D do pacote terra
terra::plot(pts, col="red", pch=20, cex=2)

# A nuvem de pontos original pode ser "desbastada" (p.ex. 100 pts/m2)
# com a função decimate_points() e exibida como um plot 3D
parDesb   <- decimate_points(par1, random(100))
parDesb3D <- plot(parDesb,
                  color  = "Z",
                  bg     = "black")

# As 21 coordenadas definidas para demarcar o perímetro e o centro
# da parcela podem ser exibidas a uma certa altura no mesmo plot 3D.
# Para isso, definimos essa altura (p.ex.: 35m) como um atributo em um 
# data-frame de uma única coluna "H" com 21 linhas ...
alturas <- data.frame(H=rep(c(35), each = 21))

# ... incluímos essas alturas como atributo das coordenadas,
# e recriamos o objeto espacial que as representa no formato sf
pts <- sf::st_as_sf(vect(coord, 
                         atts=alturas, 
                         type="points", 
                         crs = crsNuvem)
                    )
# ... para, então, acrescentá-las no plot 3D
add_treetops3d(parDesb3D, pts, z="H")


# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ESTUDO DA NUVEM DE PONTOS gerada por sobrevoo LiDAR acima DO PLANTIO
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lidarPla <- "eplantio.las"

# Define nome completo do aquivo com a nuvem LiDAR do plantio ~~~~~~~~~
plntioArq <- paste0(lidarDir, lidarPla)

# Leitura parcial dos dados LiDAR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pla <- readLAS(plntioArq, select = "xyzc")
print(pla@data)
summary(pla@data)

# Clipa parcela circular de 400 m2 de dentro da nuvem do plantio ~~~~~~
par2  <- clip_circle(pla, xcentral, ycentral, raio)

# Plot da parcela colorida por classificação ~~~~~~~~~~~~~~~~~~~~~~~~~~
parPlantio <- plot(par2,
                   size   = 3,
                   color  = "Classification",
                   bg     = "black")
# Inclusão das esferas delimitadoras na parcela extraída do plantio ~~~
add_treetops3d(parPlantio, pts, z="H") # H define a altura das esferas

# Plot da nuvem desbastada de pontos do plantio ~~~~~~~~~~~~~~~~~~~~~~~
plaDesb   <- decimate_points(pla, random(100))
plaDesb3D <- plot(plaDesb,
                  color  = "Z",
                  bg     = "black")
# Inclusão das esferas delimitadoras no plantio ~~~~~~~~~~~~~~~~~~~~~~~
add_treetops3d(plaDesb3D, pts, z="H") # H define a altura das esferas

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Este script foi criado em Junho/2022 depois de instalar as mais
# recentes versões dos pacotes lidR, sf, raster e terra nessa data.
#
# * lidR latest development version: sequência de instalação de pacotes
#   devtools::install_github("Jean-Romain/rlas", dependencies=TRUE)
#   install.packages("raster", dependencies = TRUE)
#   install.packages('terra', repos='https://rspatial.r-universe.dev')
#   devtools::install_github("Jean-Romain/lidR")
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

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

lidar/projetos/rcode_invdrone.txt · Última modificação: 2024/03/23 20:17 por 127.0.0.1