This short note shows how to create a regular grid onto which kriging or another prediction method can be applied.

We use the Meuse dataset as an example of the study area we want to predict over. We have some points in this area:

library(sp); library(gstat)
data(meuse)  # an example dataset supplied with the sp package
names(meuse)
##  [1] "x"       "y"       "cadmium" "copper"  "lead"    "zinc"    "elev"   
##  [8] "dist"    "om"      "ffreq"   "soil"    "lime"    "landuse" "dist.m"
coordinates(meuse) <- c("x", "y") # convert to a SpatialPointsDataFrame
summary(meuse)
## Object of class SpatialPointsDataFrame
## Coordinates:
##      min    max
## x 178605 181390
## y 329714 333611
## Is projected: NA 
## proj4string : [NA]
## Number of points: 155
## Data attributes:
##     cadmium           copper            lead            zinc       
##  Min.   : 0.200   Min.   : 14.00   Min.   : 37.0   Min.   : 113.0  
##  1st Qu.: 0.800   1st Qu.: 23.00   1st Qu.: 72.5   1st Qu.: 198.0  
##  Median : 2.100   Median : 31.00   Median :123.0   Median : 326.0  
##  Mean   : 3.246   Mean   : 40.32   Mean   :153.4   Mean   : 469.7  
##  3rd Qu.: 3.850   3rd Qu.: 49.50   3rd Qu.:207.0   3rd Qu.: 674.5  
##  Max.   :18.100   Max.   :128.00   Max.   :654.0   Max.   :1839.0  
##                                                                    
##       elev             dist               om         ffreq  soil   lime   
##  Min.   : 5.180   Min.   :0.00000   Min.   : 1.000   1:84   1:97   0:111  
##  1st Qu.: 7.546   1st Qu.:0.07569   1st Qu.: 5.300   2:48   2:46   1: 44  
##  Median : 8.180   Median :0.21184   Median : 6.900   3:23   3:12          
##  Mean   : 8.165   Mean   :0.24002   Mean   : 7.478                        
##  3rd Qu.: 8.955   3rd Qu.:0.36407   3rd Qu.: 9.000                        
##  Max.   :10.520   Max.   :0.88039   Max.   :17.000                        
##                                     NA's   :2                             
##     landuse       dist.m      
##  W      :50   Min.   :  10.0  
##  Ah     :39   1st Qu.:  80.0  
##  Am     :22   Median : 270.0  
##  Fw     :10   Mean   : 290.3  
##  Ab     : 8   3rd Qu.: 450.0  
##  (Other):25   Max.   :1000.0  
##  NA's   : 1
bbox(meuse)
##      min    max
## x 178605 181390
## y 329714 333611

We can define any extent for a grid; here we choose to cover the bounding box, and expand the grid to match the chosen resolution.

bbox(meuse)
##      min    max
## x 178605 181390
## y 329714 333611
res <- 120 # resolution
# round extremes to resolution
(x.min <- bbox(meuse)[1,1]%/%res*res)
## [1] 178560
(x.max <- (bbox(meuse)[1,2]+res)%/%res*res) # make sure it is outside the bbox
## [1] 181440
(y.min <- bbox(meuse)[2,1]%/%res*res)
## [1] 329640
(y.max <- (bbox(meuse)[2,2]+res)%/%res*res) # make sure it is outside the bbox
## [1] 333720
# grid of coordinates
grid <- expand.grid(x = seq(x.min, x.max, by=res),
              y = seq(y.min, y.max, by=res))
class(grid)
## [1] "data.frame"
coordinates(grid) <- c("x", "y")
class(grid)
## [1] "SpatialPoints"
## attr(,"package")
## [1] "sp"
gridded(grid) <- T; fullgrid(grid) <- T
class(grid)
## [1] "SpatialGrid"
## attr(,"package")
## [1] "sp"

Now we can interpolate over the grid, here using IDW just to show a result:

kres <- idw(zinc ~ 1, loc=meuse, newdata=grid)
## [inverse distance weighted interpolation]
spplot(kres, zcol="var1.pred")