diff --git a/.gitignore b/.gitignore index 6e92f57d..3a293c48 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ tags +assets/landcover/landcover_copernicus_global_100m* diff --git a/assets/landcover/lc_bare-5m.tif b/assets/landcover/lc_bare-5m.tif deleted file mode 100644 index 6b4bf6a1..00000000 Binary files a/assets/landcover/lc_bare-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_bare_10m.tif b/assets/landcover/lc_bare_10m.tif index b23e1279..b2dbce5a 100644 Binary files a/assets/landcover/lc_bare_10m.tif and b/assets/landcover/lc_bare_10m.tif differ diff --git a/assets/landcover/lc_bare_5m.tif b/assets/landcover/lc_bare_5m.tif new file mode 100644 index 00000000..fe94414d Binary files /dev/null and b/assets/landcover/lc_bare_5m.tif differ diff --git a/assets/landcover/lc_crops-5m.tif b/assets/landcover/lc_crops-5m.tif deleted file mode 100644 index 4b0a34fe..00000000 Binary files a/assets/landcover/lc_crops-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_crops_10m.tif b/assets/landcover/lc_crops_10m.tif index ba2b18c5..23b5b5eb 100644 Binary files a/assets/landcover/lc_crops_10m.tif and b/assets/landcover/lc_crops_10m.tif differ diff --git a/assets/landcover/lc_crops_5m.tif b/assets/landcover/lc_crops_5m.tif new file mode 100644 index 00000000..1d7dba20 Binary files /dev/null and b/assets/landcover/lc_crops_5m.tif differ diff --git a/assets/landcover/lc_grass-5m.tif b/assets/landcover/lc_grass-5m.tif deleted file mode 100644 index b0619efe..00000000 Binary files a/assets/landcover/lc_grass-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_grass_10m.tif b/assets/landcover/lc_grass_10m.tif index 36f97393..5bf9234b 100644 Binary files a/assets/landcover/lc_grass_10m.tif and b/assets/landcover/lc_grass_10m.tif differ diff --git a/assets/landcover/lc_grass_5m.tif b/assets/landcover/lc_grass_5m.tif new file mode 100644 index 00000000..a4c89423 Binary files /dev/null and b/assets/landcover/lc_grass_5m.tif differ diff --git a/assets/landcover/lc_moss-5m.tif b/assets/landcover/lc_moss-5m.tif deleted file mode 100644 index e79ade43..00000000 Binary files a/assets/landcover/lc_moss-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_moss_10m.tif b/assets/landcover/lc_moss_10m.tif index abc5dcdc..f6276e80 100644 Binary files a/assets/landcover/lc_moss_10m.tif and b/assets/landcover/lc_moss_10m.tif differ diff --git a/assets/landcover/lc_moss_5m.tif b/assets/landcover/lc_moss_5m.tif new file mode 100644 index 00000000..e85731a3 Binary files /dev/null and b/assets/landcover/lc_moss_5m.tif differ diff --git a/assets/landcover/lc_shrub-5m.tif b/assets/landcover/lc_shrub-5m.tif deleted file mode 100644 index 4a2a9af8..00000000 Binary files a/assets/landcover/lc_shrub-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_shrub_10m.tif b/assets/landcover/lc_shrub_10m.tif index 4b7a8a0b..a3c28c78 100644 Binary files a/assets/landcover/lc_shrub_10m.tif and b/assets/landcover/lc_shrub_10m.tif differ diff --git a/assets/landcover/lc_shrub_5m.tif b/assets/landcover/lc_shrub_5m.tif new file mode 100644 index 00000000..829e8241 Binary files /dev/null and b/assets/landcover/lc_shrub_5m.tif differ diff --git a/assets/landcover/lc_snow-5m.tif b/assets/landcover/lc_snow-5m.tif deleted file mode 100644 index 6d1cd305..00000000 Binary files a/assets/landcover/lc_snow-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_snow_10m.tif b/assets/landcover/lc_snow_10m.tif index 94a0faae..28f00854 100644 Binary files a/assets/landcover/lc_snow_10m.tif and b/assets/landcover/lc_snow_10m.tif differ diff --git a/assets/landcover/lc_snow_5m.tif b/assets/landcover/lc_snow_5m.tif new file mode 100644 index 00000000..23057f3b Binary files /dev/null and b/assets/landcover/lc_snow_5m.tif differ diff --git a/assets/landcover/lc_tree-5m.tif b/assets/landcover/lc_tree-5m.tif deleted file mode 100644 index 4ae0e36e..00000000 Binary files a/assets/landcover/lc_tree-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_tree_10m.tif b/assets/landcover/lc_tree_10m.tif index 623d4240..b8854a65 100644 Binary files a/assets/landcover/lc_tree_10m.tif and b/assets/landcover/lc_tree_10m.tif differ diff --git a/assets/landcover/lc_tree_5m.tif b/assets/landcover/lc_tree_5m.tif new file mode 100644 index 00000000..f7a6b0d5 Binary files /dev/null and b/assets/landcover/lc_tree_5m.tif differ diff --git a/assets/landcover/lc_urban-5m.tif b/assets/landcover/lc_urban-5m.tif deleted file mode 100644 index 083fa511..00000000 Binary files a/assets/landcover/lc_urban-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_urban_10m.tif b/assets/landcover/lc_urban_10m.tif index 93487e2e..5c90765b 100644 Binary files a/assets/landcover/lc_urban_10m.tif and b/assets/landcover/lc_urban_10m.tif differ diff --git a/assets/landcover/lc_urban_5m.tif b/assets/landcover/lc_urban_5m.tif new file mode 100644 index 00000000..ed93962f Binary files /dev/null and b/assets/landcover/lc_urban_5m.tif differ diff --git a/assets/landcover/lc_water-permanent-5m.tif b/assets/landcover/lc_water-permanent-5m.tif deleted file mode 100644 index b391adef..00000000 Binary files a/assets/landcover/lc_water-permanent-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_water-permanent_10m.tif b/assets/landcover/lc_water-permanent_10m.tif index fe14e8e9..4ff781fc 100644 Binary files a/assets/landcover/lc_water-permanent_10m.tif and b/assets/landcover/lc_water-permanent_10m.tif differ diff --git a/assets/landcover/lc_water-permanent_5m.tif b/assets/landcover/lc_water-permanent_5m.tif new file mode 100644 index 00000000..5bcf0412 Binary files /dev/null and b/assets/landcover/lc_water-permanent_5m.tif differ diff --git a/assets/landcover/lc_water-seasonal-5m.tif b/assets/landcover/lc_water-seasonal-5m.tif deleted file mode 100644 index 3823f80b..00000000 Binary files a/assets/landcover/lc_water-seasonal-5m.tif and /dev/null differ diff --git a/assets/landcover/lc_water-seasonal_10m.tif b/assets/landcover/lc_water-seasonal_10m.tif index bea76de0..3ae70ea4 100644 Binary files a/assets/landcover/lc_water-seasonal_10m.tif and b/assets/landcover/lc_water-seasonal_10m.tif differ diff --git a/assets/landcover/lc_water-seasonal_5m.tif b/assets/landcover/lc_water-seasonal_5m.tif new file mode 100644 index 00000000..fa0b5db6 Binary files /dev/null and b/assets/landcover/lc_water-seasonal_5m.tif differ diff --git a/fig/06_relationship_lcbd-richness-transf.png b/fig/06_relationship_lcbd-richness-transf.png index f644e99b..7929dbc3 100644 Binary files a/fig/06_relationship_lcbd-richness-transf.png and b/fig/06_relationship_lcbd-richness-transf.png differ diff --git a/fig/06_relationship_lcbd-richness.png b/fig/06_relationship_lcbd-richness.png index c387f1e1..8eb6fb5e 100644 Binary files a/fig/06_relationship_lcbd-richness.png and b/fig/06_relationship_lcbd-richness.png differ diff --git a/fig/quantiles/03_raw_richness_quantiles.pdf b/fig/quantiles/03_raw_richness_quantiles.pdf new file mode 100644 index 00000000..66742939 Binary files /dev/null and b/fig/quantiles/03_raw_richness_quantiles.pdf differ diff --git a/fig/quantiles/03_sdm_richness_quantiles.pdf b/fig/quantiles/03_sdm_richness_quantiles.pdf index 5c429148..0893890e 100644 Binary files a/fig/quantiles/03_sdm_richness_quantiles.pdf and b/fig/quantiles/03_sdm_richness_quantiles.pdf differ diff --git a/fig/quantiles/05_raw_lcbd-transf_quantiles.pdf b/fig/quantiles/05_raw_lcbd-transf_quantiles.pdf new file mode 100644 index 00000000..e39a2c08 Binary files /dev/null and b/fig/quantiles/05_raw_lcbd-transf_quantiles.pdf differ diff --git a/fig/quantiles/05_raw_lcbd_quantiles.pdf b/fig/quantiles/05_raw_lcbd_quantiles.pdf new file mode 100644 index 00000000..268939aa Binary files /dev/null and b/fig/quantiles/05_raw_lcbd_quantiles.pdf differ diff --git a/fig/quantiles/05_sdm_lcbd-transf_quantiles.pdf b/fig/quantiles/05_sdm_lcbd-transf_quantiles.pdf index 6bb2723c..9bdd2490 100644 Binary files a/fig/quantiles/05_sdm_lcbd-transf_quantiles.pdf and b/fig/quantiles/05_sdm_lcbd-transf_quantiles.pdf differ diff --git a/fig/quantiles/05_sdm_lcbd_quantiles.pdf b/fig/quantiles/05_sdm_lcbd_quantiles.pdf index 1a94fa7e..4855370c 100644 Binary files a/fig/quantiles/05_sdm_lcbd_quantiles.pdf and b/fig/quantiles/05_sdm_lcbd_quantiles.pdf differ diff --git a/fig/quantiles/06_relationship_lcbd-richness-dbtransf-nbsp_quantiles.png b/fig/quantiles/06_relationship_lcbd-richness-dbtransf-nbsp_quantiles.png index 90848fe8..223a1264 100644 Binary files a/fig/quantiles/06_relationship_lcbd-richness-dbtransf-nbsp_quantiles.png and b/fig/quantiles/06_relationship_lcbd-richness-dbtransf-nbsp_quantiles.png differ diff --git a/fig/quantiles/06_relationship_lcbd-richness-transf_quantiles.png b/fig/quantiles/06_relationship_lcbd-richness-transf_quantiles.png index 233ee14f..48395b23 100644 Binary files a/fig/quantiles/06_relationship_lcbd-richness-transf_quantiles.png and b/fig/quantiles/06_relationship_lcbd-richness-transf_quantiles.png differ diff --git a/fig/quantiles/07_raw_endemism_quantiles.pdf b/fig/quantiles/07_raw_endemism_quantiles.pdf new file mode 100644 index 00000000..2ff3f74c Binary files /dev/null and b/fig/quantiles/07_raw_endemism_quantiles.pdf differ diff --git a/fig/quantiles/07_sdm_endemism_quantiles.pdf b/fig/quantiles/07_sdm_endemism_quantiles.pdf index 9ac7e852..2ddb27df 100644 Binary files a/fig/quantiles/07_sdm_endemism_quantiles.pdf and b/fig/quantiles/07_sdm_endemism_quantiles.pdf differ diff --git a/fig/raw/01_raw_sp-Setophaga_petechia.pdf b/fig/raw/01_raw_sp-Setophaga_petechia.pdf index ece6cdae..d04fba18 100644 Binary files a/fig/raw/01_raw_sp-Setophaga_petechia.pdf and b/fig/raw/01_raw_sp-Setophaga_petechia.pdf differ diff --git a/fig/raw/01_raw_sp-Setophaga_townsendi.pdf b/fig/raw/01_raw_sp-Setophaga_townsendi.pdf index 0bbc4a68..8eca57b4 100644 Binary files a/fig/raw/01_raw_sp-Setophaga_townsendi.pdf and b/fig/raw/01_raw_sp-Setophaga_townsendi.pdf differ diff --git a/fig/raw/02_raw_Y-rowcolsorted.png b/fig/raw/02_raw_Y-rowcolsorted.png index 75c38ce1..035899b4 100644 Binary files a/fig/raw/02_raw_Y-rowcolsorted.png and b/fig/raw/02_raw_Y-rowcolsorted.png differ diff --git a/fig/raw/03_raw_richness.pdf b/fig/raw/03_raw_richness.pdf index 91c71fff..d20f3dbe 100644 Binary files a/fig/raw/03_raw_richness.pdf and b/fig/raw/03_raw_richness.pdf differ diff --git a/fig/raw/04_raw_diversity-pielou.pdf b/fig/raw/04_raw_diversity-pielou.pdf index 37295adf..451f3bc1 100644 Binary files a/fig/raw/04_raw_diversity-pielou.pdf and b/fig/raw/04_raw_diversity-pielou.pdf differ diff --git a/fig/raw/04_raw_diversity-pielou2.pdf b/fig/raw/04_raw_diversity-pielou2.pdf index 3b176fa5..bbf084e6 100644 Binary files a/fig/raw/04_raw_diversity-pielou2.pdf and b/fig/raw/04_raw_diversity-pielou2.pdf differ diff --git a/fig/raw/05_raw_lcbd-transf.pdf b/fig/raw/05_raw_lcbd-transf.pdf index 98987679..246584db 100644 Binary files a/fig/raw/05_raw_lcbd-transf.pdf and b/fig/raw/05_raw_lcbd-transf.pdf differ diff --git a/fig/raw/05_raw_lcbd.pdf b/fig/raw/05_raw_lcbd.pdf index effaaf64..6c86035d 100644 Binary files a/fig/raw/05_raw_lcbd.pdf and b/fig/raw/05_raw_lcbd.pdf differ diff --git a/fig/raw/07_raw_endemism.pdf b/fig/raw/07_raw_endemism.pdf new file mode 100644 index 00000000..a1d7fad6 Binary files /dev/null and b/fig/raw/07_raw_endemism.pdf differ diff --git a/fig/sdm/01_sdm_sp-Setophaga_petechia.pdf b/fig/sdm/01_sdm_sp-Setophaga_petechia.pdf index 91418447..e26581ac 100644 Binary files a/fig/sdm/01_sdm_sp-Setophaga_petechia.pdf and b/fig/sdm/01_sdm_sp-Setophaga_petechia.pdf differ diff --git a/fig/sdm/01_sdm_sp-Setophaga_townsendi.pdf b/fig/sdm/01_sdm_sp-Setophaga_townsendi.pdf index d1665c3d..11fc6401 100644 Binary files a/fig/sdm/01_sdm_sp-Setophaga_townsendi.pdf and b/fig/sdm/01_sdm_sp-Setophaga_townsendi.pdf differ diff --git a/fig/sdm/02_sdm_Y-rowcolsorted.png b/fig/sdm/02_sdm_Y-rowcolsorted.png index 60a791dd..28d81c41 100644 Binary files a/fig/sdm/02_sdm_Y-rowcolsorted.png and b/fig/sdm/02_sdm_Y-rowcolsorted.png differ diff --git a/fig/sdm/03_sdm_richness.pdf b/fig/sdm/03_sdm_richness.pdf index d54a350d..77afee04 100644 Binary files a/fig/sdm/03_sdm_richness.pdf and b/fig/sdm/03_sdm_richness.pdf differ diff --git a/fig/sdm/04_sdm_diversity-pielou.pdf b/fig/sdm/04_sdm_diversity-pielou.pdf index b20a6fb5..d7eb0f05 100644 Binary files a/fig/sdm/04_sdm_diversity-pielou.pdf and b/fig/sdm/04_sdm_diversity-pielou.pdf differ diff --git a/fig/sdm/04_sdm_diversity-pielou2.pdf b/fig/sdm/04_sdm_diversity-pielou2.pdf index a6b7f110..c269da7f 100644 Binary files a/fig/sdm/04_sdm_diversity-pielou2.pdf and b/fig/sdm/04_sdm_diversity-pielou2.pdf differ diff --git a/fig/sdm/05_sdm_lcbd-transf.pdf b/fig/sdm/05_sdm_lcbd-transf.pdf index ce7b5da6..baedd781 100644 Binary files a/fig/sdm/05_sdm_lcbd-transf.pdf and b/fig/sdm/05_sdm_lcbd-transf.pdf differ diff --git a/fig/sdm/05_sdm_lcbd.pdf b/fig/sdm/05_sdm_lcbd.pdf index ddc4eccb..752af24c 100644 Binary files a/fig/sdm/05_sdm_lcbd.pdf and b/fig/sdm/05_sdm_lcbd.pdf differ diff --git a/fig/sdm/07_sdm_endemism.pdf b/fig/sdm/07_sdm_endemism.pdf index 41e8fa79..aabe620a 100644 Binary files a/fig/sdm/07_sdm_endemism.pdf and b/fig/sdm/07_sdm_endemism.pdf differ diff --git a/src/00b_data_landcover-copernicus.jl b/src/00b_data_landcover-copernicus.jl index 8495fe2b..e9c9ad85 100644 --- a/src/00b_data_landcover-copernicus.jl +++ b/src/00b_data_landcover-copernicus.jl @@ -5,52 +5,20 @@ using Distributed ## Conditional arguments # save_figures = true # should figures be overwritten (optional) -## Bash commands to download & prepare data, to run in terminal in ../landcover/ -#= -cd ~/github/landcover/ -# Download Copernicus land cover data, many downloads to cover whole extent -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W160N80_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W160N80.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W160N60_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W160N60.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W160N40_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W160N40.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W140N80_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W140N80.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W140N60_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W140N60.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W140N40_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W140N40.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W120N80_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W120N80.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W120N60_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W120N60.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W120N40_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W120N40.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W100N80_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W100N80.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W100N60_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W100N60.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W100N40_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W100N40.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W080N80_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W080N80.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W080N60_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W080N60.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W080N40_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W080N40.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W060N80_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W060N80.zip -wget https://s3-eu-west-1.amazonaws.com/vito-downloads/ZIPfiles/W060N60_ProbaV_LC100_epoch2015_global_v2.0.1_products_EPSG-4326.zip -O landcover_W060N60.zip - -# Unzip files in separate directories -for i in *.zip; do unzip "$i" -d "${i%%.zip}"; done - -# Delete zip files -rm *.zip - -# Create repositories if needed -mkdir coverfraction -(cd coverfraction; mkdir bare crops grass moss shrub snow tree urban water-permanent water-seasonal) - -# Batch commands for each land cover variable -for i in $(ls coverfraction/) -do - # Copy landcover data in 1 folder per variable - for j in landcover*; do cp "$j"/*"$i"-coverfraction-layer* coverfraction/"$i"/; done - # Set resolution to 10 arc-minutes & merge all layers in one - gdalwarp -tr 0.166667 0.166667 -r average coverfraction/"$i"/W*.tif ../BioClim/assets/landcover/lc_"$i"_10m.tif - # Set resolution to 5 arc-minutes & merge all layers in one - gdalwarp -tr 0.0833333 0.0833333 -r average coverfraction/"$i"/W*.tif ../BioClim/assets/landcover/lc_"$i"-5m.tif -done -=# - -## Test landcover variables +## Run bash scripts to download & coarsen landcover data from Zenodo (if files missing) +lc_files = readdir("assets/landcover/") +# Check if landcover files are missing +if any(startswith.(lc_files, r"^lc_")) + # Check if full resolution files are missing + if any(startswith.(lc_files, r"^landcover_copernicus_global_100m")) + # Download full resolution files + run(`bash src/bin/landcover_download.sh`) + end + # Coarsen resolution + run(`bash src/bin/landcover_coarsen.sh`) +end +## Test landcover variables # Define coordinates range lon_range = (-145.0, -50.0) lat_range = (20.0, 75.0) diff --git a/src/01_distributions.jl b/src/01_distributions.jl index 37700bc9..95085b9d 100644 --- a/src/01_distributions.jl +++ b/src/01_distributions.jl @@ -40,19 +40,12 @@ lat_range_obs = extrema(df.latitude) ## Get environmental data (with different training resolutions) # WorldClim data -@time wc_vars = map(x -> worldclim(x, resolution = "10")[lon_range, lat_range], [1,12]); +wc_vars = map(x -> worldclim(x, resolution = "10")[lon_range, lat_range], [1,12]); # Landcover data -@time lc_vars = pmap(x -> landcover(x, resolution = "10")[lon_range, lat_range], 1:10); +lc_vars = map(x -> landcover(x, resolution = "10")[lon_range, lat_range], 1:10); # Training data with finer resolution -if outcome == "raw" - # Set resolution to 10 # CAN'T BE FINER FOR RAW ANALYSES FOR NOW - @time wc_vars_train = map(x -> worldclim(x, resolution = "10")[lon_range_obs, lat_range_obs], [1,12]); - @time lc_vars_train = map(x -> landcover(x, resolution = "10")[lon_range, lat_range], 1:10) -elseif outcome == "sdm" - # Set resolution to 5 - @time wc_vars_train = map(x -> worldclim(x, resolution = "5")[lon_range_obs, lat_range_obs], [1,12]); - @time lc_vars_train = map(x -> landcover(x, resolution = "5")[lon_range, lat_range], 1:10) -end +wc_vars_train = map(x -> worldclim(x, resolution = "5")[lon_range_obs, lat_range_obs], [1,12]); +lc_vars_train = map(x -> landcover(x, resolution = "5")[lon_range_obs, lat_range_obs], 1:10); # Combine environmental data env_vars = vcat(wc_vars, lc_vars) @@ -70,7 +63,7 @@ if (@isdefined create_distributions) && create_distributions == true # @time distributions = @showprogress pmap(x -> presence_absence(x, env_vars_train[1], full_range = true, binary = false), warblers) elseif outcome == "sdm" # Get sdm distributions (with different training resolutions) - @time distributions = @showprogress pmap(x -> bioclim(x, env_vars, train_vars = env_vars_train), warblers); + @time distributions = @showprogress pmap(x -> bioclim(x, env_vars, training_layers = env_vars_train), warblers); end end diff --git a/src/06_relationship_lcbd-richness.jl b/src/06_relationship_lcbd-richness.jl index 50194c33..de227e25 100644 --- a/src/06_relationship_lcbd-richness.jl +++ b/src/06_relationship_lcbd-richness.jl @@ -69,7 +69,7 @@ relationtr_plot = scatter(vec(rel_richness[1]), vec(raw.LCBD[2].grid), grid=:none) scatter!(relationtr_plot, vec(rel_richness[2]), vec(sdm.LCBD[1].grid), markersize = 3, c = :orange, msw = 0, label = "SDM predictions") -relationdbtr_plot = scatter(vec(rel_richness[1]), vec(raw.LCBD[3].grid), +relationdbtr_plot = scatter(vec(rel_richness[1]), vec(raw.LCBD[2].grid), markersize = 2, c = :skyblue, msw = 0, @@ -77,7 +77,7 @@ relationdbtr_plot = scatter(vec(rel_richness[1]), vec(raw.LCBD[3].grid), legend = :topright, xlabel = "Species richness (\\alpha\\/\\gamma)", ylabel = "LCBD (relative to maximum)", grid=:none) -scatter!(relationdbtr_plot, vec(rel_richness[2]), vec(sdm.LCBD[3].grid), +scatter!(relationdbtr_plot, vec(rel_richness[2]), vec(sdm.LCBD[2].grid), markersize = 3, c = :orange, msw = 0, label = "SDM predictions") ## Save result diff --git a/src/bin/landcover_coarsen.sh b/src/bin/landcover_coarsen.sh new file mode 100755 index 00000000..1170cb8b --- /dev/null +++ b/src/bin/landcover_coarsen.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +## Bash commands to download & prepare landcover data from Zenodo +# Just run following in bash terminal: +# bash src/bin/landcover_coarsen.sh + +# Make sure file is executable. If not (e.g. Permission denied error), run: +# chmod +x src/bin/landcover_coarsen.sh + +#### + +## Go to landcover directory +cd assets/landcover/ + +## Coarsen resolution +# BEWARE, can be very long and will take 10 cores, took 30 min and ~ 16GB of RAM in my case +landcover_variables=(bare crops grass moss shrub snow tree urban water-permanent water-seasonal) +for i in "${landcover_variables[@]}" +do + # Set resolution to 10 arc-minutes + gdalwarp -tr 0.166667 0.166667 -r average --config GDAL_CACHEMAX 500 -wm 500 -multi landcover_copernicus_global_100m_v2.0.2_"$i".tif lc_"$i"_10m.tif & +done +wait +echo "10 arc-minutes - All done" + +for i in "${landcover_variables[@]}" +do + # Set resolution to 5 arc-minutes + gdalwarp -tr 0.0833333 0.0833333 -r average --config GDAL_CACHEMAX 500 -wm 500 -multi landcover_copernicus_global_100m_v2.0.2_"$i".tif lc_"$i"_5m.tif & +done +wait +echo "5 arc-minutes - All done" diff --git a/src/bin/landcover_download.sh b/src/bin/landcover_download.sh new file mode 100755 index 00000000..84ced61a --- /dev/null +++ b/src/bin/landcover_download.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +## Bash commands to download & prepare landcover data from Zenodo +# Just run following in bash terminal: +# bash src/bin/landcover_download.sh + +# Make sure file is executable. If not (e.g. Permission denied error), run: +# chmod +x src/bin/landcover_download.sh + +#### + +## Go to landcover directory +cd assets/landcover/ + +## Download Copernicus global land cover data from Zenodo +# BEWARE, can be very long, 25 GB of data in total +# Launching downloads in parallel, 1 core/variable = 10 cores at most, not much RAM needed +landcover_variables=(bare crops grass moss shrub snow tree urban water-permanent water-seasonal) +for i in "${landcover_variables[@]}" +do + wget https://zenodo.org/record/3243509/files/ProbaV_LC100_epoch2015_global_v2.0.2_"$i"-coverfraction-layer_EPSG-4326.tif -O landcover_copernicus_global_100m_v2.0.2_"$i".tif & +done +wait +echo "Downloads - All done" +rm wget-log* diff --git a/src/lib/bioclim.jl b/src/lib/bioclim.jl index 5a2edb2f..f5379daf 100644 --- a/src/lib/bioclim.jl +++ b/src/lib/bioclim.jl @@ -2,51 +2,48 @@ # import SimpleSDMLayers: bioclim -# 1st part of BIOCLIM model for single environmental variables -function bioclim_singlevar(occ::Union{GBIFRecords,DataFrame}, pred_vars::SimpleSDMLayer; train_vars::SimpleSDMLayer=pred_vars) +# Small internal function for BIOCLIM. Ensures values are equal for both tails and between 0-1 +bcscore(x) = isnan(x) ? NaN : (x > 0.5 ? 2*(1-x) : 2x) + +# 1st part of BIOCLIM model for single environmental layer +function bioclim_layer(occ::Union{G,D}, layer::T; training_layer::T=layer) where {T <: SimpleSDMLayer, D <: DataFrame, G <: GBIFRecords} # occ: occurences of a single species as a DataFrame with latitude and longitude columns - # pred_vars: environmental variables used for prediction - # train_vars: optional, training environmental variables, can use a different resolution + # layer: layer of environmental variables used for prediction + # training_layer: optional, training environmental layer, can use a different resolution # Get observed environmental values (training values) - observed_values = train_vars[occ] - # Create ECDF function to extract quantile value - qfinder = ecdf(observed_values) - # Create empty array for local quantile values - lq = zeros(Float64, size(pred_vars)) - # Loop for all sites (prediction values) - for i in eachindex(pred_vars.grid) - if isnan(pred_vars.grid[i]) - # Set value to NaN if env value is already NaN - local_quantile = NaN - else - # Get quantile rank if not NaN - local_quantile = qfinder(pred_vars.grid[i]) - # Replace values greater than 0.5 to set both tails equal - if local_quantile > 0.5 - local_quantile = 1.0-local_quantile - end - # Scale back between 0 and 1 - local_quantile = 2.0 * local_quantile - end - # Collect quantile values - lq[i] = local_quantile + obs = training_layer[occ] + filter!(!isnan, obs) + # Create empty layer for predictions + pred = similar(layer) + # Make predictions + if length(unique(obs)) <= 1 # special case if 1 unique value only + # If 1 unique value only, set 1.0 as prediction for all sites with this value + pred.grid = replace(x -> x == obs[1] ? 1.0 : 0.0, layer.grid) + else + # Create ECDF function to extract quantile values + qfinder = ecdf(obs) + # Get prediction score + pred.grid = bcscore.(qfinder.(layer.grid)) + end + # Restore NaNs from original layer + for idx in findall(isnan, layer.grid) + pred.grid[idx] = NaN end - # Convert to SimpleSDMLayer, with same coordinates as prediction layer - prediction = SimpleSDMResponse(lq, pred_vars.left, pred_vars.right, pred_vars.bottom, pred_vars.top) + return pred end -# Complete BIOCLIM model on all environmental variables, including 1st part function -function bioclim(occ, pred_vars; train_vars=pred_vars, binary=true, with_threshold=false, threshold::Float64=0.05) +# Complete BIOCLIM model on all environmental layers, including 1st part function +function bioclim(occ, layers; training_layers=layers, binary=true, with_threshold=false, threshold::Float64=0.05) # occ: occurences of a single species as a DataFrame with latitude and longitude columns - # pred_vars: environmental variables used for prediction - # train_vars: optional, training environmental variables, can use a different resolution + # layers: layers of environmental variables used for prediction + # training_layers: optional, training environmental layers, can use a different resolution # binary: optional, convert result to binary presence-absence values # with_threshold: optional, apply threshold to remove lower predictions # threshold: optional, set threshold to use (default = 0.05) # Apply 1st part of BIOCLIM on each environmental variable - predictions = [bioclim_singlevar(occ, pred_vars[i], train_vars = train_vars[i]) for i in 1:length(pred_vars)]; + predictions = [bioclim_layer(occ, layers[i], training_layer = training_layers[i]) for i in eachindex(layers)]; # Reduce to single layer with minimum values prediction = reduce(minimum, predictions); # Apply threshold (if requested, default is false) diff --git a/src/lib/landcover.jl b/src/lib/landcover.jl index 6d28525b..b8151150 100644 --- a/src/lib/landcover.jl +++ b/src/lib/landcover.jl @@ -23,10 +23,19 @@ function landcover(layers::Vector{Int64}; resolution::AbstractString="10", path: landcover_mat = [permutedims(v[:,end:-1:1]) for v in values_int] # Replace 255 (default no data values) by NaN [replace!(l, 255 => NaN) for l in landcover_mat] - # Add additionnal line of NaNs down South (coordinates prime did not exactly match) - landcover_mat = [vcat(fill(NaN, (1, size(l, 2))), l) for l in landcover_mat] - # Convert to SDMLayers - landcover_layers = SimpleSDMPredictor.(landcover_mat, -160.0, -40.0, 20.0, 80.0) + + # Fill missing latitudes with NaNs (latitude extent is only (-60,80) for landcover data) + nlat, nlon = size(landcover_mat[1]) + slim, nlim = abs(-60), 80 + res = Int64(nlat/(nlim+slim)) + south_nans = fill(NaN, ((90-slim)*res, nlon)) + north_nans = fill(NaN, ((90-nlim)*res, nlon)) + landcover_grids = [vcat(south_nans, l, north_nans) for l in landcover_mat] + + # Convert to SimpleSDMLayers + landcover_layers = SimpleSDMPredictor.(landcover_grids, -180.0, 180.0, -90.0, 90.0) + + return landcover_layers end """ diff --git a/src/lib/presence-absence.jl b/src/lib/presence-absence.jl index 98d9691e..5d3f8df9 100644 --- a/src/lib/presence-absence.jl +++ b/src/lib/presence-absence.jl @@ -7,6 +7,9 @@ function presence_absence(species::DataFrame, copy_layer::SimpleSDMLayer; full_r # full_range: return species full range, even outside range of interest # binary: convert to binary presence-absence values per site + # Extract coordinates + lon_range = (copy_layer.left, copy_layer.right) + lat_range = (copy_layer.bottom, copy_layer.top) # Filter observations to range of interest (default) if full_range == false filter!(x -> lon_range[1] < x[:longitude] < lon_range[2], species) diff --git a/src/master.jl b/src/master.jl index 968c4ad5..c165de44 100644 --- a/src/master.jl +++ b/src/master.jl @@ -1,6 +1,4 @@ #### Master file - Raw observations -## NOT TESTED - import Pkg; Pkg.activate(".") using Distributed @time @everywhere include("src/required.jl") @@ -16,7 +14,7 @@ using Distributed ## 0b. Landcover data preparation (if needed) # save_figures = true # should figures be overwritten (optional) -@time include("00a_data_ebd-preparation.jl") +@time include("00b_data_landcover-copernicus.jl") #### Analyses @@ -44,3 +42,6 @@ outcome = "raw" # desired outcome (required) ## 6. Run LCBD-richness relationship analysis @time include("06_relationship_lcbd-richness.jl") + +## 7. Run endemism analysis +@time incluce("07_endemism.jl")