The new version of the book is now available mdsr2e. The new chapter Chapter 17 Working with geospatial data used the new R package sf and could be further updated to the the new R package cholera.

library(tidyverse)
library(mdsr)
library(sf)
plot(CholeraDeaths["Count"])

It is probably best to do this in an R Project.

download.file("http://rtwilson.com/downloads/SnowGIS_SHP.zip",
              dest="SnowGIS.zip", mode="wb")
trying URL 'http://rtwilson.com/downloads/SnowGIS_SHP.zip'
Content type 'application/zip' length 6875824 bytes (6.6 MB)
==================================================
downloaded 6.6 MB
unzip("SnowGIS.zip")
dsn <- fs::path("SnowGIS_SHP")
list.files(dsn)
 [1] "Cholera_Deaths.dbf"          "Cholera_Deaths.prj"          "Cholera_Deaths.sbn"         
 [4] "Cholera_Deaths.sbx"          "Cholera_Deaths.shp"          "Cholera_Deaths.shx"         
 [7] "OSMap_Grayscale.tfw"         "OSMap_Grayscale.tif"         "OSMap_Grayscale.tif.aux.xml"
[10] "OSMap_Grayscale.tif.ovr"     "OSMap.tfw"                   "OSMap.tif"                  
[13] "Pumps.dbf"                   "Pumps.prj"                   "Pumps.sbx"                  
[16] "Pumps.shp"                   "Pumps.shx"                   "README.txt"                 
[19] "SnowMap.tfw"                 "SnowMap.tif"                 "SnowMap.tif.aux.xml"        
[22] "SnowMap.tif.ovr"            
st_layers(dsn)
Driver: ESRI Shapefile 
Available layers:
      layer_name geometry_type features fields
1          Pumps         Point        8      1
2 Cholera_Deaths         Point      250      2
CholeraDeaths <- st_read(dsn, layer = "Cholera_Deaths")
Reading layer `Cholera_Deaths' from data source `/home/esuess/classes/2020-2021/01 - Fall 2020/Stat651/Presentations/08_spatial/spatial4/SnowGIS_SHP' using driver `ESRI Shapefile'
Simple feature collection with 250 features and 2 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: 529160.3 ymin: 180857.9 xmax: 529655.9 ymax: 181306.2
epsg (SRID):    NA
proj4string:    +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs
class(CholeraDeaths)
[1] "sf"         "data.frame"
CholeraDeaths
Simple feature collection with 250 features and 2 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: 529160.3 ymin: 180857.9 xmax: 529655.9 ymax: 181306.2
epsg (SRID):    NA
proj4string:    +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs
First 10 features:
   Id Count                  geometry
1   0     3 POINT (529308.7 181031.4)
2   0     2 POINT (529312.2 181025.2)
3   0     1 POINT (529314.4 181020.3)
4   0     1 POINT (529317.4 181014.3)
5   0     4 POINT (529320.7 181007.9)
6   0     2   POINT (529336.7 181006)
7   0     2 POINT (529290.1 181024.4)
8   0     2   POINT (529301 181021.2)
9   0     3   POINT (529285 181020.2)
10  0     2 POINT (529288.4 181031.8)
summary(CholeraDeaths)
       Id        Count                 geometry  
 Min.   :0   Min.   : 1.000   POINT        :250  
 1st Qu.:0   1st Qu.: 1.000   epsg:NA      :  0  
 Median :0   Median : 1.000   +proj=tmer...:  0  
 Mean   :0   Mean   : 1.956                      
 3rd Qu.:0   3rd Qu.: 2.000                      
 Max.   :0   Max.   :15.000                      
ggplot(CholeraDeaths) +
  geom_sf()

In the new edition of the book the authors use Open Street Maps instead of Google Maps API.

library(ggspatial)
ggplot(CholeraDeaths) + 
  annotation_map_tile(type = "osm", zoomin = 0) + 
  geom_sf(aes(size = Count), alpha = 0.7)

st_bbox(CholeraDeaths)
    xmin     ymin     xmax     ymax 
529160.3 180857.9 529655.9 181306.2 

Projections

library(mapproj)
library(maps)
map("world", projection = "mercator", wrap = TRUE)
projection failed for some data

