[英]How to create polygon according to treeID from spatial points data frame?
I have created a spatial points data frame from .las file which has the following structure and headings. 我从.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
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 带有5个插槽的正式类'SpatialPointsDataFrame'[package“ sp”]
..@ 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. 现在,我想从每个包含多个点的treeID创建多边形,因此希望请求您的帮助。
Thanks in advance for your kind help. 在此先感谢您的帮助。
The lidR package has the functionality you need to create individual tree polygons from point cloud data. lidR软件包具有您需要根据点云数据创建单个树多边形的功能。 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.