2016-02-15 9 views
1

У меня есть данные облачных данных LiDAR для измерения области 250 * 250 м^2 (лесная область). Мне нужно выделить отдельные деревья, используя эти данные.sameCRS (x, y) не является ИСТИННОЙ ошибкой в ​​R для индивидуального обнаружения дерева с использованием chm

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

Я пытался использовать 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) 

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

Error: identicalCRS(x, y) is not TRUE

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

+0

Как создать 'chm'? 'chm <- растр()'? –

+0

Используя lasheight, я создал нормализованный график высоты. Мне просто нужна максимальная высота из этих данных, поэтому с этой нормированной высотой я создал dem (используя las2dem), тогда я сохранил его как файл tif и загрузился в R – bibinwilson

+0

Это не мой вопрос! Как вы читаете свой файл в R? –

ответ

0

В функции 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 

enter image description here

+0

Откуда я могу получить вышеуказанный исходный код? – bibinwilson

+0

'edit (FindTreesCHM)'. Я также отредактировал ответ с возможным исправлением. –

+0

@bibinwilson Проверьте правильность вывода. –

 Смежные вопросы

  • Нет связанных вопросов^_^