Hello, I would like to extract a single grid cell from a SpatialGrid or a SpatialGridDataFrame object without destroying the grid structure, that is, the resulting object must be a SpatialGrid or a SpatialGridDataFrame consisting of a single grid cell. Here is a minimum working example:
library(sp); data(meuse.grid); coordinates(meuse.grid) = c("x", "y") # promote to SpatialPointsDataFrame gridded(meuse.grid) <- TRUE # promote to SpatialPixelsDataFrame x <- as(meuse.grid, "SpatialGridDataFrame") # creates the full grid fullgrid(meuse.grid) <- TRUE image(meuse.grid); # The following works: latInd <- 20:70; lonInd <- 10:70; # the grid cell indices along latitude and longitude, respectively a_df <- meuse.grid[latInd, lonInd, "dist"]; # the example SpatialGridDataFrame object a_grid <- as(meuse.grid, "SpatialGrid"); # the example SpatialGrid object image(a_df, add = TRUE, col = bpy.colors()); # the following prints a warning and assumes the grid cellsize of the single-cell dimension is equal to the cellsize of the # other dimension, which is not always appropriate: lonInd <- 50; a1_df <- meuse.grid[latInd, lonInd, "dist"]; image(a1_df); # the following returns a SpatialPointsDataFrame object, which is not what is desired: latInd <- 50; a11_df <- meuse.grid[latInd, lonInd, "dist"]; # The following simply fails: a11_grid <- a_grid[latInd, lonInd]; # a way round is to go through a RasterLayer object: library(raster); latInd <- a_grid@g...@cells.dim[2] - latInd + 1; a11_grid <- raster(x=a_grid); # this is for the SpatialGrid case: a11_grid <- crop(x=a11_grid, y=extent(x=a11_grid, r1=tail(x=latInd, n=1), r2=latInd[1], c1=lonInd[1], c2=tail(x=lonInd, n=1))); a11_grid <- as(object=a11_grid, Class="SpatialGrid"); # and this is for the SpatialGridDataFrame case: a11_df <- raster(x=meuse.grid["dist"]); a11_df <- crop(x=a11_df, y=extent(x=a11_df, r1=tail(x=latInd, n=1), r2=latInd[1], c1=lonInd[1], c2=tail(x=lonInd, n=1))); a11_df <- as(object=a11_df, Class="SpatialGridDataFrame"); # This approach also works if I only want to extract a single spatial column or a single spatial row and still keep the original grid structure I would like to ask if there is a simpler and more elegant way to avoid the RasterLayer object? Certainly, this can be achieved directly by hacking the code of the "[" operator for the SpatialGrid and the SpatialGridDataFrame classes. However, I do not know how to access that code ... Any suggestions will be appreciated. Thank you very much for your attention and your time. Best regards, Martin _______________________________________________ R-sig-Geo mailing list R-sig-Geo@r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-geo