在 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 个邻居
如果我有这样的光栅:
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 个邻居