id_CRS(x, y) не является ИСТИННОЙ ошибкой в ​​R для обнаружения отдельного дерева с использованием chm

У меня есть данные облака точек LiDAR для измерения 250*250 м ^2 (область леса). Мне нужно выделить отдельные деревья, используя эти данные.

Я создал модель высоты навеса (CHM) с помощью LASTools и использовал этот CHM для разграничения деревьев. Я прилагаю этот файл CHM (этот растр даст информацию о высоте)

Я пытался использовать rLiDAR пакет доступен в R.

Я так закодировал

library(rLiDAR)
schm <- CHMsmoothing(chm, "mean", 5)

# Setting the fws:
fws <- 5 # dimention 5x5

# Setting the specified height above ground for detectionbreak
minht <- 8.0

# Getting the individual tree detection list 
treeList <- FindTreesCHM(schm, fws, minht)

Но это дает ошибку

Ошибка: uniqueCRS(x, y) не TRUE

Как я могу преодолеть это?

1 ответ

Решение

В функции FindTreesCHMв строках 17-18 мы находим:

XYmax <- SpatialPoints(xyFromCell(setNull, Which(setNull == 
    1, cells = TRUE)))

Который создает SpatialPoints, Проблема в том, что у объекта нет проекции:

projection(XYmax)
# [1] NA

Затем строка 19

htExtract <- over(XYmax, as(chm, "SpatialGridDataFrame"))

Выдает ошибку, потому что XYmax не имеет проекции, в то время как chm имеет:

projection(chm)
# [1] "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"

И как функция over Сначала проверив проекции объектов, мы получим ошибку:

identicalCRS(XYmax, as(chm, "SpatialGridDataFrame"))
# [1] FALSE

В качестве обходного пути можно написать собственную функцию, добавив строку, задающую проекцию XYmax к проекции chm,

Также есть ошибка, выдаваемая строкой 22 из-за строки 21.

Эту функцию можно легко исправить, но я настоятельно рекомендую связаться с сопровождающим пакета (maintainer("rLiDAR")).


Вот одно из возможных исправлений:

library(rLiDAR)
library(raster)

FindTreesCHM.fix <- function(chm, fws = 5, minht = 1.37) 
{
    if (class(chm)[1] != "RasterLayer") {
        chm <- raster(chm)
    }
    if (class(fws) != "numeric") {
        stop("The fws parameter is invalid. It is not a numeric input")
    }
    if (class(minht) != "numeric") {
        stop("The minht parameter is invalid. It is not a numeric input")
    }
    w <- matrix(c(rep(1, fws * fws)), nrow = fws, ncol = fws)
    chm[chm < minht] <- NA
    f <- function(chm) max(chm)
    rlocalmax <- focal(chm, fun = f, w = w, pad = TRUE, padValue = NA)
    setNull <- chm == rlocalmax
    XYmax <- SpatialPoints(xyFromCell(setNull, Which(setNull == 
        1, cells = TRUE)))
    projection(XYmax) <- projection(chm)
    htExtract <- over(XYmax, as(chm, "SpatialGridDataFrame"))
    treeList <- cbind(slot(XYmax, "coords"), htExtract)
    colnames(treeList) <- c("x", "y", "height")
    return(treeList)
}


chm <- raster("dem_test.tif")
schm <- CHMsmoothing(chm, "mean", 5)
fws <- 5
minht <- 8.0
treeList <- FindTreesCHM.fix(schm, fws, minht)

#           x       y  height
# 1  256886.5 4110940 14.1200
# 2  256805.5 4110884 13.8384
# 3  256756.5 4110880 15.2004
# 4  256735.5 4110874 17.6100
# 5  256747.5 4110840 18.2592
# 6  256755.5 4110828 19.9252
# 7  256777.5 4110806 12.7180
# 8  256780.5 4110802 14.6512
# 9  256780.5 4110792 15.8532
# 10 256763.5 4110786 18.7128
# 11 256766.5 4110764 14.4972

введите описание изображения здесь

Другие вопросы по тегам