【问题标题】:Using a Loop to make a Spatial Join between shapefile and data frames使用循环在 shapefile 和数据框之间进行空间连接
【发布时间】:2016-05-03 06:09:01
【问题描述】:

我有一个多边形文件和一系列数据框。 我想要做的是创建一个循环,在形状文件和所有这些数据框之间进行“空间连接”,但我不断收到错误消息。对此有何想法?

这是我的循环代码

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) 

【问题讨论】:

  • 在你的循环中尝试get(i)而不是i,这将获得数据框,而i只是字符“df1”
  • 谢谢@NicE!真是一个简单的错误!再次感谢您。

标签: r geospatial spatial sp


【解决方案1】:

这是@NicE 在 cmets 中提出的解决方案。这只是在循环内使用get(i) 而不是i 的问题。

  for (i in datasets){
    gridpolygon <- sp::merge(gridpolygon, get(i), by = "id", sort = FALSE)
  }

【讨论】:

    猜你喜欢
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    相关资源
    最近更新 更多