在 R 的栅格中找到一个点的 8 个邻居?

Find 8 neighbors of a point in a raster in R?

如果我有这样的光栅:

 library(raster)
 r1 <- raster(ncol=10, nrow=10)
 r1[] <- runif(ncell(r1))
 r1[] = 1:ncell(r1)
 x=c(-6)            
 y=c(-67)

我可以提取对应于这一点的值:

values = extract(r1, SpatialPoints(cbind(y,x),CRS("+init=EPSG:4326")))

但是,这会提取最接近该点坐标的像素。 我需要提取最近的 9 个像素(提取像素的 8 个邻居)到这一点。有什么想法吗?

您的水平数据距离是垂直数据的两倍。出于这个原因,您需要一个 2:1 矩形而不是围绕您的中心点缓冲一个圆圈。我懒得写一个,所以我在 this post

中找到了 dieghernan 创建的临时函数

将您的点转换为 sf 对象后,我在其周围放置矩形并将其与光栅相交。

library(sf)
library(raster)
library(tidyverse)

r1 <- raster(ncol=10, nrow=10)
r1[] <- runif(ncell(r1))
r1[] = 1:ncell(r1)
x=c(-6)            
y=c(-67)

pt <- st_point(x = c(x,y))

r2 <- cbind.data.frame(values, raster::coordinates(r1)) %>% 
  st_as_sf(coords = c("x", "y"))

r_buff <- st_buffer(pt, 50)

## function by @dieghernan
rect_around_point <- function(x,xsize,ysize){
  bbox <- st_bbox(x)
  bbox <- bbox +c(xsize/2,ysize/2,-xsize/2,-ysize/2)
  return(st_as_sfc(bbox))
}

rect <- rect_around_point(pt, 100, 50)

result <- st_intersection(r2, rect) %>% 
  st_sf()

result

Simple feature collection with 9 features and 1 field
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -54 ymin: -81 xmax: 18 ymax: -45
CRS:           NA
   values        geometry
74     74 POINT (-54 -45)
75     75 POINT (-18 -45)
76     76  POINT (18 -45)
84     84 POINT (-54 -63)
85     85 POINT (-18 -63)
86     86  POINT (18 -63)
94     94 POINT (-54 -81)
95     95 POINT (-18 -81)
96     96  POINT (18 -81)

您可以使用 adjacent 方法。

示例数据

library(raster)
r <- raster(ncol=10, nrow=10)
values(r) = 1:ncell(r)
xy <- cbind(-67, -6) 

解决方案

cells <- cellFromXY(r, xy)
adj <- adjacent(r, cells, 8, include=TRUE)

r[adj[,2]]
# [1] 54 43 53 63 45 55 65 44 64

这 returns 单元格的值(因为 include=TRUE)及其 8 个邻居