install.packages(c(tidyverse, sf, tmap, spatstat, maptools, ggplot2, sqldf)) install.packages(“spatstat.geom”, dependencies = TRUE) install.packages(“leaflet.providers”) install.packages(“markdown”, dependencies = TRUE) install.packages(“polyclip”, dependencies = TRUE) install.packages(“ggmap”, dependencies = TRUE)
library(tidyverse)
library(sf)
library(tmap)
library(spatstat)
Loading required package: spatstat.data
Loading required package: spatstat.geom
Registered S3 method overwritten by 'spatstat.geom':
method from
print.boxx cli
spatstat.geom 2.2-2
Loading required package: spatstat.core
Loading required package: nlme
Attaching package: 㤼㸱nlme㤼㸲
The following object is masked from 㤼㸱package:dplyr㤼㸲:
collapse
Loading required package: rpart
spatstat.core 2.3-0
Loading required package: spatstat.linnet
spatstat.linnet 2.3-0
spatstat 2.2-0 (nickname: 㤼㸱That's not important right now㤼㸲)
For an introduction to spatstat, type 㤼㸱beginner㤼㸲
library(maptools)
Loading required package: sp
Checking rgeos availability: FALSE
Note: when rgeos is not available, polygon geometry computations in maptools depend on gpclib,
which has a restricted licence. It is disabled by default;
to enable gpclib, type gpclibPermit()
library(sqldf)
Loading required package: gsubfn
Loading required package: proto
Loading required package: RSQLite
library(ggplot2)
library(spatstat.geom)
library(leaflet.providers)
library(markdown)
library(polyclip)
library(ggmap)
Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
Please cite ggmap if you use it! See citation("ggmap") for details.


######## PART 3 SEGMENTATION AND MAPPING #########
# Sample for just the morning
morning <- rdfClean %>% filter(hour %in% c('07', '08', '09'))
# Find most important stations
morningStations <- morning %>%
group_by(`start.station.id`) %>%
summarise(lat=as.numeric(`start.station.latitude`[1]),
lon=as.numeric(`start.station.longitude`[1]),
name=`start.station.name`[1],
trips=n())
## Take a look
morningStations %>%
arrange(desc(trips))
tmap_mode('view')
tmap mode set to interactive viewing
tm_shape(morningStationsGeo %>%
filter(!is.na(trips)) %>%
mutate(trips = as.numeric(trips))) + tm_dots(col = "trips", style="quantile", id = "name")
## Read SF for a file of boroughs
boroughs <- st_read("borough.shp")
Reading layer `borough' from data source
`C:\Users\dpoddar3\Downloads\Assignment__Citibikes_export\ForClass\borough.shp' using driver `ESRI Shapefile'
Simple feature collection with 5 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -74.25559 ymin: 40.49612 xmax: -73.70001 ymax: 40.91553
Geodetic CRS: WGS84(DD)
boroughs_prj <- st_transform(boroughs, crs = 2263)
# Density map (This method doesn't allow us to see the background map)
df.size.proj <- st_transform(morningStationsGeo, crs = 2263)
p.sp <- as(df.size.proj, "Spatial")
p.ppp <- as(p.sp, "ppp")
kernelDensityMorning <- (density(p.ppp, sigma = 1000))
##Plot the two together
plot(kernelDensityMorning)
plot(boroughs_prj$geometry, add=TRUE)

##CHALLENGES FOR YOUR DENSITY MAP
##Extra: Clip the raster and clip the vector as well. (only plot the intersection of the two?)
##Extra: Make the lines white (hint: it is now a polygon!)
##Extra: Add the top 3 (or 5) points and label them.
# Heatmap in ggplot
library(ggplot2)
library(ggmap)
df.size.degree <- st_transform(morningStationsGeo, crs = 4326) %>%
mutate(lat = st_coordinates(.)[,2],
lon = st_coordinates(.)[,1])
##Get borders
height <- max(st_coordinates(df.size.degree)[,2]) - min(st_coordinates(df.size.degree)[,2])
width <- max(st_coordinates(df.size.degree)[,1]) - min(st_coordinates(df.size.degree)[,1])
sac_borders <- c(bottom = min(st_coordinates(df.size.degree)[,2]) - 0.1*height,
top = max(st_coordinates(df.size.degree)[,2]) + 0.1*height,
left = min(st_coordinates(df.size.degree)[,1]) - 0.1*width,
right = max(st_coordinates(df.size.degree)[,1]) + 0.1*width)
map <- get_stamenmap(sac_borders, zoom = 12, maptype = "toner-lite")
Source : http://tile.stamen.com/toner-lite/12/1205/1538.png
Source : http://tile.stamen.com/toner-lite/12/1206/1538.png
Source : http://tile.stamen.com/toner-lite/12/1205/1539.png
Source : http://tile.stamen.com/toner-lite/12/1206/1539.png
Source : http://tile.stamen.com/toner-lite/12/1205/1540.png
Source : http://tile.stamen.com/toner-lite/12/1206/1540.png
Source : http://tile.stamen.com/toner-lite/12/1205/1541.png
Source : http://tile.stamen.com/toner-lite/12/1206/1541.png
ggmap(map) +
geom_density2d(data = df.size.degree, aes(x = lon, y = lat), size = 0.3) +
stat_density2d(data = df.size.degree, aes(x = lon, y = lat, fill = ..level.., alpha = ..level..),
geom = "polygon", bins = 10) +
scale_fill_gradient(low = "green", high = "red") +
scale_alpha(range = c(0, 0.4), guide = FALSE) #Plot +

coord_cartesian(xlim = c(-74.02, -95.7),
ylim = c(29.5, 30.1))
<ggproto object: Class CoordCartesian, Coord, gg>
aspect: function
backtransform_range: function
clip: on
default: FALSE
distance: function
expand: TRUE
is_free: function
is_linear: function
labels: function
limits: list
modify_scales: function
range: function
render_axis_h: function
render_axis_v: function
render_bg: function
render_fg: function
setup_data: function
setup_layout: function
setup_panel_guides: function
setup_panel_params: function
setup_params: function
train_panel_guides: function
transform: function
super: <ggproto object: Class CoordCartesian, Coord, gg>
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KaW5zdGFsbC5wYWNrYWdlcyhjKHRpZHl2ZXJzZSwgc2YsIHRtYXAsIHNwYXRzdGF0LCBtYXB0b29scywgZ2dwbG90Miwgc3FsZGYpKQ0KaW5zdGFsbC5wYWNrYWdlcygic3BhdHN0YXQuZ2VvbSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQppbnN0YWxsLnBhY2thZ2VzKCJsZWFmbGV0LnByb3ZpZGVycyIpDQppbnN0YWxsLnBhY2thZ2VzKCJtYXJrZG93biIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQppbnN0YWxsLnBhY2thZ2VzKCJwb2x5Y2xpcCIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQppbnN0YWxsLnBhY2thZ2VzKCJnZ21hcCIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQoNCmBgYHtyfQ0KIyMjIyMjIyMgUEFSVCAxIFNFVCBVUCAjIyMjIyMjIyMgDQoNCmxpYnJhcnkodGlkeXZlcnNlKSANCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHRtYXApDQpsaWJyYXJ5KHNwYXRzdGF0KQ0KbGlicmFyeShtYXB0b29scykNCmxpYnJhcnkoc3FsZGYpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNwYXRzdGF0Lmdlb20pDQpsaWJyYXJ5KGxlYWZsZXQucHJvdmlkZXJzKQ0KbGlicmFyeShtYXJrZG93bikNCmxpYnJhcnkocG9seWNsaXApDQpsaWJyYXJ5KGdnbWFwKQ0KDQojIEVudmlyb25tZW50IChjaGFuZ2UgdGhpcyBwYXRoIHRvIHlvdXIgZm9sZGVyIHdoZXJlIHlvdSBzdG9yZWQgdGhlIENJVEkgQmlrZSBkYXRhKQ0Kc2V0d2QoIkM6XFxVc2Vyc1xcY2FuZHJpczNcXERyb3Bib3hcXERyb3Bib3hcXFVyYmFuQW5hbHl0aWNzX2NsYXNzXFxjb2RlIikNCg0KIyMgV2UgZG93bmxvYWRlZCB0aGUgZGF0YSBmcm9tIGhlcmU6IGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS90cmlwZGF0YS9pbmRleC5odG1sDQojIyBTb21lIGNvZGUgdGFrZW4gZnJvbTogaHR0cDovL2xhYi5yYWR5LnVjc2QuZWR1L3Nhd3Rvb3RoL2J1c2luZXNzX2FuYWx5dGljc19pbl9yL21hcHMuaHRtbA0KIyMgVGhhbmtzIHRvIEJvbiBXb28gS29vIGZvciBoaXMgaGVscC4NCg0KIyBSZWFkIGRhdGENCnJkZiA8LSByZWFkLmNzdigiMjAxMzA2LWNpdGliaWtlLXRyaXBkYXRhLmNzdiIpDQojcmRmIDwtIHNhbXBsZV9uKHJkZjEsKDMzNzE5KjIpKQ0KI3dyaXRlLmNzdihyZGYsICJjaXRpYmlrZV9zbWFsbHNhbXBsZS5jc3YiKQ0KVmlldyhyZGYpICN0byB2aWV3IGRhdGEgdGFibGUNCiMgVGFrZSBhIGxvb2sgYnkgYmlydGggeWVhciENCnJkZiAlPiUgDQogIG11dGF0ZShiaXJ0aF95ZWFyID0gYXMubnVtZXJpYygnYmlydGgueWVhcicpKSAlPiUgI1RISVMgQ0hBTkdFUyBBIFNUUklORyBJTlRPIEEgTlVNQkVSDQogIGRwbHlyOjpzZWxlY3QoLWMoJ2JpcnRoLnllYXInKSkgICU+JSAgICAjVEhJUyBERUxFVEVTIFRIRSBPTEQgQ09MVU1OIA0KICBhcnJhbmdlKGJpcnRoX3llYXIpICNUSElTIFNPUlRTIE9OIEJJUlRIIFlFQVINCmBgYA0KDQpgYGB7cn0NCiMjIyMjIyMjIFBBUlQgMiBFWFBMT1JJTkcgVEhFIERBVEEgIyMjIyMjIyMjIA0KDQojIFNwbGl0IHRpbWUsIGJpcnRoIHllYXIgYW5kIGZpbHRlciBieSBiaXJ0aCB5ZWFyDQpyZGZDbGVhbiA8LSByZGYgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoc3RhcnR0aW1lKSwNCiAgICAgICAgIHRpbWUgPSBmb3JtYXQoYXMuUE9TSVhjdChzdGFydHRpbWUpLCBmb3JtYXQgPSAiJUg6JU06JVMiKSkgJT4lICMjIFNQRUNJQUwgRk9STUFUVElORyBUTyBHRVQgSCxNLFMuDQogIG11dGF0ZShob3VyID0gc3Vic3RyaW5nKC4kdGltZSwgZmlyc3QgPSAxLCBsYXN0ID0gMikpICU+JSAjIyBUUlVOQ0FURVMgVEhFIFNUUklORw0KICBtdXRhdGUoZ2VuZGVyID0gYXMuY2hhcmFjdGVyKGdlbmRlcikpICU+JSAgIyMgIENIQU5HRVMgTlVNQkVSUyBpbnRvIFNUUklOR1MNCiAgZHBseXI6OnNlbGVjdChkYXRlLCB0aW1lLCBob3VyLCBldmVyeXRoaW5nKCkpICU+JSAgIyMgUkVPUkRFUlMgVEhFIENPTFVNTlMgDQogIGZpbHRlcigiYmlydGhfeWVhciIgPiAxOTMwKSAjIyBLRUVQUyBCSVJUSCBZRUFSUyBBRlRFUiAxOTMwDQoNClZpZXcocmRmQ2xlYW4pDQoNCiMgQWdncmVnYXRlIGJ5IGhvdXINCnRyaXBzQnlIb3VyIDwtIHJkZkNsZWFuICAlPiUNCiAgZ3JvdXBfYnkoYGhvdXJgLCBgZ2VuZGVyYCkgJT4lDQogIHN1bW1hcmlzZSh0cmlwcz1uKCkpICU+JQ0KICBtdXRhdGUoaG91ciA9IGFzLm51bWVyaWMoaG91cikpDQoNCiNvdGhlciB3YXkgdG8gZG8gaXQgKG1heSBub3QgcmV0dXJuIGhvdXIgYXMgaW50Li4uKQ0KI3RyaXBzQnlIb3VyIDwtIHNxbGRmKCJzZWxlY3QgaG91ciwgZ2VuZGVyLCBjb3VudChob3VyKSBhcyB0cmlwcyBmcm9tIHJkZkNsZWFuIGdyb3VwIGJ5IGhvdXIsIGdlbmRlciIpDQoNCiMgU2VlIHRyaXBzIGJ5IGhvdXIgKHZlcnkgYmFzaWMgcGxvdC0tLXlvdSBjYW4gYWxzbyB1c2UgYW5vdGhlciBwbG90dGluZyBjYWxsIGZyb20gZ2dwbG90MiBldGMpDQpwbG90KHRyaXBzQnlIb3VyJGhvdXIsIHRyaXBzQnlIb3VyJHRyaXBzLCB4bGFiID0gIkhvdXIgb2YgdGhlIERheSIsIHlsYWIgPSAiTnVtYmVyIG9mIFRyaXBzIikNCmBgYCAgDQoNCmBgYHtyfQ0KIyMgU0FNRSBQTE9UDQpnZ3Bsb3QodHJpcHNCeUhvdXIsIGFlcyh4PWhvdXIsIHk9dHJpcHMsIGNvbG91cj1nZW5kZXIpKSArIGdlb21fbGluZSgpDQoNCmBgYA0KDQpgYGB7cn0NCiMjIyMjIyMjIFBBUlQgMyBTRUdNRU5UQVRJT04gQU5EIE1BUFBJTkcgIyMjIyMjIyMjIA0KDQojIFNhbXBsZSBmb3IganVzdCB0aGUgbW9ybmluZyANCm1vcm5pbmcgPC0gcmRmQ2xlYW4gJT4lIGZpbHRlcihob3VyICVpbiUgYygnMDcnLCAnMDgnLCAnMDknKSkNCg0KIyBGaW5kIG1vc3QgaW1wb3J0YW50IHN0YXRpb25zDQptb3JuaW5nU3RhdGlvbnMgPC0gbW9ybmluZyAgJT4lDQogIGdyb3VwX2J5KGBzdGFydC5zdGF0aW9uLmlkYCkgJT4lDQogIHN1bW1hcmlzZShsYXQ9YXMubnVtZXJpYyhgc3RhcnQuc3RhdGlvbi5sYXRpdHVkZWBbMV0pLA0KICAgICAgICAgICAgbG9uPWFzLm51bWVyaWMoYHN0YXJ0LnN0YXRpb24ubG9uZ2l0dWRlYFsxXSksDQogICAgICAgICAgICBuYW1lPWBzdGFydC5zdGF0aW9uLm5hbWVgWzFdLA0KICAgICAgICAgICAgdHJpcHM9bigpKQ0KDQojIyBUYWtlIGEgbG9vaw0KbW9ybmluZ1N0YXRpb25zICU+JQ0KICBhcnJhbmdlKGRlc2ModHJpcHMpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBUdXJucyBpdCBpbnRvIGEgZ2lzIGZpbGUNCm1vcm5pbmdTdGF0aW9uc0dlbyA8LSBzdF9hc19zZihtb3JuaW5nU3RhdGlvbnMsIGNvb3JkcyA9IGMoImxvbiIsICJsYXQiKSwgZGltID0gIlhZIiwgY3JzID0gNDMyNikgI3N0X2FzX3NmIGlzIERhdGEgdG8gc2hhcGUgZmlsZQ0KDQojIFNhdmUgaWYgeW91IGZlZWwgbGlrZSBpdCEgIyBzdF93cml0ZShwb3B1bGFyU3RhdGlvbnMsICJwb3B1bGFyU3RhdGlvbnMuc2hwIiwgZGVsZXRlX2xheWVyID0gVFJVRSkNCg0KIyBMb29rIGF0IHRoZSBtYXAgDQp0bWFwX21vZGUoJ3ZpZXcnKQ0KdG1fc2hhcGUobW9ybmluZ1N0YXRpb25zR2VvICU+JSANCiAgICAgICAgICAgZmlsdGVyKCFpcy5uYSh0cmlwcykpICU+JSANCiAgICAgICAgICAgbXV0YXRlKHRyaXBzID0gYXMubnVtZXJpYyh0cmlwcykpKSArIHRtX2RvdHMoY29sID0gInRyaXBzIiwgc3R5bGU9InF1YW50aWxlIiwgaWQgPSAibmFtZSIpDQpgYGANCg0KDQpgYGB7cn0NCiMjIyMjIyMjIFBBUlQgNCBLRVJORUwgREVOU0lUWSAgIyMjIyMjIyMjIA0KDQojIyBSZWFkIFNGIGZvciBhIGZpbGUgb2YgYm9yb3VnaHMNCmJvcm91Z2hzIDwtIHN0X3JlYWQoImJvcm91Z2guc2hwIikNCmJvcm91Z2hzX3ByaiA8LSBzdF90cmFuc2Zvcm0oYm9yb3VnaHMsIGNycyA9IDIyNjMpDQoNCiMgRGVuc2l0eSBtYXAgKFRoaXMgbWV0aG9kIGRvZXNuJ3QgYWxsb3cgdXMgdG8gc2VlIHRoZSBiYWNrZ3JvdW5kIG1hcCkNCmRmLnNpemUucHJvaiA8LSBzdF90cmFuc2Zvcm0obW9ybmluZ1N0YXRpb25zR2VvLCBjcnMgPSAyMjYzKQ0KcC5zcCA8LSBhcyhkZi5zaXplLnByb2osICJTcGF0aWFsIikNCnAucHBwIDwtIGFzKHAuc3AsICJwcHAiKQ0Ka2VybmVsRGVuc2l0eU1vcm5pbmcgPC0gKGRlbnNpdHkocC5wcHAsIHNpZ21hID0gMTAwMCkpDQoNCiMjUGxvdCB0aGUgdHdvIHRvZ2V0aGVyDQpwbG90KGtlcm5lbERlbnNpdHlNb3JuaW5nKQ0KcGxvdChib3JvdWdoc19wcmokZ2VvbWV0cnksIGFkZD1UUlVFKQ0KDQojI0NIQUxMRU5HRVMgRk9SIFlPVVIgREVOU0lUWSBNQVANCiMjRXh0cmE6IENsaXAgdGhlIHJhc3RlciBhbmQgY2xpcCB0aGUgdmVjdG9yIGFzIHdlbGwuIChvbmx5IHBsb3QgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvPykgDQojI0V4dHJhOiBNYWtlIHRoZSBsaW5lcyB3aGl0ZSAoaGludDogaXQgaXMgbm93IGEgcG9seWdvbiEpDQojI0V4dHJhOiBBZGQgdGhlIHRvcCAzIChvciA1KSBwb2ludHMgYW5kIGxhYmVsIHRoZW0uDQpgYGANCg0KYGBge3J9DQojIyMjIyMjIyBQQVJUIDUgR0dQTE9UIEVYQU1QTEUgV0lUSCBDT05UT1VSUyAjIyMjIyMjIyMgDQoNCiMgSGVhdG1hcCBpbiBnZ3Bsb3QNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dtYXApDQoNCmRmLnNpemUuZGVncmVlIDwtIHN0X3RyYW5zZm9ybShtb3JuaW5nU3RhdGlvbnNHZW8sIGNycyA9IDQzMjYpICU+JSANCiAgbXV0YXRlKGxhdCA9IHN0X2Nvb3JkaW5hdGVzKC4pWywyXSwNCiAgICAgICAgIGxvbiA9IHN0X2Nvb3JkaW5hdGVzKC4pWywxXSkNCg0KIyNHZXQgYm9yZGVycw0KaGVpZ2h0IDwtIG1heChzdF9jb29yZGluYXRlcyhkZi5zaXplLmRlZ3JlZSlbLDJdKSAtIG1pbihzdF9jb29yZGluYXRlcyhkZi5zaXplLmRlZ3JlZSlbLDJdKQ0Kd2lkdGggPC0gbWF4KHN0X2Nvb3JkaW5hdGVzKGRmLnNpemUuZGVncmVlKVssMV0pIC0gbWluKHN0X2Nvb3JkaW5hdGVzKGRmLnNpemUuZGVncmVlKVssMV0pDQogIA0Kc2FjX2JvcmRlcnMgPC0gYyhib3R0b20gPSBtaW4oc3RfY29vcmRpbmF0ZXMoZGYuc2l6ZS5kZWdyZWUpWywyXSkgLSAwLjEqaGVpZ2h0LA0KICAgICAgICAgICAgICAgIHRvcCA9IG1heChzdF9jb29yZGluYXRlcyhkZi5zaXplLmRlZ3JlZSlbLDJdKSArIDAuMSpoZWlnaHQsDQogICAgICAgICAgICAgICAgbGVmdCA9IG1pbihzdF9jb29yZGluYXRlcyhkZi5zaXplLmRlZ3JlZSlbLDFdKSAtIDAuMSp3aWR0aCwNCiAgICAgICAgICAgICAgICByaWdodCA9IG1heChzdF9jb29yZGluYXRlcyhkZi5zaXplLmRlZ3JlZSlbLDFdKSArIDAuMSp3aWR0aCkNCg0KbWFwIDwtIGdldF9zdGFtZW5tYXAoc2FjX2JvcmRlcnMsIHpvb20gPSAxMiwgbWFwdHlwZSA9ICJ0b25lci1saXRlIikNCg0KZ2dtYXAobWFwKSArDQogIGdlb21fZGVuc2l0eTJkKGRhdGEgPSBkZi5zaXplLmRlZ3JlZSwgYWVzKHggPSBsb24sIHkgPSBsYXQpLCBzaXplID0gMC4zKSArDQogIHN0YXRfZGVuc2l0eTJkKGRhdGEgPSBkZi5zaXplLmRlZ3JlZSwgYWVzKHggPSBsb24sIHkgPSBsYXQsIGZpbGwgPSAuLmxldmVsLi4sIGFscGhhID0gLi5sZXZlbC4uKSwgDQogICAgICAgICAgICAgICAgIGdlb20gPSAicG9seWdvbiIsIGJpbnMgPSAxMCkgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JlZW4iLCBoaWdoID0gInJlZCIpICsNCiAgc2NhbGVfYWxwaGEocmFuZ2UgPSBjKDAsIDAuNCksIGd1aWRlID0gRkFMU0UpICNQbG90ICsNCiBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoLTc0LjAyLCAtOTUuNyksIA0KICAgICAgICAgICAgICAgICAgeWxpbSA9IGMoMjkuNSwgMzAuMSkpDQpgYGANCg==