Goal
The goal of this post is join spatial point and area data. I demonstrate how to identify what community each Divvy station resides in. In other words, I find the community in which the latitude and longitude of the Divvy station is and append a column to indicate the community that each Divvy station resides in.
See my other post about overlaying point data onto area data with ggplot.
The goal of this post is to demonstrate how to overlay geographic points onto geographic polygons. Specifically, I’ll demonstrate how map the location of Chicago Divvy bike stations (points) onto the Chicago community map (polygons from a shapefile).
Data
The Chicago community boundaries came in a shapefile.
The Divvy station contained the latitidue and longitude of all the Divvy bike stations in the Chicago area, but did not contain the community they were in.
To do this, I use the sp and rgdal packages. The
library(sp)
library(rgdal)
library(readr)
First, read in the shapefile data. Note that I extracted the .dbf, .prj, and .shx files to the data directory.
comm <- readOGR("./data/.")
readOGR creates a SpatialPolygonsDataFrame, which is a fairly complicated object, so I’ll refrain from giving you a glimpse.
Now, load in the Divvy station data:
divvy <- read_csv("./data/Divvy_Bicycle_Stations.csv")
Now it is necessary to define the columns in divvy that represents the coordinates and then ensure that both datasets share the same coordinate projection.
coordinates(divvy) <- c("Longitude", "Latitude")
proj4string(divvy) <- proj4string(comm)
So, now I’m ready to “overlay” Divvy station locations on top of the community boundaries (from the shapefile) and identify the community in which each station resides. I’ll actually create two new columns in the divvy data – one for the numeric community id and one for the community name.
To do this, we use the over function from sp package.
divvy$community <- over(divvy, comm)$community
divvy$comm_id <- over(divvy, comm)$area_num_1
head(divvy)
## coordinates ID Station.Name
## 1 (-87.57645, 41.76664) 11 Jeffery Blvd & 71st St
## 2 (-87.62872, 41.89745) 106 State St & Pearson St
## 3 (-87.68655, 42.05704) 661 Evanston Civic Center
## 4 (-87.6967, 41.90036) 622 California Ave & Cortez St
## 5 (-87.58005, 41.74736) 665 South Chicago Ave & Elliot Ave
## 6 (-87.62034, 41.87647) 2 Buckingham Fountain
## Address Total.Docks Docks.in.Service Status
## 1 Jeffery Blvd & 71st St 11 11 In Service
## 2 State St & Pearson St 27 27 In Service
## 3 Evanston Civic Center 15 15 In Service
## 4 California Ave & Cortez St 15 15 In Service
## 5 South Chicago Ave & Elliot Ave 7 7 In Service
## 6 Buckingham Fountain 39 39 In Service
## Location community comm_id
## 1 (41.76663823695, -87.5764501141) SOUTH SHORE 43
## 2 (41.897448, -87.628722) NEAR NORTH SIDE 8
## 3 (42.057044, -87.686554) <NA> <NA>
## 4 (41.900363, -87.696704) WEST TOWN 24
## 5 (41.747363, -87.580046) AVALON PARK 45
## 6 (41.87647, -87.62034) LOOP 32
And…voila! Now the divvy data can be aggregated (e.g., station count, total docks in service) up to the community level.