As a side project I recently helped a friend use an R package for retrieving data from the Botantical Information and Ecology Network Database (BIEN). The code for that exploration is documented below.
install.packages("BIEN") install.packages("dplyr") install.packages("leaflet") install.packages("rgdal") install.packages("geojsonio") install.packages("htmltools") install.packages("knitr")
library(BIEN) library(leaflet) library(rgdal) library(geojsonio) library(dplyr) library(htmltools) library(knitr)
BIEN includes occurence data on the species level. The code below queries the database for Western Sumac (Rhus copallanium) and returns an interactive map with markers for all of the places where the species has been documented.
# retrieve occurrenc data for western sumac wsumac <- BIEN_occurrence_species(species = "Rhus copallinum") # plot points on map # popups for date collected where available leaflet(data = wsumac) %>% addProviderTiles("OpenStreetMap.BlackAndWhite") %>% addCircleMarkers(lng=wsumac$longitude, lat=wsumac$latitude, col="firebrick", stroke = FALSE, opacity = 0.1, label = ~htmlEscape(date_collected))
The ranges for species are also available in the database. These are included as
shp files that can be pretty easily dropped on a map.
# retrieve range data as shp files BIEN_ranges_species("Rhus copallinum", directory = "shp")
## Species Range_map_downloaded? ## 1 Rhus_copallinum Yes
# read in the data wsumac <- readOGR(dsn = path.expand("shp"))
## OGR data source with driver: ESRI Shapefile ## Source: "/Users/pnagraj/VP/nagraj-dot-net/content/notes/shp", layer: "Rhus_copallinum" ## with 1 features ## It has 1 fields
# plot the range leaflet(data = wsumac) %>% addProviderTiles("OpenStreetMap.BlackAndWhite") %>% addPolygons()
In terms of metadata, BIEN provides trait information. In the example below, these were measured multiple times and averaged to be reported in a table.
# read in trait data wsumac_traits <- BIEN_trait_species("Rhus copallinum") # aggregate and average numeric traits summarised <- wsumac_traits %>% group_by(trait_name, unit) %>% summarise(average = mean(as.numeric(trait_value), na.rm = TRUE)) %>% filter(!is.nan(average)) %>% mutate(average = paste(round(average, 2), unit)) %>% select(-unit) kable(summarised)
BIEN has species lists on state level as well. After retrieving lists of species for each of the states in the USA … we can count the number of species, and map the distribution of counts by State. This might provide a visual idea of plant diversity across the country.
# by states # query BIEN for lists of species state_species <- BIEN_list_state(country="United States", state=state.name) # count up number of species by state nspecies <- state_species %>% group_by(state_province) %>% tally() # get data for map json_api <- "https://raw.githubusercontent.com/PublicaMundi/MappingAPI/master/data/geojson/us-states.json" states <- geojson_read(json_api, what = "sp") # join in species count states@data <- states@data %>% inner_join(nspecies, by = c("name" = "state_province")) %>% rename(count = n) pal <- colorNumeric("plasma", domain = states@data$count) leaflet(states) %>% addProviderTiles("OpenStreetMap.BlackAndWhite") %>% addPolygons(color = ~pal(count), stroke = FALSE, label = as.character(states@data$count)) %>% addLegend(pal = pal, values = ~count, position = "topright", labFormat = labelFormat(digits = 0)) %>% setView(lat = 37, lng = -90, zoom = 3)