0

我试图通过使用 terra::extract() 来获取地块中的平均 NDVI 值。我注意到来自 terra::extract() 的数据框为我提供了 NA 值(实际上,在 4519 个观察值中,我有 2494 个 NA 值)。我的 NDVI 栅格的空间分辨率约为 0.5 英尺(0.15 米)。下面是我的代码。我也尝试过exactextractr::exact_extract(),但它没有给我与raster::extract() 相同的值。根据我的阅读,exactextractr::exact_extract() 说明了位于多边形内的单元格部分。我想知道哪个更好用,exactextractr::exact_extract() 或 terra::extract()。任何帮助/指导都会很棒!

epa_fatparcels_sidewalk_adjacent <- 
  epa_parcels_sidewalk_adjacent %>%
  st_transform(projection) %>% 
  st_buffer(330) %>% 
  st_transform(st_crs(epa_ndvi))

tictoc::tic()
epa_ndvi_sr<- terra::rast(epa_ndvi)
epa_fatparcels_sidewalk_adjacent_sv <- epa_yards_sidewalk_adjacent %>%
  st_transform(st_crs(epa_ndvi)) %>%
#--- convert to a SpatVector object ---#
  as(., "Spatial") %>% terra::vect()
epa_fatparcels_ndvi_v2 <- terra::extract(
    epa_ndvi_sr, 
    epa_fatparcels_sidewalk_adjacent_sv, 
    fun="mean"
)
tictoc::toc() #took 17.92 sec elapsed
4

2 回答 2

1

您可以添加na.rm=TRUE以忽略这些NA

epa_fatparcels_ndvi_v2 <- terra::extract(
    epa_ndvi_sr, 
    epa_fatparcels_sidewalk_adjacent_sv, 
    fun="mean", na.rm=TRUE
)

另外,这条线

as(., "Spatial") %>% terra::vect()

大概可以简化为

terra::vect()

至于exactrextactr——如果细胞相对较少,这最重要。terra::extract您可以使用参数来exact=TRUE获得相同的结果。

于 2021-03-02T05:43:20.900 回答
0

@MireilleVargas 这可能与栅格terra::extract()中使用的列有关。同样的事情发生在我身上,所以我通过 ArcMap 中的交叉引用进一步调查并发现它正在拉动“计数”列——它计算每个特定值的像素数——而不是“值”列。我注意到在通过导入所述栅格rast以及将 RasterLayer 转换为 SpatRast 对象时都会发生这种情况。似乎光栅包可能会自动检测值列,但在 terra 中,要切换从光栅中提取的活动类别,请使用该activeCat()功能。例如,activeCat(ndviRast) <- 2

于 2021-08-04T07:10:52.213 回答