使用循环在 shapefile 和数据框之间建立空间连接
Using a Loop to make a Spatial Join between shapefile and data frames
我有一个多边形形状文件和一系列数据框。 我想做的 是创建一个循环,在形状文件和所有这些数据帧之间创建一个 'Spatial Join',但我一直收到错误。对此有什么想法吗?
这是我的循环代码
datasets <- c("df1","df2","df3")
for (i in datasets){
gridpolygon <- sp::merge(gridpolygon, i, by = "id", sort = FALSE) #Spatial Join
}
> Error in table(y[, by.y]) : attempt to set an attribute on NULL
这是一个分三步的可重现示例。
(1) 从随机多边形创建规则网格多边形
# Load libraries
library(sp)
library(rgdal)
library(rgdal)
library(raster)
library(rgeos)
library(dismo)
library(data.table)
### create a regular gridded polygon from a random polygon
# create polygon Random Polygon
set.seed(1)
dat <- matrix(stats::rnorm(2000), ncol = 2)
ch <- chull(dat)
coords <- dat[c(ch, ch[1]), ] # closed polygon
sp_poly <- SpatialPolygons(list(Polygons(list(Polygon(coords)), ID=1)))
plot(sp_poly)
# create a regular gridded polygon
# Create an empty raster
grid <- raster(extent(sp_poly))
# Choose its resolution.
res(grid) <- 1
# coordinate reference system
proj4string(grid)<-CRS("++proj=utm +zone=48") # set it to UTM
# Transform this raster into a polygon
gridpolygon <- rasterToPolygons(grid)
# Create and ID variable of Grid Cells
gridpolygon@data$id = rownames(gridpolygon@data)
plot(gridpolygon)
(2) 创建数据框
df1 <- data.table(id=seq(1:5), x=c(11:15))
df2 <- data.table(id=seq(1:5), y=c(21:25))
df3 <- data.table(id=seq(1:5), z=c(31:35))
(3) 尝试循环
datasets <- c("df1","df2","df3")
for (i in datasets){
gridpolygon <- sp::merge(gridpolygon, i, by = "id", sort = FALSE) #Spatial Join
}
> Error in table(y[, by.y]) : attempt to set an attribute on NULL
如果我一个一个地进行空间连接,我会得到正确的结果,但这不会解决我的问题,因为我有太多数据集
# Spatial join, one by one
gridpolygon <- sp::merge(gridpolygon, df1, by = "id", sort = FALSE)
gridpolygon <- sp::merge(gridpolygon, df2, by = "id", sort = FALSE)
gridpolygon <- sp::merge(gridpolygon, df3, by = "id", sort = FALSE)
这是@NicE在评论中提出的解决方案。这只是在循环中使用 get(i)
而不是 i
的问题。
for (i in datasets){
gridpolygon <- sp::merge(gridpolygon, get(i), by = "id", sort = FALSE)
}
我有一个多边形形状文件和一系列数据框。 我想做的 是创建一个循环,在形状文件和所有这些数据帧之间创建一个 'Spatial Join',但我一直收到错误。对此有什么想法吗?
这是我的循环代码
datasets <- c("df1","df2","df3")
for (i in datasets){
gridpolygon <- sp::merge(gridpolygon, i, by = "id", sort = FALSE) #Spatial Join
}
> Error in table(y[, by.y]) : attempt to set an attribute on NULL
这是一个分三步的可重现示例。
(1) 从随机多边形创建规则网格多边形
# Load libraries
library(sp)
library(rgdal)
library(rgdal)
library(raster)
library(rgeos)
library(dismo)
library(data.table)
### create a regular gridded polygon from a random polygon
# create polygon Random Polygon
set.seed(1)
dat <- matrix(stats::rnorm(2000), ncol = 2)
ch <- chull(dat)
coords <- dat[c(ch, ch[1]), ] # closed polygon
sp_poly <- SpatialPolygons(list(Polygons(list(Polygon(coords)), ID=1)))
plot(sp_poly)
# create a regular gridded polygon
# Create an empty raster
grid <- raster(extent(sp_poly))
# Choose its resolution.
res(grid) <- 1
# coordinate reference system
proj4string(grid)<-CRS("++proj=utm +zone=48") # set it to UTM
# Transform this raster into a polygon
gridpolygon <- rasterToPolygons(grid)
# Create and ID variable of Grid Cells
gridpolygon@data$id = rownames(gridpolygon@data)
plot(gridpolygon)
(2) 创建数据框
df1 <- data.table(id=seq(1:5), x=c(11:15))
df2 <- data.table(id=seq(1:5), y=c(21:25))
df3 <- data.table(id=seq(1:5), z=c(31:35))
(3) 尝试循环
datasets <- c("df1","df2","df3")
for (i in datasets){
gridpolygon <- sp::merge(gridpolygon, i, by = "id", sort = FALSE) #Spatial Join
}
> Error in table(y[, by.y]) : attempt to set an attribute on NULL
如果我一个一个地进行空间连接,我会得到正确的结果,但这不会解决我的问题,因为我有太多数据集
# Spatial join, one by one
gridpolygon <- sp::merge(gridpolygon, df1, by = "id", sort = FALSE)
gridpolygon <- sp::merge(gridpolygon, df2, by = "id", sort = FALSE)
gridpolygon <- sp::merge(gridpolygon, df3, by = "id", sort = FALSE)
这是@NicE在评论中提出的解决方案。这只是在循环中使用 get(i)
而不是 i
的问题。
for (i in datasets){
gridpolygon <- sp::merge(gridpolygon, get(i), by = "id", sort = FALSE)
}