Skip to content

Island Biogeography

Introduction

This tutorial introduces a general workflow to chart islands by area, distance, and recent geological history based on digital elevation models (DEM).

We use the California Channel Islands as a case to develop the model. Your script should produce a map like the one shown below.

Link to app

In addition, your script should produce a chart like the one shown below (but without the “demo” tag).

Island chart


Define key terms

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//  Title: wk10_island_biogeography.js 
//  Author: Jeff Howarth 
//  Date: Nov 15, 2023

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//  Module

var palettes = require('users/gena/packages:palettes');

//  Key variable

var ice_age_sea_level = -140;  // meters

//  A. Wenner and D. Johnson, "Land Vertebrates on the California Islands: 
//  Sweepstakes or Bridges?" In The California Islands: Proceedings of a
//  Multidisciplinary Symposium. Edited by D Power. SBMNH: Santa Barbara.
//  1980: 497-530.

Load and display bathymetry

// -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//  ACT 1: ICE
// -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

// --------------------------------------------------------------------
//  1.1. Load and display bathymetry 
// --------------------------------------------------------------------

//  Load image collection from "projects/sat-io/open-datasets/gebco/gebco_grid"
//  Reduce collection to an image of median values.
//  Clip the image by the study region.

var gebco_grid  
;

//  Define viz parameters. 

var bath_viz = {
  min: -3000.0,
  max: 3000.0,
  palette: palettes.colorbrewer.Blues[9].reverse(),
};

//  Set up map. 

Map.centerObject(geometry);
Map.setOptions('satellite');

//  Display as map layer. 
//  Apply viz parameters. 
//  Name the layer "1.1. Bathymetry".
//  Display by default. 

Make land binary

// --------------------------------------------------------------------
//  1.2. Make and display land binary for Pleistocene. 
// --------------------------------------------------------------------

//  Make land binary for Pleistocene. 
//  Rename "land".

var land_pleistocene 
;

//  Display as map layer.
//  Use "#D3D3D3" for palette. 
//  Name the layer "1.2. Pleistocene Land"

Make islands

// --------------------------------------------------------------------
//  1.3. Make and display Pleistocene islands. 
// --------------------------------------------------------------------

//  Write a function to make islands from land binary. 

var makeIslands ;

//  Apply the function for Pleistocene land binary. 

var islands_pleistocene 
;

//  Display as map layer. 
//  Name the layer "1.3. Pleistocene islands"

Select mainland

// --------------------------------------------------------------------
//  1.4. Select Pleistocene mainland
// --------------------------------------------------------------------

//  Write a function to select mainland from "islands". 

var selectMainland 
;

//  Apply the function for Pleistocene islands. 

var mainland_target 
;

//  Display as map layer. 
//  Use color: "Yellow"
//  Name the layer "1.4. Mainland Pleistocene"

Find minimum distance

// --------------------------------------------------------------------
//  1.5. Find minimum distance between each island and the mainland
// --------------------------------------------------------------------

//  Write a function to find the minimum distance from the mainland for an island.

var islandDistance 
;

//  Apply the function over all Pleistocene islands. 
//  Remove the mainland from the collection.

var distance_pleistocene 
;

//  CHECK 01: How many islands are in your final result for Act I? 

print(
  "CHECK 01"
  );

Act II: Current conditions

// -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//  ACT 2: NOW
// -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

// --------------------------------------------------------------------
//  2.1 Make land binary
// --------------------------------------------------------------------

// Load dataset 

// var dem = ee.Image('MERIT/DEM/v1_0_3')
//     .clip(geometry)
//     ;

// Make land binary (use 1 m above sea level to define coasts)
// Multiply binary by 2
// Rename band "land"

var land_now ;

// Add layer to map
// Use "#242E33" for palette.
// Name the map layer  "2.1. Land Now"



// --------------------------------------------------------------------
//  2.2 Create modern island objects
// --------------------------------------------------------------------

//  Make islands for current conditions
//  Filter for islands where "area_sq_km" is greater than 0.1.

var islands_now 
;

// CHECK 2: How many island objects are in the collection?


// Add layer to map.
// Name the layer "2.2. Islands Now objects"


// --------------------------------------------------------------------
//  2.3. Distinguish mainland from islands
// --------------------------------------------------------------------

// Select the mainland from the current islands. 

var mainland_target 
;

//  Display mainland on the map as a layer
//  Use "Yellow" color.
//  Name the layer "2.3. Mainland Now"



// --------------------------------------------------------------------
//  2.4. Find minimum distance between each island and the mainland
// --------------------------------------------------------------------

//  Calculate the distance of each island from the mainland.
//  Remove the mainland from the collection. 

var islands_distance 
  ;

//  CHECK 3: How many islands are in the collection?


//  Display result as a map layer.
//  Name the layer "2.4. Islands with area and distance"

Identify oceanic islands

// -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//  ACT 3: ACROSS TIMES
// -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

// --------------------------------------------------------------------
//  3.1. Identify Oceanic Islands
// --------------------------------------------------------------------

//  Convert Pleistocene islands to image. 

var pleistocene_islands_image 
;

//  Identify current islands that overlap pleistocene islands. 

var now_and_then 
;

//  Isolate oceanic islands. 

var islands_oceanic
;

Identify and tag continental islands

// --------------------------------------------------------------------
//  3.2. Identify and tag continental islands 
// --------------------------------------------------------------------

//  Write a function to tag continental islands. 

var tagContinental
;

// Create an continental islands feature collection and apply the function. 

var islands_continental
;


Combine islands with history classes

// --------------------------------------------------------------------
//  3.3. Combine islands with history classes. 
// --------------------------------------------------------------------

//  Merge all the islands into a single collection.

var all_islands 
;

//  Display as map layer.
//  Name layer "3.3. Islands with history"

Make area-distance chart

// --------------------------------------------------------------------
//  3.4. Make area - distance chart
// --------------------------------------------------------------------

// Define the chart and print it to the console.

var chart = ui.Chart.feature.groups(
  {
    features: all_islands.sort("land"), 
    xProperty: 'distance_km', 
    yProperty: 'area_sq_km',
    seriesProperty: 'land'

  })
  .setChartType('ScatterChart')
  .setOptions(
    {
      title: 'Area vs Distance',
      hAxis: {
        title: 'km',
        titleTextStyle: {italic: false, bold: true}
      },
      vAxis: {
        title: 'square km',
        titleTextStyle: {italic: false, bold: true}
      },
      pointSize: 10,
      colors: ['#A8A422', "#D3D3D3", "#227BA8"],
      position: 'bottom-left'

    }
  )

;

print(chart);

Make a highlighter layer

// --------------------------------------------------------------------
//  3.5. Highlight Islands
// --------------------------------------------------------------------

//  Define target properties

// var target_property = "area_sq_km";
// // var target_property = "distance_km";

//  Define target value

var target_value = ee.Number(-9999);

//  Make target layer.

var target 
;

//  Display as map layer. 
//  Use color "Orchid".
//  Name the layer "3.5. Selected Feature"

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 4.0 International License.