EEB4100 Lab

Due Friday, May 6th 2026 at noon. Submit as a PDF on HuskyCT. (20 pts)

1. Connect with data housed in gbif (https://www.gbif.org/) to examine migration patterns of a specific species of bird (4 pts).

hawk_gbif<- occ_download_get(key = "0014302-260226173443078", overwrite = TRUE) %>%
  occ_download_import(hawk_gbif_download, na.strings = c("", NA))
## Download file size: 29.22 MB
## On disk at C:\Users\Abiey\EEB4100\0014302-260226173443078.zip
coopers_hawk<- hawk_gbif %>%
  filter(species == "Accipiter cooperii") %>%
  select(species, decimalLatitude, decimalLongitude, eventDate) %>%
  na.omit()

2. Display this information (bird observations and migration) on a map via leaflet - include layers for temperature and elevation (10 pts).

#install.packages("elevatr")
#install.packages("climate")
#install.packages("geodata")
#install.packages("leaflet.extras2")
library(elevatr)
## elevatr v0.99.0 NOTE: Version 0.99.0 of 'elevatr' uses 'sf' and 'terra'.  Use 
## of the 'sp', 'raster', and underlying 'rgdal' packages by 'elevatr' is being 
## deprecated; however, get_elev_raster continues to return a RasterLayer.  This 
## will be dropped in future versions, so please plan accordingly.
library(lubridate)
library(climate)
library(terra)
## terra 1.8.93
## 
## Attaching package: 'terra'
## The following object is masked from 'package:tidyr':
## 
##     extract
library(raster)
## Loading required package: sp
## 
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
## 
##     select
library(geodata)
library(leaflet.extras2)
coopers_hawk<- coopers_hawk %>%
  mutate(eventDate = ymd(eventDate),
         month = month(eventDate),
         migration = ifelse(month %in% c(9,10,11),
         "Coopers_Hawk_Migrated", "Coopers_Hawk_Observations"))

migrated_data<- coopers_hawk %>%
  filter(migration == "Coopers_Hawk_Migrated")
other_data<- coopers_hawk %>%
  filter(migration == "Coopers_Hawk_Observations")

coordinates_sf <- st_as_sf(coopers_hawk,
  coords = c("decimalLongitude", "decimalLatitude"),
  crs = 4326)
elevation<- get_elev_raster(locations = coordinates_sf, z = 5)
## Mosaicing & Projecting
## Note: Elevation units are in meters.
elevation<- rast(elevation)
elevation<- aggregate(elevation, fact = 4)

temperature_raster<- raster("temperature.tif")
downsampled_temp<- aggregate(temperature_raster, fact = 4)

leaflet() %>%
  setView(lng = -79, lat = 37.8, zoom = 5) %>%
  addTiles() %>%
addProviderTiles(providers$Esri.NatGeoWorldMap) %>% 
  addProviderTiles(providers$OpenTopoMap) %>%
addCircleMarkers(data = migrated_data,
                 ~decimalLongitude, ~decimalLatitude,
                 color = "paleturquoise",fillOpacity = 1, radius = 3,
                 group = "Coopers Hawk Migrated Observations") %>%
addCircleMarkers(data = other_data,
                 ~decimalLongitude, ~decimalLatitude,
                 color = "orchid",fillOpacity = 1, radius = 3,
                 group = "Coopers Hawk Observations") %>%
addRasterImage(elevation,
               group = "Elevation") %>%
addRasterImage(downsampled_temp, group = "Temperature") %>%
addLayersControl(
  overlayGroups = c("Coopers Hawk Migrated Observations", "Coopers Hawk Observations", "Temperature"),
  options = layersControlOptions(collapsed=FALSE))

3. Label the three most populous cities near the largest set of observations for your target species (4 pts)

nyc_coords<- c(40.7128, -74.0060)
philly_coords<- c(39.9526, -75.1652)
dc_coords<- c(38.9073, -77.0369)

leaflet() %>%
  setView(lng = -79, lat = 37.8, zoom = 5) %>%
  addTiles() %>%
addProviderTiles(providers$Esri.NatGeoWorldMap) %>% 
  addProviderTiles(providers$OpenTopoMap) %>%
addCircleMarkers(data = migrated_data,
                 ~decimalLongitude, ~decimalLatitude,
                 color = "paleturquoise",fillOpacity = 1, radius = 3,
                 group = "Coopers Hawk Migrated Observations") %>%
addCircleMarkers(data = other_data,
                 ~decimalLongitude, ~decimalLatitude,
                 color = "orchid",fillOpacity = 1, radius = 3,
                 group = "Coopers Hawk Observations") %>%
addRasterImage(elevation,
               group = "Elevation") %>%
addRasterImage(downsampled_temp, group = "Temperature") %>%
addLayersControl(
  overlayGroups = c("Coopers Hawk Migrated Observations", "Coopers Hawk Observations", "Temperature"),
  options = layersControlOptions(collapsed=FALSE)) %>%
addMarkers(lng = nyc_coords[2], lat = nyc_coords[1], label = "New York City", labelOptions = labelOptions(noHide = TRUE)) %>%
addMarkers(lng = philly_coords[2], lat = philly_coords[1], label = "Philidelphia", labelOptions = labelOptions(noHide = TRUE)) %>%
addMarkers(lng = dc_coords[2], lat = dc_coords[1], label = "Washington DC", labelOptions = labelOptions(noHide = TRUE))

4. Provide appropriate legends to describe the data (2 pts).

Describe the choices you made on the map design and representation.

leaflet() %>%
  setView(lng = -79, lat = 37.8, zoom = 5) %>%
  addTiles() %>%
addProviderTiles(providers$Esri.NatGeoWorldMap) %>% 
  addProviderTiles(providers$OpenTopoMap) %>%
addCircleMarkers(data = migrated_data,
                 ~decimalLongitude, ~decimalLatitude,
                 color = "paleturquoise",fillOpacity = 1, radius = 3,
                 group = "Coopers Hawk Migrated Observations") %>%
addCircleMarkers(data = other_data,
                 ~decimalLongitude, ~decimalLatitude,
                 color = "orchid",fillOpacity = 1, radius = 3,
                 group = "Coopers Hawk Observations") %>%
addRasterImage(elevation,
               group = "Elevation") %>%
addRasterImage(downsampled_temp, 
               color = "palevioletred1", opacity = 1, 
               group = "Temperature") %>%
addMarkers(lng = nyc_coords[2], lat = nyc_coords[1], label = "New York City", labelOptions = labelOptions(noHide = TRUE)) %>%
addMarkers(lng = philly_coords[2], lat = philly_coords[1], label = "Philidelphia", labelOptions = labelOptions(noHide = TRUE)) %>%
addMarkers(lng = dc_coords[2], lat = dc_coords[1], label = "Washington DC", labelOptions = labelOptions(noHide = TRUE)) %>%
addLayersControl(
    overlayGroups = c("Coopers Hawk Migrated Observations", "Coopers Hawk Observations", "Temperature"),
    options = layersControlOptions(collapsed = FALSE)) %>%
addLegend(position = "bottomright", 
            colors = c("paleturquoise", "orchid", "palevioletred1"), 
            labels = c("Coopers Hawk Migrated Observations", "Coopers Hawk Observations", "Temperature"), 
            opacity = 1) %>%
  addLegend("bottomleft", title = "Elevation",
            pal = colorNumeric(palette = c("lightgreen", "green", "darkgreen", "yellow", "orange", "red"), domain = c(0, 2000)),
            values = c(0, 2000),
            labels = c("0-200m", "201-400m", "401-600m", "601-800m", "801-1000m", "1001-2000m"),opacity = 1)
# For the different observations, I separated them based on the months in which they were recorded. Coopers Hawks typically migrate from August to November so those were the months I pulled for migrated observations. I gave migrated and non migrated observations different colors to make them easier to see. I added a temperature layer that can be turned on and off and set that to a color that was easily contrasted between the data points. An elevation layer was also added with corresponding colors based on value. A majority of the sightings were recorded in a small area in the eastern US, so I labeled three populous cities somewhat near to the cluster of data points.