如何根据空间点数据框中的treeID创建多边形?

时间:2018-02-20 10:08:28

标签: r spatial polygons lidar

我已经从.las文件创建了一个空间点数据框,它具有以下结构和标题。

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
  

将此数据转换为空间点数据框

 df <- as.spatial(Rnorm)
  

空间点数据框的结构如下:

 str(df)

正式班级&#39; SpatialPointsDataFrame&#39; [package&#34; sp&#34;]有5个插槽

..@ 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

现在我想从每个包含多个点的treeID创建多边形,以便请求您的帮助。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

lidR包具有从点云数据创建单个树多边形所需的功能。以下example显示了如何将点云数据转换为单个树多边形:

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