In this post I would like to offer a brief and practical introduction to different types of spatial data that we could handle in R and how to do to access and visualize them. It might be interesting for those who are beginners in spatial analysis.

The structure of spatial objects is complex, and it is very important to know how these are stored and organized. sp package provides a clear form to organize the spatial data through classes (to specify the structure ) and methods (particular functions for a special data class).

The basic type of spatial objects is Spatial class, in which we could recognize two principal components, called slots: the first one is a bounding box that contains a matrix with the coordinate values. The second is a CRS class object, the reference system for these coordinates (“longlat” for geographical coordinates, “utm” for UTM coordinates, ect). With the command getClass(“Spatial”) (once sp package has been installed), we can examine the different types of spatial objects and their subclasses.

I will use an example to make this something practical, specifically we use a Spanish cartography (“ESP_adm.zip”, downloaded in this web site: http://www.gadm.org/). To use the ‘readShapeSpatial’ function to read the .shp object, we need the library ‘maptools’.

library(maptools) # load the shapefile: map <- readShapeSpatial('ESP_adm2.shp') # map is a SpatialPolygonsDataFrame, a subclass of a SpatialPolygons object.

A Spatial Polygons object is a closed line, a sequence of point coordinates where the first point is the same as the last point. It is not easy to know their structure, let us look at this briefly:

# examine the structure of this SpatialPolygonsDataFrame object. # Each slot (5) is determined by ‘@name_slot’ str(map, max.level = 2)

But, what means each *slot*?

- @data: a data frame which contains information about each polygon. (For instance, the name of provinces, autonomous community,…). To access:

# The provinces: map@data$NAME_2 # or slot(map, ‘data’)$NAME_2 # Idem for autonomous community with ‘$NAME_1’

- @polygons: a list of 51 polygons (all provinces), of class Polygon. Each of those polygons have 5 slots, we can see the structure of the first polygon with:
str(map@polygons[[1]]@Polygons)

- @plotOrder: a vector of the plotting order of the 51 polygons.
- @bbox: two-dimensional matrix with the maximum and minimum of the coordinates.
- @proj4string: the coordinate reference system (CRS class).

Finally, I will give just a simple example of how to plot some geographical coordinates in the ‘map’. For this, we read a data file with the locations and associate a spatial structure creating a SpatialPoints class. We need to be careful with the reference system of the SpatialPolygons and the SpatialPoints we used. The coordinate reference system for our shapefile is latitude/longitude and the WGS84 datum. Thus, we need the same CRS to our SpatialPoints. But…what if we do not have geographic coordinates? Let’s see it!

Assume that the coordinate reference system of the SpatialPoints is UTM (Universal Transverse Mercator) instead of latitude/longitude.

loc_utm <- read.csv(“loc_utm.csv”,header=T)

> loc_utm

X Y

1 718970.0 4376275.0

2 505574.2 4793683.2

3 276066.1 4542666.9

4 538135.4 4750010.9

There are four locations situated (in order) in Valencia, Bilbao, Salamanca and Santiago de Compostela. The first three points are in UTM zone 30 and the last one in zone 29. It is important to know this to define the CRS correctly:

# We separate these points according to the zone: loc1 <- loc_utm[1:3,] loc2 <- loc_utm[4,] # To create a SpatialPoints: coordinates(loc1) <- c("X","Y") coordinates(loc2) <- c("X","Y") # To define the CRS: proj4string(loc1) <- CRS("+proj=utm +zone=30 +ellps=WGS84") proj4string(loc2) <- CRS("+proj=utm +zone=29 +ellps=WGS84") # spTransform function provide transformation between projections. library(rgdal) loc1_geo<- spTransform(loc1, CRS("+proj=longlat +ellps=WGS84")) loc2_geo<- spTransform(loc2, CRS("+proj=longlat +ellps=WGS84"))

Now we can plot these points over the Spanish mapping.

plot(map) plot(loc1_geo,add=T) plot(loc2_geo,add=T)

This post has been a short summary of some of Spatial objects that we can manipulate in R. In the following posts I will invite you to continue learning about this area of statistics. I hope it helps someone!

Thanks! Exactly what I was looking for. Ideally one would then be able to merge the two spatial objects back into one with a common datum and projection… shouldn’t be too hard to figure out, but you might consider it as a useful add-on later 🙂

Thank you so much !