Select Git revision
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
This project is licensed under the GNU General Public License v3.0 or later.
Learn more
01_01_range_map_preparation.R 3.54 KiB
library(tidyverse)
library(Symobio)
library(sf)
library(rnaturalearth)
library(Rfast)
sf::sf_use_s2(use_s2 = FALSE)
# --------------------------------------#
# Process range maps ####
# --------------------------------------#
# Load range maps
range_maps = st_read(
"~/share/groups/mas_data/Saved_Data_Dropbox_Business/Datensätze/Range Maps/IUCN_range_maps_mammals_version2016/TERRESTRIAL_MAMMALS.shp",
geometry_column = "geometry",
promote_to_multi = T
) %>%
dplyr::filter(!legend %in% c("Extinct", "Not Mapped"))
# Find species that intersect with Amazon
amazon = st_read(
"data/geospatial/amazonia_polygons/amazonia_polygons.shp",
geometry_column = "geometry",
promote_to_multi = T
)
range_maps = st_filter(range_maps, amazon)
# Match names against GBIF backbone
range_maps_names_matched = lapply(unique(range_maps$binomial), function(name){
tryCatch({
match_result = Symobio::gbif_match_name(name = name)
if(match_result$status != "ACCEPTED"){
match_result = gbif_match_name(usageKey = match_result$acceptedUsageKey)
}
name_matched = if("species" %in% names(match_result)) match_result$species else NA
data.frame(name_orig = name, name_matched = name_matched)
}, error = function(e){
return(NULL)
})
}) %>%
bind_rows()
save(range_maps_names_matched, file = "data/r_objects/range_maps_names_matched.RData")
# Subset range maps to target species and focal region
range_maps = range_maps %>%
inner_join(range_maps_names_matched, by = c("binomial" = "name_orig")) %>%
group_by(name_matched) %>%
summarize(geometry = suppressMessages(st_union(geometry)))
save(range_maps, file = "data/r_objects/range_maps.RData")
# -------------------------------------------#
# Process gridded range maps ####
# -------------------------------------------#
range_maps_gridded = rnaturalearth::ne_countries() %>%
dplyr::filter(continent == "South America") %>%
sf::st_union() %>%
st_make_grid(square = FALSE, cellsize = 1) %>%
st_sf() %>%
st_join(range_maps, st_intersects, left = F) %>%
na.omit()
save(range_maps_gridded, file = "data/r_objects/range_maps_gridded.RData")
# ----------------------------------------------#
# Calculate range dissimilarity ####
# ----------------------------------------------#
load("data/r_objects/range_maps_gridded.RData")
range_maps_gridded_id = range_maps_gridded %>%
dplyr::group_by(geometry) %>%
dplyr::mutate(geom_id = cur_group_id()) %>%
ungroup()
geometries_unique = range_maps_gridded_id %>%
dplyr::select(-name_matched) %>%
group_by(geom_id) %>%
slice_head(n = 1)
geom_dist = sf::st_distance(geometries_unique, geometries_unique) %>% # Takes ~ 10 mins
as.matrix()
range_maps_split = range_maps_gridded_id %>%
group_by(name_matched) %>%
group_split()
mean_minimum_distances = lapply(range_maps_split, function(df1){ # Takes ~ 30 mins
df_dist = lapply(range_maps_split, function(df2){
dists_subset = geom_dist[df1$geom_id, df2$geom_id, drop = F]
dist = mean(Rfast::rowMins(dists_subset, value = T)) # Mean minimum distance
df_result = data.frame(
species1 = df1$name_matched[1],
species2 = df2$name_matched[1],
dist = dist
)
return(df_result)
}) %>% bind_rows()
return(df_dist)
}) %>% bind_rows()
range_dist = mean_minimum_distances %>%
pivot_wider(names_from = species2, values_from = dist) %>%
column_to_rownames("species1") %>%
as.matrix()
range_dist = range_dist / max(range_dist) # Scale to (0,1)
save(range_dist, file = "data/r_objects/range_dist.RData")