Working with Shapefiles in R Exercises

R has many powerful libraries to handle spatial data, and the things that R can do with maps can only grow. This exercise tries to demonstrate a few basic functionalities of R while dealing with shapefiles.

A shapefile is a simple, nontopological format for storing the geometric location and attribute information of geographic features. Geographic features in a shapefile can be represented by points, lines, or polygons (ESRI). The geographic features are associated with an attribute table which is very similar to an R dataframe.

The rgdal package in R provides bindings to the popular Geospatial Data Abstraction Library (GDAL) for reading, writing and converting between spatial formats. We are using a very popular dataset of London sports participation shapefile (download here). The attributes Pop_2001 and Partic_Per represents the population of London Boroughs in 2001 and the percentage of the population participating in sporting activities.

Answers to the exercises are available here. If you obtained a different (correct) answer than those listed on the solutions page, please feel free to post your answer as a comment on that page.

Please install and load the package rgdal before starting the exercises.

Exercise 1
Read the London Sports map from the shapefile london_sports.shp .

Exercise 2
Change the coordinate system of the map to WGS 84.

Exercise 3
Find the names of the zones where sports participation rates is more than 25%.

Exercise 4
Plot the london map in Sky Blue, along with a title.

Exercise 5
Plot the zones in London with Sports Participation Rates less than 15% in red. Retain the earlier blue color for other zones.

Exercise 6
Plot the zones in London with Sports Participation Rates more than 25% in green. Retain the earlier color for other zones.

Exercise 7
Place a black circle marker at the centre of each zone. Retain previous maps.

Exercise 8
Put labels for each zone. Place the labels to the right of the black marker.

Exercise 9
Add another categorical attribute sports_part which has values "low", "medium" and "high" for sports participation rates less than equal to 15%, between 15 to 25% and greater than 25% respectively.

Exercise 10
Save the new map object with modified attribute table as a new shapefile “london_sport2.shp”.




Working with Shapefiles in R Solutions

Below are the solutions to these exercises on Working with Shapeflies in R.

if (!require(rgdal)){install.packages(rgdal, dep=T)}
## Warning: package 'rgdal' was built under R version 3.3.2
## Warning: package 'sp' was built under R version 3.3.2
library(rgdal)
####################
#                  #
#    Exercise 1    #
#                  #
####################
london <- readOGR(dsn = ".", layer = "london_sport")
## OGR data source with driver: ESRI Shapefile 
## Source: ".", layer: "london_sport"
## with 33 features
## It has 4 fields
## Integer64 fields read as strings:  Pop_2001
####################
#                  #
#    Exercise 2    #
#                  #
####################
london<-spTransform(london, CRS("+proj=longlat +datum=WGS84"))


####################
#                  #
#    Exercise 3    #
#                  #
####################
london[which(london@data$Partic_Per>25),]@data$name
## [1] Richmond upon Thames   Wandsworth             Hammersmith and Fulham
## [4] Kensington and Chelsea Camden                
## 33 Levels: Barking and Dagenham Barnet Bexley Brent Bromley ... Westminster
####################
#                  #
#    Exercise 4    #
#                  #
####################
plot(london, col="skyblue")
title("Map of London")

####################
#                  #
#    Exercise 5    #
#                  #
####################
plot(london[which(london@data$Partic_Per<15),], col="red", add=T)


####################
#                  #
#    Exercise 6    #
#                  #
####################
plot(london[which(london@data$Partic_Per>25),], col="green", add=T)



####################
#                  #
#    Exercise 7    #
#                  #
####################
midpoints<-coordinates(london)
points(midpoints, col="black", pch=20)



####################
#                  #
#    Exercise 8    #
#                  #
####################
text(coordinates(london),as.character(london@data$name), pos=4, cex=0.5)

####################
#                  #
#    Exercise 9    #
#                  #
####################
london@data$sports_part[which(london@data$Partic_Per<=15)]<-"low"
london@data$sports_part[which(london@data$Partic_Per>15 & london@data$Partic_Per<=25)]<-"medium"
london@data$sports_part[which(london@data$Partic_Per>25)]<-"high"



####################
#                  #
#    Exercise 10   #
#                  #
####################
writeOGR(london, ".", "london_sport2", driver="ESRI Shapefile")
## Warning in writeOGR(london, ".", "london_sport2", driver = "ESRI
## Shapefile"): Field names abbreviated for ESRI Shapefile driver