Reading and writing spatial data

Introduction

Reading and writing spatial data is complicated by the fact that there are many different file formats. However, there are a few formats that are most common that we discuss here.

Vector files

The shapefile is the most commonly used file format for vector data. It is trivial to read and write such files. Here we use a shapefile that comes with the raster package.

Reading

We use the system.file function to get the full path name of the file’s location. We need to do this as the location of this file depends on where the raster package is installed. You should not use the system.file function for your own files. It only serves for creating examples with data that ships with R.

library(raster)
filename <- system.file("external/lux.shp", package="raster")
filename
## [1] "C:/soft/R/R-devel/library/raster/external/lux.shp"

Now we have the filename we need we use the shapefile function. This function comes with the raster package. For it to work you must also have the rgdal package.

s <- shapefile(filename)
s
## class       : SpatialPolygonsDataFrame
## features    : 12
## extent      : 5.74414, 6.528252, 49.44781, 50.18162  (xmin, xmax, ymin, ymax)
## crs         : +proj=longlat +datum=WGS84 +no_defs
## variables   : 5
## names       : ID_1,     NAME_1, ID_2,   NAME_2, AREA
## min values  :    1,   Diekirch,    1, Capellen,   76
## max values  :    3, Luxembourg,   12,    Wiltz,  312

The shapefile function returns Spatial*DataFrame objects. In this case a SpatialPolygonsDataFrame. It is important to recognise the difference between this type of R object (SpatialPolygonsDataFrame), and the file (shapefile) that was used to create it.

For other formats, you can use readOGR function in package rgdal.

Writing

You can also write shapefiles using the shapefile method. In stead of a filename, you need to provide a vector type Spatial* object as first argument and a new filename as a second argument. You can add argument overwrite=TRUE if you want to overwrite an existing file.

outfile <- 'test.shp'
shapefile(s, outfile, overwrite=TRUE)

For other formats, you can use writeOGR function in package rgdal.

Raster files

The raster package can read and write several raster file formats.

Reading

Again we need to get a filename for an example file.

f <- system.file("external/rlogo.grd", package="raster")
f
## [1] "C:/soft/R/R-devel/library/raster/external/rlogo.grd"

Now we can do

r1 <- raster(f)
r1
## class      : RasterLayer
## band       : 1  (of  3  bands)
## dimensions : 77, 101, 7777  (nrow, ncol, ncell)
## resolution : 1, 1  (x, y)
## extent     : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
## crs        : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
## source     : rlogo.grd
## names      : red
## values     : 0, 255  (min, max)

Note that r1 is a RasterLayer of the first “band” (layer) in the file (out of three bands (layers)). We can request another layer.

r2 <- raster(f, band=2)
r2
## class      : RasterLayer
## band       : 2  (of  3  bands)
## dimensions : 77, 101, 7777  (nrow, ncol, ncell)
## resolution : 1, 1  (x, y)
## extent     : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
## crs        : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
## source     : rlogo.grd
## names      : green
## values     : 0, 255  (min, max)

More commonly, you would want all layers in a single object. For that you can use the brick function.

b <- brick(f)
b
## class      : RasterBrick
## dimensions : 77, 101, 7777, 3  (nrow, ncol, ncell, nlayers)
## resolution : 1, 1  (x, y)
## extent     : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
## crs        : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
## source     : rlogo.grd
## names      : red, green, blue
## min values :   0,     0,    0
## max values : 255,   255,  255

Or you can use stack, but that is less efficient in most cases.

s <- stack(f)
s
## class      : RasterStack
## dimensions : 77, 101, 7777, 3  (nrow, ncol, ncell, nlayers)
## resolution : 1, 1  (x, y)
## extent     : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
## crs        : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
## names      : red, green, blue
## min values :   0,     0,    0
## max values : 255,   255,  255

The same approach holds for other raster file formats, including GeoTiff, NetCDF, Imagine, and ESRI Grid formats.

Writing

Use writeRaster to write raster data. You must provide a Raster* object and a filename. The file format will be guessed from the filename extension (if that does not work you can provide an argument like format=GTIFF). Note the argument overwrite=TRUE and see ?writeRaster for more arguments, such as datatype= to set the datatype (e.g., integer, float).

x <- writeRaster(s, 'output.tif', overwrite=TRUE)
x
## class      : RasterBrick
## dimensions : 77, 101, 7777, 3  (nrow, ncol, ncell, nlayers)
## resolution : 1, 1  (x, y)
## extent     : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
## crs        : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
## source     : output.tif
## names      : output.1, output.2, output.3
## min values :        0,        0,        0
## max values :      255,      255,      255