map("world", projection = "cylequalarea", param = 45, wrap = TRUE)

map(
  "state", projection = "lambert", 
  parameters = c(lat0 = 20, lat1 = 50), wrap = TRUE
)

map(
  "state", projection = "albers", 
  parameters = c(lat0 = 20, lat1 = 50), wrap = TRUE
)

st_crs(CholeraDeaths)
Coordinate Reference System:
  No EPSG code
  proj4string: "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs"
st_crs(4326)$epsg
[1] 4326
st_crs(3857)
Coordinate Reference System:
  EPSG: 3857 
  proj4string: "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"
st_crs(27700)$proj4string
[1] "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 +units=m +no_defs"
cholera_4326 <- CholeraDeaths %>% 
  st_transform(4326)
st_bbox(cholera_4326)
      xmin       ymin       xmax       ymax 
-0.1384685 51.5113460 -0.1313274 51.5153252 
ggplot(cholera_4326) + 
  annotation_map_tile(type = "osm", zoomin = 0) + 
  geom_sf(aes(size = Count), alpha = 0.7)

help("spTransform-methods", package = "rgdal")
st_crs(CholeraDeaths)$proj4string
[1] "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs"
cholera_latlong <- CholeraDeaths %>%
  st_set_crs(27700) %>%
  st_transform(4326)
st_crs<- : replacing crs does not reproject data; use st_transform for that
snow <- ggplot(cholera_latlong) + 
  annotation_map_tile(type = "osm", zoomin = 0) + 
  geom_sf(aes(size = Count))
pumps <- st_read(dsn, layer = "Pumps")
Reading layer `Pumps' from data source `/home/esuess/classes/2020-2021/01 - Fall 2020/Stat651/Presentations/08_spatial/spatial4/SnowGIS_SHP' using driver `ESRI Shapefile'
Simple feature collection with 8 features and 1 field
geometry type:  POINT
dimension:      XY
bbox:           xmin: 529183.7 ymin: 180660.5 xmax: 529748.9 ymax: 181193.7
epsg (SRID):    NA
proj4string:    +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs
pumps_latlong <- pumps %>% 
  st_set_crs(27700) %>%
  st_transform(4326)
st_crs<- : replacing crs does not reproject data; use st_transform for that
snow +
  geom_sf(data = pumps_latlong, size = 3, color = "red")

Leaflet

library(tidygeocoder)
white_house <- tibble(
  address = "The White House, Washington, DC"
) %>%
  tidygeocoder::geocode(address, method = "osm")
library(leaflet)
white_house_map <- leaflet() %>% 
  addTiles() %>%
  addMarkers(data = white_house)
Assuming "long" and "lat" are longitude and latitude, respectively
white_house_map 
white_house <- white_house %>%
  mutate(
    title = "The White House", 
    street_address = "1600 Pennsylvania Ave"
  )
white_house_map %>% 
  addPopups(
    data = white_house, 
    popup = ~paste0("<b>", title, "</b></br>", street_address)
  )
