R中的栅格:在目标环绕邻域中创建像素

问题描述

在我的示例中:

#Packages
library(spatstat)
library(raster)

#Selection of ants data set
data(ants)
geo.form<-cbind(x=ants$x,y=ants$y)

#DeFinition of raster resolution - 10 units
ants.w<-as.owin(ants)
ext <- as(extent(c(ants.w$xrange,ants.w$yrange)),"Spatialpolygons")
ants.res<-rasterToPoints(raster(ext,resolution = 10),spatial = TRUE)
coordinates(ants.res) <- ~ x + y
# coerce to SpatialPixelsDataFrame
gridded(ants.res) <- TRUE

#Rasterize
antscount<- rasterize(geo.form,raster(ants.res),fun='count',background=0)
values(antscount)[values(antscount) > 0] = 1

#Vizualize
plot(antscount)

ex1

现在,我想找到一种方法来围绕绘图图像中每个像素(蚂蚁)的近邻创建1个像素(共9个像素)和2个像素(共25个像素)。我需要的是,这个新创建的像素的值也为1。

选择邻域像素听起来很容易,就像这样:

# For 1 pixel neighborhood
neigh1 <- matrix(1L,nrow=3,ncol=3); neigh1[2,2] <- 0L
ants1<-which(values(antscount)> 0)
cells<- xyFromCell(antscount,ants1)
e1<-adjacent(antscount,cells,directions=neigh1,pairs=FALSE)
ng_coords1 <- xyFromCell(antscount,e1)

# For 2 pixel neighborhood
neigh2 <- matrix(1L,nrow=5,ncol=5); neigh1[3,3] <- 0L
e2<-adjacent(antscount,directions=neigh2,pairs=FALSE)
ng_coords5 <- xyFromCell(antscount,e2)

问题是我的ng_coords1 / ng_coords5坐标是错误的,尽管xyFromCell(antscount,ants1)条件仍然仅在antscount栅格的顶部。我的目标是建立一个新的蚂蚁存在栅格,该栅格具有8和24个像素,围绕着原始antcount栅格中每个像素(蚂蚁)的近邻。拜托,有什么想法吗?

解决方法

最好用focal

示例数据(请注意简单的代码)

library(spatstat)
library(raster)
data(ants)
geo.form <- cbind(x=ants$x,y=ants$y)
ants.w <- as.owin(ants)
ext <- extent(c(ants.w$xrange,ants.w$yrange))
r <- raster(ext,resolution=10)
antscount<- rasterize(geo.form,r,field=1,background=0)

解决方案

# direct neighbors
x <- focal(antscount,w=matrix(1,ncol=3,nrow=3),fun=max,pad=TRUE,padValue=0)
# 2 cell neighborhood    
y <- focal(antscount,ncol=5,nrow=5),padValue=0)
,
#Packages
library(spatstat)
library(raster)

#Selection of ants data set
data(ants)
geo.form<-cbind(x=ants$x,y=ants$y)

#Definition of raster resolution - 10 units
ants.w<-as.owin(ants)
ext <- as(extent(c(ants.w$xrange,ants.w$yrange)),"SpatialPolygons")
ants.res<-rasterToPoints(raster(ext,resolution = 10),spatial = TRUE)
# coerce to SpatialPixelsDataFrame
gridded(ants.res) <- TRUE

#Rasterize
antscount<- rasterize(geo.form,raster(ants.res),fun='count',background=0)
values(antscount)[values(antscount) > 0] = 1

#Vizualize
plot(antscount)

# For 1 pixel neighborhood
neigh1 <- matrix(1L,nrow=3,ncol=3); neigh1[2,2] <- 0L
ants1<-which(values(antscount)> 0)
cells <- unique(cellFromXY(antscount,geo.form))
e1<-adjacent(antscount,cells,directions=neigh1,pairs=FALSE)
ng_coords1 <- xyFromCell(antscount,e1)
points(ng_coords1,col="red")

ex2

#Rasterize for 1 pixel neighborhood
ng_coords2<-rbind(ng_coords1,geo.form)
antscount.9<- rasterize(ng_coords2,background=0)
values(antscount.9)[values(antscount.9) > 0] = 1
plot(antscount.9)

ex3