带有NAs的光栅文件是环境凸包之外区域的表示。

3
我需要你的 R 技能支持。在我的一篇论文中,我使用遥感变量(LT 波段 3、4、5、7,DEM 和 NDVI)对亚马逊地区的树种分布进行建模,并计划将所有预测值“凸包”之外的地点屏蔽。我已经查阅了 R 中的多个包和函数(如 convhull 和 convhulln),但没有成功。
我已提取了 6000 多个存在点的所有变量值。我需要对该点集做一个凸包,然后将其转换为地理空间,并将所有区域屏蔽掉。所以基本上我需要一个带有 NA 和 1 的栅格文件(NA 区域在凸包之外,而 1 区域在凸包内)。
dbase <-read.csv("dbase.csv")
names(dbase)
# [1] "id"        "pca"       "block"     "strip"     "tree.n"    "plaque"   
# [7] "species"   "diameter"  "height"    "volume"    "x"         "y"        
# [13] "condition" "sector" 
coordinates(dbase)<-~x+y

files <- list.files("C:/Users/...", 
                    pattern="asc", full.names=TRUE )
predictors <-stack(files) # b3, b4, b5, b7, ndvi and dem
presence_var <-extract(predictors,dbase)

预测变量

(Predictor variables)
   #      B3  B4 B5 B7 DEM      ndvi
   # [1,] 25  75 57 18 349 0.5000000
   # [2,] 22  79 64 19 332 0.5643564
   # [3,] 24  79 62 20 336 0.5339806
   # [4,] 23  79 62 20 341 0.5490196
   # [5,] 25  80 63 21 307 0.5238096
   # [6,] 24  83 63 20 342 0.5514019
   # ...

conhull <-convHull(presence_var)
pr <- predict(conhull, predictors)
plot(pr) # empty results

有什么建议吗?


很高兴看到有关SDM的问题 :) 但是,如果您想增加获得良好答案的机会,请发布一个最小可重现示例。这包括一些示例数据和您已尝试过的一些代码。此帖子可能会对您有所帮助:https://dev59.com/eG025IYBdhLWcg3whGSx - JanLauGe
谢谢JanLauGe,我已经做了。希望有人能够帮忙 :) - Pablo Perez
1个回答

2
我已经创建了一些示例数据,以说明我认为适合您的方法:
library(raster)
library(tidyverse)

# an empty raster of global extent
r <- raster()
# make up some raster values
values(r) <- runif(length(r))

# make up some random coordinates around north america
coords <- cbind( 
  lon = runif(100, min = -120, max = -60),
  lat = runif(100, min = 30, max = 50))

# let's have a look
plot(r)
points(coords, add = TRUE)

在此输入图片描述


以下是使用示例数据进行的操作:

  1. 识别组成凸包的点
  2. 创建凸包 SpatialPolygon
  3. 对栅格进行遮罩处理,仅保留与凸包相交的单元格

# get the convex hull
hull_points <- coords[chull(coords),]

# convert to polygon
hull_polygon <- hull_points %>%
  Polygon() %>%
  list() %>%
  Polygons(1) %>%
  list() %>%
  SpatialPolygons()

# mask the raster
rr <- mask(r, hull_polygon)

# let's have another look
plot(rr)

enter image description here

顺便提一句:如果我正确理解你想做的事情,我建议在进行遮罩处理之前,在空间多边形周围添加一个缓冲区。这是因为很可能存在高栖息地适宜性区域紧邻您的边缘出现,但在凸包外面,您应该小心不要将其剪切掉。


非常感谢@JanLauGe。我也尝试了使用几何包的凸包函数。我需要对所有6个变量进行环境凸包计算(而不是仅基于坐标的“地理凸包”)。然后,我会尝试创建一个栅格文件,其中包含超出这个6维凸包的像素的NA值。 - Pablo Perez
我明白了!你是在计算6D凸包时遇到了困难,还是只是在从光栅中裁剪这些值方面有问题? - JanLauGe
我也可以从每个2x2变量中进行环境外壳,问题是我不知道如何从环境空间生成“掩码”光栅到地理空间。我不知道这是否清楚 :) - Pablo Perez
到目前为止,我只看到过基于坐标的地理凸包,而没有考虑变量并将其转换到“地理”空间中。 - Pablo Perez
正如你已经指出的那样,你可以使用 geometry::convhulln(coords) 计算 n 维凸包。要找出一个点是否在 chull 中,请参考这篇文章:https://dev59.com/OG445IYBdhLWcg3wWZEU(但简短的答案是它可能会变得计算昂贵)。 - JanLauGe
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接