Spatial Objects & Points in R
Introduction
In my last article, I explained the fundamentals of Spatial Data Analysis and different types of Spatial Data including point, line, polygon and grid. If you want a quick recap, you can find it here :
Hello World: Introducing Spatial Data
I ended the last article with the promise of covering Points in my next article. In this article I will make a deep dive in Spatial Objects and Spatial Points in R.
Spatial Objects in R
R developers wrote a special package sp which extend base R classes and methods for spatial data. To get things started download sp by following command:
install.packages("sp")
Next, we attach the package by:
library("sp")
I will call the Spatial class using getClass method to get the complete definition of a S4 class in R. This includes the slot names and types of their content:
getClass("Spatial")
Class "Spatial" [package "sp"]
Slots:
Name: bbox proj4string
Class: matrix CRS
Known Subclasses:
Class "SpatialPoints", directly
Class "SpatialMultiPoints", directly
Class "SpatialGrid", directly
Class "SpatialLines", directly
Class "SpatialPolygons", directly
Class "SpatialPointsDataFrame", by class "SpatialPoints", distance 2
Class "SpatialPixels", by class "SpatialPoints", distance 2
Class "SpatialMultiPointsDataFrame", by class "SpatialMultiPoints", distance 2
Class "SpatialGridDataFrame", by class "SpatialGrid", distance 2
Class "SpatialLinesDataFrame", by class "SpatialLines", distance 2
Class "SpatialPixelsDataFrame", by class "SpatialPoints", distance 3
Class "SpatialPolygonsDataFrame", by class "SpatialPolygons", distance 2
This returns us two important information about this class.
- Slots: a named component of the object that is accessed using the specialized sub-setting operator @ (pronounced at). In our case we see that Spatial class has two named components :
- Matrix
- CRS (Cordinate Reference System)
- Known Sub classes: These are classes that inherit one or more language entities from another class/classes. In our case SpatialPoints class inherits language entities from Spatial class. In other words, there is parent-child relationship between Spatial class and SpatialPoints class.
Spatial Points
From our mathematical knowledge, we know that point is a pair of numbers in (x,y) defined over a known region. According to (Herring 2011), it is a 0 - dimensional geometric object and represents a single location in a coordinate space.
The understanding of Earth before the introduction of World Geodetic System 1984 was sphere. But later Geodesists represented the globe more accurately by ellipsoid model (Roger S. Bivand 2013). Today Global Positioning System (GPS) uses the World Geodetic System (WGS84) as its reference coordinate system. More details about about WGS84 can be found here.
We now see how SpatialPoints class extends Spatial class. By using getClass(), we can see the slot names and type of content.
getClass("SpatialPoints")
Class "SpatialPoints" [package "sp"]
Slots:
Name: coords bbox proj4string
Class: matrix matrix CRS
Extends: "Spatial"
Known Subclasses:
Class "SpatialPointsDataFrame", directly
Class "SpatialPixels", directly
Class "SpatialPixelsDataFrame", by class "SpatialPixels", distance 2
We see that SpatialPoints extends Spatial class by adding a coords slot, into which a matrix of point cordinates can be inserted. We also see three other classes extended by SpatialPoints:
- SpatialPointsDataFrame
- SpatialPixels
- SpatialPixelsDataFrame
To understand the methods and functions provided by SpaitalPoints, I read a data file with the positions of CRAN mirrors across the world in 2005. We first pull the data in R:
df <- read.table("http://www.asdar-book.org/datasets/CRAN051001a.txt", header = TRUE)
Then we see its first six rows:
head(df)
place north east loc long lat
1 Brisbane 27d28'S 153d02'E Australia 153.03333 -27.46667
2 Melbourne 37d49'S 144d58'E Australia 144.96667 -37.81667
3 Wien 48d13'N 16d20'E Austria 16.33333 48.21667
4 Curitiba 25d25'S 49d16'W Brazil -49.26667 -25.41667
5 Vi\xe7oza 20d45'S 42d52'W Brazil -42.86667 -20.75000
6 Rio de Janeiro 22d54'S 43d12'W Brazil -43.20000 -22.90000
We extract the two columns with the longitude and latitude values into a matrix, and use str to view:
# make a latitude and longitude matrixcran_mat <- cbind(df$long, df$lat)
# assign row names from 1 to number of rowsrow.names(cran_mat) <- 1:nrow(cran_mat)
# view the matrix structurestr(cran_mat)
num [1:54, 1:2] 153 145 16.3 -49.3 -42.9 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:54] "1" "2" "3" "4" ...
..$ : NULL
Before moving on it is necessary to introduce the coordinate reference system (CRS) class briefly. We saw that Spatial class had two slots. One of them was Coordinate Reference System (CRS). Let us see the slot names and components.
getClass("CRS")
Class "CRS" [package "sp"]
Slots:
Name: projargs
Class: character
We see that the class has a character string as its only slot value. The character string may be a missing value but if it is not missing it should be PROJ.4-format string describing the projection. For geographical coordinates, the simplest of such string is “+proj=longlat”.
We now see the implementation in our CRAN data set.
# make a CRS object in longlat and World Geodetic System(WGS84)
CRS_obj <- CRS(projargs = "+proj=longlat +ellps=WGS84")
# check summary of the object
summary(CRS_obj)
Length Class Mode
1 CRS S4
At this point you must be wondering what is PROJ.4 format?
PROJ is a generic coordinate transformation software that transforms geospatial coordinates from one coordinate reference system (CRS) to another. This includes cartographic projections as well as geodetic transformations.
To define a Coordinate Reference System in sp package we use CRS object which defines the coordinate reference systems we use.
Finally we create SpatialPoints object
# make a spatial points class by long/lat matrix and proj4string
cran_sp <- SpatialPoints(coords = cran_mat, proj4string = CRS_obj)
# summary of the cran_sp object
summary(cran_sp)
Object of class SpatialPoints
Coordinates:
min max
coords.x1 -122.95000 153.0333
coords.x2 -37.81667 57.0500
Is projected: FALSE
proj4string : [+proj=longlat +ellps=WGS84]
Number of points: 54
Spatial Points objects may have more than two dimensions, but plot methods for the class use only the first two.
Ending Remarks
In this article, we got an overview of Spatial and Spatial Points class. But we are only half way done. In next article, I will explain the methods and data frames for spatial points to do some data wrangling.
References
Herring, J. R. 2011. OpenGIS® Implementation Standard for Geographic Information - Simple Feature Access - Part 1: Common Architecture. Technical Report 1.2.1. Open Geospatial Consortium Inc.
Roger S. Bivand, Virgilio Gómez-Rubio, Edzer Pebesma. 2013. Applied Spatial Data Analysis with r. Springer New York, NY.
Together, we can bring your next major project to life.
Book a slot today & let Stat Devs specialists guide you.