Assuming "long" and "lat" are longitude and latitude, respectively
LS0tCnRpdGxlOiAiU3BhdGlhbCBEYXRhIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpUaGUgbmV3IHZlcnNpb24gb2YgdGhlIGJvb2sgaXMgbm93IGF2YWlsYWJsZSBbbWRzcjJlXShodHRwczovL2JlYW51bWJlci5naXRodWIuaW8vbWRzcjJlLykuICBUaGUgbmV3IGNoYXB0ZXIgW0NoYXB0ZXIgMTcgV29ya2luZyB3aXRoIGdlb3NwYXRpYWwgZGF0YV0oaHR0cHM6Ly9iZWFudW1iZXIuZ2l0aHViLmlvL21kc3IyZS9jaC1zcGF0aWFsLmh0bWwpIHVzZWQgdGhlIG5ldyBSIHBhY2thZ2UgW3NmXShodHRwczovL3Itc3BhdGlhbC5naXRodWIuaW8vc2YvKSBhbmQgY291bGQgYmUgZnVydGhlciB1cGRhdGVkIHRvIHRoZSB0aGUgbmV3IFIgcGFja2FnZSBbY2hvbGVyYV0oaHR0cHM6Ly9naXRodWIuY29tL2xpbmRicm9vay9jaG9sZXJhKS4KCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobWRzcikKbGlicmFyeShzZikKcGxvdChDaG9sZXJhRGVhdGhzWyJDb3VudCJdKQpgYGAKCkl0IGlzIHByb2JhYmx5IGJlc3QgdG8gZG8gdGhpcyBpbiBhbiBSIFByb2plY3QuCgpgYGB7cn0KZG93bmxvYWQuZmlsZSgiaHR0cDovL3J0d2lsc29uLmNvbS9kb3dubG9hZHMvU25vd0dJU19TSFAuemlwIiwKICAgICAgICAgICAgICBkZXN0PSJTbm93R0lTLnppcCIsIG1vZGU9IndiIikKdW56aXAoIlNub3dHSVMuemlwIikKCmRzbiA8LSBmczo6cGF0aCgiU25vd0dJU19TSFAiKQpsaXN0LmZpbGVzKGRzbikKYGBgCgpgYGB7cn0Kc3RfbGF5ZXJzKGRzbikKYGBgCgoKCmBgYHtyfQpDaG9sZXJhRGVhdGhzIDwtIHN0X3JlYWQoZHNuLCBsYXllciA9ICJDaG9sZXJhX0RlYXRocyIpCmBgYAoKYGBge3J9CmNsYXNzKENob2xlcmFEZWF0aHMpCmBgYAoKYGBge3J9CkNob2xlcmFEZWF0aHMKYGBgCgoKYGBge3J9CnN1bW1hcnkoQ2hvbGVyYURlYXRocykKYGBgCgpgYGB7cn0KZ2dwbG90KENob2xlcmFEZWF0aHMpICsKICBnZW9tX3NmKCkKYGBgCgpJbiB0aGUgbmV3IGVkaXRpb24gb2YgdGhlIGJvb2sgdGhlIGF1dGhvcnMgdXNlIE9wZW4gU3RyZWV0IE1hcHMgaW5zdGVhZCBvZiBHb29nbGUgTWFwcyBBUEkuCgpgYGB7cn0KbGlicmFyeShnZ3NwYXRpYWwpCgpnZ3Bsb3QoQ2hvbGVyYURlYXRocykgKyAKICBhbm5vdGF0aW9uX21hcF90aWxlKHR5cGUgPSAib3NtIiwgem9vbWluID0gMCkgKyAKICBnZW9tX3NmKGFlcyhzaXplID0gQ291bnQpLCBhbHBoYSA9IDAuNykKYGBgCgpgYGB7cn0Kc3RfYmJveChDaG9sZXJhRGVhdGhzKQpgYGAKCiMgUHJvamVjdGlvbnMKCmBgYHtyfQpsaWJyYXJ5KG1hcHByb2opCmxpYnJhcnkobWFwcykKCm1hcCgid29ybGQiLCBwcm9qZWN0aW9uID0gIm1lcmNhdG9yIiwgd3JhcCA9IFRSVUUpCm1hcCgid29ybGQiLCBwcm9qZWN0aW9uID0gImN5bGVxdWFsYXJlYSIsIHBhcmFtID0gNDUsIHdyYXAgPSBUUlVFKQpgYGAKCgpgYGB7cn0KbWFwKAogICJzdGF0ZSIsIHByb2plY3Rpb24gPSAibGFtYmVydCIsIAogIHBhcmFtZXRlcnMgPSBjKGxhdDAgPSAyMCwgbGF0MSA9IDUwKSwgd3JhcCA9IFRSVUUKKQptYXAoCiAgInN0YXRlIiwgcHJvamVjdGlvbiA9ICJhbGJlcnMiLCAKICBwYXJhbWV0ZXJzID0gYyhsYXQwID0gMjAsIGxhdDEgPSA1MCksIHdyYXAgPSBUUlVFCikKYGBgCgoKYGBge3J9CnN0X2NycyhDaG9sZXJhRGVhdGhzKQpgYGAKCmBgYHtyfQpzdF9jcnMoNDMyNikkZXBzZwpgYGAKCmBgYHtyfQpzdF9jcnMoMzg1NykKYGBgCgpgYGB7cn0Kc3RfY3JzKDI3NzAwKSRwcm9qNHN0cmluZwpgYGAKCmBgYHtyfQpjaG9sZXJhXzQzMjYgPC0gQ2hvbGVyYURlYXRocyAlPiUgCiAgc3RfdHJhbnNmb3JtKDQzMjYpCmBgYAoKYGBge3J9CnN0X2Jib3goY2hvbGVyYV80MzI2KQpgYGAKCmBgYHtyfQpnZ3Bsb3QoY2hvbGVyYV80MzI2KSArIAogIGFubm90YXRpb25fbWFwX3RpbGUodHlwZSA9ICJvc20iLCB6b29taW4gPSAwKSArIAogIGdlb21fc2YoYWVzKHNpemUgPSBDb3VudCksIGFscGhhID0gMC43KQpgYGAKCmBgYHtyfQpoZWxwKCJzcFRyYW5zZm9ybS1tZXRob2RzIiwgcGFja2FnZSA9ICJyZ2RhbCIpCmBgYAoKYGBge3J9CnN0X2NycyhDaG9sZXJhRGVhdGhzKSRwcm9qNHN0cmluZwpgYGAKCmBgYHtyfQpjaG9sZXJhX2xhdGxvbmcgPC0gQ2hvbGVyYURlYXRocyAlPiUKICBzdF9zZXRfY3JzKDI3NzAwKSAlPiUKICBzdF90cmFuc2Zvcm0oNDMyNikKCnNub3cgPC0gZ2dwbG90KGNob2xlcmFfbGF0bG9uZykgKyAKICBhbm5vdGF0aW9uX21hcF90aWxlKHR5cGUgPSAib3NtIiwgem9vbWluID0gMCkgKyAKICBnZW9tX3NmKGFlcyhzaXplID0gQ291bnQpKQpgYGAKCmBgYHtyfQpwdW1wcyA8LSBzdF9yZWFkKGRzbiwgbGF5ZXIgPSAiUHVtcHMiKQpgYGAKCmBgYHtyfQpwdW1wc19sYXRsb25nIDwtIHB1bXBzICU+JSAKICBzdF9zZXRfY3JzKDI3NzAwKSAlPiUKICBzdF90cmFuc2Zvcm0oNDMyNikKc25vdyArCiAgZ2VvbV9zZihkYXRhID0gcHVtcHNfbGF0bG9uZywgc2l6ZSA9IDMsIGNvbG9yID0gInJlZCIpCmBgYAoKIyBMZWFmbGV0CgpgYGB7cn0KbGlicmFyeSh0aWR5Z2VvY29kZXIpCndoaXRlX2hvdXNlIDwtIHRpYmJsZSgKICBhZGRyZXNzID0gIlRoZSBXaGl0ZSBIb3VzZSwgV2FzaGluZ3RvbiwgREMiCikgJT4lCiAgdGlkeWdlb2NvZGVyOjpnZW9jb2RlKGFkZHJlc3MsIG1ldGhvZCA9ICJvc20iKQoKbGlicmFyeShsZWFmbGV0KQp3aGl0ZV9ob3VzZV9tYXAgPC0gbGVhZmxldCgpICU+JSAKICBhZGRUaWxlcygpICU+JQogIGFkZE1hcmtlcnMoZGF0YSA9IHdoaXRlX2hvdXNlKQp3aGl0ZV9ob3VzZV9tYXAgCmBgYAoKYGBge3J9CndoaXRlX2hvdXNlIDwtIHdoaXRlX2hvdXNlICU+JQogIG11dGF0ZSgKICAgIHRpdGxlID0gIlRoZSBXaGl0ZSBIb3VzZSIsIAogICAgc3RyZWV0X2FkZHJlc3MgPSAiMTYwMCBQZW5uc3lsdmFuaWEgQXZlIgogICkKd2hpdGVfaG91c2VfbWFwICU+JSAKICBhZGRQb3B1cHMoCiAgICBkYXRhID0gd2hpdGVfaG91c2UsIAogICAgcG9wdXAgPSB+cGFzdGUwKCI8Yj4iLCB0aXRsZSwgIjwvYj48L2JyPiIsIHN0cmVldF9hZGRyZXNzKQogICkKYGBgCgoK