1
votes

I have created a spatial points data frame from .las file which has the following structure and headings.

head(Rnorm@data)

         X       Y     Z  gpstime Intensity ReturnNumber NumberOfReturns Classification ScanAngle pulseID treeID
1: 390385.3 5847998 23.35 8194.459         9            1               2              5       -14       1    291
2: 390385.9 5847998  0.52 8194.479        76            1               1              4       -13       2    291
3: 390385.1 5847998  1.06 8194.483        72            1               1              4       -13       3    291
4: 390385.7 5847999  0.81 8194.483        75            1               1              4       -13       4    291
5: 390386.1 5848001  0.41 8194.503        15            2               2              3       -13       5    241
6: 390385.4 5848000  0.26 8194.503        78            1               1              3       -13       6    241

converting this data to spatial points data frame

 df <- as.spatial(Rnorm)

the structure of the spatial points data frame looks like:

 str(df)

Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots

..@ data       :'data.frame':   71164 obs. of  9 variables:
  .. ..$ Z              : num [1:71164] 23.35 0.52 1.06 0.81 0.41 ...
  .. ..$ gpstime        : num [1:71164] 8194 8194 8194 8194 8195 ...
  .. ..$ Intensity      : int [1:71164] 9 76 72 75 15 78 54 76 55 79 ...
  .. ..$ ReturnNumber   : int [1:71164] 1 1 1 1 2 1 1 1 2 1 ...
  .. ..$ NumberOfReturns: int [1:71164] 2 1 1 1 2 1 1 1 2 1 ...
  .. ..$ Classification : int [1:71164] 5 4 4 4 3 3 3 3 3 3 ...
  .. ..$ ScanAngle      : int [1:71164] -14 -13 -13 -13 -13 -13 -13 -14 -14 -14 
  .. ..$ pulseID        : int [1:71164] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ treeID         : int [1:71164] 291 291 291 291 241 241 241 291 NA NA 
  ..@ coords.nrs : num(0) 
  ..@ coords     : num [1:71164, 1:2] 390385 390386 390385 390386 390386 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : NULL
  .. .. ..$ : chr [1:2] "X" "Y"
  ..@ bbox       : num [1:2, 1:2] 390281 5847998 390386 5848126
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:2] "X" "Y"
  .. .. ..$ : chr [1:2] "min" "max"
  ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
  .. .. ..@ projargs: chr NA

Now I want to create the polygon from each of the treeID which contains more than one points so would like to request for your kind help.

Thanks in advance for your kind help.

1
Please specify language you're using in tagsVadim Kotov
Please add the loaded packages.loki
The loaded package are lidR and sp and rgdal.yogendra Karna
@loki, thanks for the link. I tried to create with similar structure but it didn't work since I couldn't combine the treeID with the coordinates in SpatialPolygons which will provide me with the boundary of points falling under it. I have coordinates of points in xy and its treeID so how can I combine both of them in a Polygons.yogendra Karna

1 Answers

0
votes

The lidR package has the functionality you need to create individual tree polygons from point cloud data. The following example shows how to convert point cloud data to individual tree polygons:

library(lidR)

# read file
las = readLAS("Example.las")

# ground classification
lasground(las, MaxWinSize = 10, InitDist = 0.05, CellSize = 7)

# normalization
lasnormalize(las, method = "knnidw", k = 10L)

# compute a canopy image
chm = grid_canopy(lasnorm, res = 0.5, subcircle = 0.2, na.fill = "knnidw", k = 4)
chm = as.raster(chm)
kernel = matrix(1,3,3)
chm = raster::focal(chm, w = kernel, fun = mean)
chm = raster::focal(chm, w = kernel, fun = mean)

# tree segmentation
crowns = lastrees(las, "watershed", chm, th = 4, extra = TRUE)

# display
tree = lasfilter(las, !is.na(treeID))
plot(tree, color = "treeID", colorPalette = pastel.colors(100), size = 1)

# More stuff
library(raster)
contour = rasterToPolygons(crowns, dissolve = TRUE)

plot(chm, col = height.colors(50))
plot(contour, add = T) 

enter image description here