Unterschiedliche Ergebnisse bei Metriken, die mit LAStools und lidR berechnet wurden

Aug 15 2020

Ich habe ein Baldachinhöhenmodell, das aus TLS-Daten mit hoher Dichte auf einem 60 x 200 Meter großen Grundstück berechnet wurde. Ich habe versucht, Voxel mit LAStools und lidR zu berechnen und habe signifikant unterschiedliche Ergebnisse erzielt. Ich habe mich gefragt, ob jemand klarstellen kann, was passiert. Lastools-Skript, das ich verwendet habe:

lasvoxel -i infile.laz -drop_class 2 -step 0.5 -o outfile.las

number of voxels: 189077 

lidR-Code:

las = readLAS("infile.laz", select = "xyzc", filter = "-drop_class 2 -drop_z_below 0 ")
voxels <- voxelize_points(las, res = 0.5)

number of voxels: 196257 

Auch berechnete Schiefe und Kurtosis der Baldachinhöhe: LAStools:

lascanopy -i infiles\*.laz -kur -ske -height_cutoff 1.3 -files_are_plots -names -o outfile.csv

Ergebnis:

plots        ske       kur
72a-4.laz   1.0905  5.58125
11a-4.laz   0.362   2.594
34-2.laz    0.1675  2.00875
63a-1.laz   -0.3115 2.36

lidR:

library(e1071)

files <- list.files(path= "/files", pattern= "*.laz", full.names = TRUE, recursive = FALSE)
O = lapply(files, function(x) {

  las <- readLAS(x, select = "xyzc") 

  z <- las$Z
  z_canopy <- z[z>=1.3]
  skew <- skewness(z_canopy)
  kur <- kurtosis(z_canopy)
  
  return(data.frame(file=x, skewH = skew, kurH=kur))
})

Ergebnis:

plots          ske        kur
72a-4.laz   1.090595768  2.58132381
11a-4.laz   0.362007296  -0.40599745
34-2.laz    0.167542141  -0.991227478
63a-1.laz   -0.311523396 -0.640029907

Wie wir sehen können, sind die Ergebnisse für die Schiefe gleich, aber die Kurtosis-Werte sind sehr unterschiedlich. Kann mir bitte jemand helfen zu verstehen, warum es so einen großen Unterschied gibt?

Antworten

3 JRR Aug 15 2020 at 19:34

In Bezug auf die Anzahl der Voxel kann dies durch die Ausrichtung der Voxel erklärt werden. lidRzentriert das Voxel auf, res/2was bedeutet, dass der Boden des gemahlenen Voxels bei 0 und nicht in der Mitte liegt. Wenn in LAStools Voxel auf 0 zentriert sind, kann die Verschiebung den Unterschied erklären. Ich habe nicht versucht, sicher zu sein, aber das macht Sinn.

Über Schiefe und Kurtosis ist Ihre Frage schlecht gestellt. Sie fragen nicht, warum lidReine andere Ausgabe als bereitgestellt wird, LAStoolssondern warum e1071eine andere Ausgabe als bereitgestellt wird LAStools. lidRmacht das gleiche als LAStoolseigentlich.

library(e1071)
library(lidR)

LASfile <- system.file("extdata", "Megaplot.laz", package="lidR")
las <- readLAS(LASfile, filter = "-drop_z_below 1.3")

# e1071
skewness(las$Z) # -0.42 kurtosis(las$Z) # -0.66

# lidR
cloud_metrics(las, .stdmetrics_z)[c("zskew", "zkurt")]
# -0.42
# 2.33

# LAStools
system("lascanopy.exe -i Megaplot.laz -kur -ske -height_cutoff 1.3 -files_are_plots -names -o output.csv")
# -0.42
# 2.33

In lidRder Kurtosis wird nach Wikipedia-Formeln definiert . Wir können uns vorstellen, dass LAStoolsdies auch so ist. Im lidRCode ist:

n * sum((z - zmean)^4)/(sum((z - zmean)^2)^2)

Im e1071Code ist:

# Here the same formula
r <- n * sum((x-xmean)^4)/(sum((x-xmean)^2)^2)

# Then why output is different
y <- if (type == 1) 
  r - 3
else if (type == 2)
  ((n + 1) * (r - 3) + 6) * (n - 1)/((n - 2) * (n - 3))
else 
  r * (1 - 1/n)^2 - 3

return(y)

Laut Wikipedia-Seite scheint es der übermäßigen Kurtosis oder so etwas zu entsprechen.