如何使用 lidR::clip_circle() 获取具有特定区域的激光数据集的循环子集?

How to get a circular subset of a las-dataset with specific area using lidR::clip_circle()?

要获得具有特定区域的激光数据集的循环子集,我想使用 lidR::clip_circular()。为此,我首先计算激光数据集的中心点,然后定义要使用的半径,以从激光数据集的质心得到恰好 500m^2 的子集。该操作有效并且不会引发任何错误,但是结果不正确,请参阅我的简短代码片段末尾的 base::print()。

我也尝试过使用 lidR::clip_roi(),提供代表我感兴趣区域的多边形,但得到了相同的错误结果。现在我不知道如何继续。我可以想象,这是关于我正在使用的 crs (EPSG:25832) 或者因为该区域是圆形而不是矩形...

las_ctpt <- sf::st_coordinates(sf::st_centroid(sf::st_as_sfc(sf::st_bbox(las_norm, crs = crs_epsg25832), crs = crs_epsg25832), crs = crs_epsg25832))
# get the centroid of the (normalized) las-dataset

buff_radius <- base::sqrt(500/pi)
# calculate the radius to get a circular subset with an area of exactly 500m^2 of the las-dataset

las_subset <- lidR::clip_circle(las = las_norm, radius = buff_radius, xcenter = las_ctpt[, 1], ycenter = las_ctpt[, 2])
# subset the (normalized) las-file

base::print(las_subset)
class        : LAS (v1.4 format 6)
memory       : 3.7 Mb 
extent       : 78????.?, 78????.?, 528????, 528???? (xmin, xmax, ymin, ymax)
coord. ref.  : ETRS89 / UTM zone 32N 
area         : 604 m²
points       : 38.9 thousand points
density      : 64.45 points/m²
density      : 47.87 pulses/m²

las_subset_rect <- ((base::sqrt(500/pi))*2)^2
# this should be a rectangular box around the subset I want to have with an area of: (radius*2)^2

base::print(las_subset_rect)
[1] 636.6198

(请注意,由于隐私问题,我已将我学习区域的确切位置涂黑。但是,我使用的是 EPSG:25832,这是德国使用的公制 CRS。)

我可以用示例数据重现您的问题

LASfile <- system.file("extdata", "Megaplot.laz", package="lidR")
las = lidR::readLAS(LASfile)
las_ctpt <- sf::st_coordinates(sf::st_centroid(sf::st_as_sfc(sf::st_bbox(las))))
buff_radius <- base::sqrt(500/pi)
las_subset <- lidR::clip_circle(las = las, radius = buff_radius, xcenter = las_ctpt[, 1], ycenter = las_ctpt[, 2])
las_subset
#> class        : LAS (v1.2 format 1)
#> memory       : 51.5 Kb 
#> extent       : 684867.3, 684892.2, 5017878, 5017903 (xmin, xmax, ymin, ymax)
#> coord. ref.  : NAD83 / UTM zone 17N 
#> area         : 576 m²
#> points       : 863  points
#> density      : 1.5 points/m²
#> density      : 0.96 pulses/m²

然而,这只是面积估计不准确的产物。点云的数学面积为 0 平方米。所有其他测量值都是采用各种策略的近似值。 lidR 使用 2 米的分辨率计算占用网格。这是用户要求模仿 LAStools 在 4.0 版中所做的更改。对于不均匀采样的大型数据集更准确,但高估了小型数据集的面积。如果您使用凸包计算它(lidR 在 4.0 版之前所做的),您会得到

sf::st_area(sf::st_convex_hull(las_subset))
#> 484.1633 [m^2]

哪个更接近预期值