1 of 70

From Analysis to Impact

Publishing and storytelling with your Earth Engine results

Earth Engine User Summit 2017�12-14 June 2017

Christiaan Adams - Google Earth & Earth Outreach Team�Chris Herwig - Google Earth Engine

2 of 70

Why “Analysis to Impact”?

3 of 70

You’ve done your analysis….

You’ve crunched the data….

Footnote

4 of 70

And your results are amazing!

Footnote

5 of 70

But… now what?

Does it make a difference? Does anyone care?

Will the right people find it and be able to use it?

How can your work create real impact?

Footnote

6 of 70

7 of 70

To make an impact, your work needs to…

Be accessible to the relevant people.

  • be easy to find
  • be easy to understand
  • be easy to use

Be useful.

  • provide good information (& locally relevant)
  • provide insights backed up by the data

(Most people don’t know how to use EE or how to interpret geographic datasets.)

Footnote

8 of 70

What kind of impact do you want to have?

Who are the right people?

Who is your audience?

What do you want them to do?

What is your goal?

Some high-level goals (general buckets):

  • Education (formal/EDU or informal/public)
  • Advocacy
  • Decision Making

Footnote

9 of 70

Impact in Education (formal)

  • Academic Publication
  • Data viewing & sharing
  • Data Exploration
  • Interactive data manipulation (query, filter, tweak parameters, etc.)

Footnote

10 of 70

Impact in Advocacy

  • Data viewing, sharing & exploration
  • Academic Publication
  • Interactive data manipulation (query, filter, tweak parameters, etc.)
  • Media attention
  • Broad-based accessibility
  • Engaging Visuals

Footnote

11 of 70

Impact in decision making

  • Academic Publication
  • Data Exploration
  • Interactive data manipulation (query, filter, tweak parameters, etc.)
  • Media attention

Footnote

12 of 70

Ok, so what can I do with my EE analysis results?

13 of 70

Sharing your results

1. Sharing through Earth Engine (for other EE users)

2. Exporting data and sharing through other tools

Footnote

14 of 70

15 of 70

16 of 70

17 of 70

18 of 70

Earth Engine UI API

19 of 70

Chart

Image

Earth Engine Asset

Table

Video

Map

20 of 70

Exporting images as they appear in the Code Editor

  • Map.addLayer(image, visParams);
  • The image.visualize() method converts an image into an 8-bit RGB image for display or export.
  • Image displayed in code editor is EPSG:3857.
  • See visualization parameters in docs .

21 of 70

22 of 70

23 of 70

Export Video

24 of 70

Export Video

25 of 70

Google Confidential and Proprietary

26 of 70

Google Confidential and Proprietary

27 of 70

Google Confidential and Proprietary

28 of 70

29 of 70

Google Confidential and Proprietary

30 of 70

Video Export

  • Export ordered image collections as video, where frames are defined by images in the collection
  • Specify frame rate, scale (or) dimensions.
  • MP4.
  • Images in ImageCollection must be 8-bit RGB images.
  • Can take a significant amount of time to complete.
  • Possible to use third-party video editing software to add labels/annotations after video exported from Earth Engine

31 of 70

All Sentinel 2 images over Sydney

32 of 70

ffmpeg \

-i input.mp4 \

output.gif

33 of 70

ffmpeg \

-i timelapse.mp4 \

-f image2 \

-start_number 1984 \

image-%03d.jpg

34 of 70

Google Confidential and Proprietary

35 of 70

Export Map Tiles

36 of 70

Tile Export

  • Export.map.toCloudStorage() exports map tiles suitable for display using the Google Maps API.
  • Exported image should have either 1 or 3-bands.
  • Output Map is
    • publicly viewable*
    • can be embedded on other pages
    • does not require the viewer to be a registered Earth Engine user.
  • User exporting must be writer or owner of bucket.

*Unless you choose not to write public tiles (writePublicTiles=false), in which case the tiles inherit the bucket’s default object ACL

Footnote

37 of 70

15/10367/14681

15/10367/14682

15/10368/14681

15/10368/14682

38 of 70

Export Map Tiles

39 of 70

View exported map

40 of 70

Tile Export

  • Hansen Forest data
  • (Tile export, CrisisMap)

41 of 70

Table Export

Footnote

42 of 70

Chart Export

43 of 70

Chart Export

44 of 70

Chart Export

45 of 70

CSV Export

46 of 70

SVG Export

47 of 70

PNG

48 of 70

Now What?

49 of 70

Publishing Tools

Google Has some options

Lots of 3rd party options too!

Maps

Earth

Fusion Tables

My Maps

Street View

Tour Builder

50 of 70

Google Tools for publishing

Google Maps API

  • easy to use maps on your website
  • fully customizable, interactive maps
  • overlay raster & vector data

Google Earth

  • immersive 3D environment
  • overlay raster & vector datasets
  • rich storytelling controls

Google Crisis Map - easy map mashups

Fusion Tables - table & kml publishing/mapping

Tour Builder - storytelling!

App Engine - host complex interactive sites

51 of 70

Google Maps APIs

https://developers.google.com/maps/

  • easy to use maps on your website + mobile
  • fully customizable, interactive maps
  • overlay raster & vector data

52 of 70

New Earth:

  • https://earth.google.com/web/
  • run directly in Chrome on web or in Android
  • support for most common KML elements, including raster & vector layers
  • new storytelling tools & techniques (eg: Voyager)

Old/Classic Earth:

  • https://earth.google.com/
  • download & install desktop version
  • full KML support, including time, touring, etc.
  • rich storytelling and powerful data exploration possibilities

53 of 70

Google Crisis Map

Example - Public Alerts data

https://www.google.org/crisismap

Creat your own - Google hosted

http://www.google.org/crisismap/a/.maps

Create your own - open source, AppEngine

https://github.com/google/googlecrisismap

Example (uses old version of crisismap):

http://earthenginepartners.appspot.com/

science-2013-global-forest

54 of 70

Google Fusion Tables

  • Host and Publish vector datasets
  • Powerful mapping and charting tools
  • Google Maps API integration
  • SQL-like API
  • basic Spatial Queries
  • Integrated into Google Drive:

55 of 70

AppEngine

  • develop & host scalable web applications
  • no need to worry about infrastructure or scaling
  • powerful web development components & APIs

56 of 70

Other Tools - 3rd Party, etc.

Many other tools out there… here are a few we’ve seen used with EE output:

Leaflet

  • publish online maps

CartoDB , MapBox , ArcGIS Online

  • data hosting & mapping

Github

  • geojson mapping

QGIS , ESRI/ArcGIS

  • desktop analysis & cartography tools

57 of 70

Global Forest Watch

www.globalforestwatch.org

AppEngine hosted

Google Maps API

Exported raster tiles

Etc.

High Impact!

58 of 70

Map of Life

https://mol.org/

AppEngine

Maps API

59 of 70

Global Surface Water Explorer

global-surface-water.appspot.com

AppEngine

Maps API

Raster Tile Export

Dynamic EE queries

Multi-purpose:

- Paper publication

- Public exploration via web & app

60 of 70

Hansen Forest Data Explorer

http:// earthenginepartners.appspot.com/science-2013-global-forest

Google Crisis Map

AppEngine hosted

Tile Export

61 of 70

Code Time! Let’s try it...

62 of 70

Export Raster data to Map Tiles

// NDVI over MOD09GA product (MODIS Annual 2012)

var img = ee.Image('MOD09GA/MOD09GA_005_2012_03_09');

var ndvi = img.normalizedDifference (['sur_refl_b02', 'sur_refl_b01']);

var palette = ['FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718',

'74A901', '66A000', '529400', '3E8601', '207401', '056201',

'004C00', '023B01', '012E01', '011D01', '011301'];

Map.addLayer(img.select(['sur_refl_b01', 'sur_refl_b04', 'sur_refl_b03']),

{gain: '0.1, 0.1, 0.1'}, 'MODIS bands 1/4/3', false);

Map.addLayer(ndvi, {min: 0, max: 1, palette: palette}, 'NDVI');

// Export to tiles on GCS

var boundingPolygon = ee.Geometry.Polygon (

[[[-123.153991, 38.358887],[-123.153991, 36.710265],

[-120.844116, 36.710265],[-120.844116, 38.358887]]], null, false);

Map.addLayer(boundingPolygon,'','Bounding Polygon',false);

Map.centerObject(boundingPolygon);

Export.map.toCloudStorage({

image: ndvi.visualize({min: 0, max: 1, palette: palette}),

description: 'NDVI_2012',

bucket: 'ee-demos',

path: 'eeus/tiles/',

fileFormat: 'auto',

writePublicTiles: true,

maxZoom: 14,

minZoom: 0,

region: boundingPolygon

});

63 of 70

Export Vector data to KML

// Make a collection of points.

var features = ee.FeatureCollection([

ee.Feature(ee.Geometry.Point(-122.033516, 37.396063), {name: 'Commercial'}),

ee.Feature(ee.Geometry.Point(-122.048534, 37.346612), {name: 'Residential'}),

ee.Feature(ee.Geometry.Point(-122.121001, 37.275183), {name: 'Forest'}),

ee.Feature(ee.Geometry.Point(-121.874045, 37.503689), {name: 'Grass'}),

ee.Feature(ee.Geometry.Point(-121.978049, 37.458729), {name: 'Wetland'})

]);

// Add it to the Map

Map.addLayer(features);

Map.centerObject(features);

// Export to KML

Export.table.toDrive({

collection: features,

description:'LanduseFeatures',

fileFormat: 'KML'

});

64 of 70

Google Maps API - base page (copy me)

<!DOCTYPE html>

<html>

<head>

<title>Earth Engine Map</title>

<meta name="viewport" content="initial-scale=1.0"><meta charset="utf-8">

<style>

#map {height: 600px; width: 800px;}

html, body {height: 100%; margin: 0; padding: 0;}

</style>

</head>

<body>

<h1>My Earth Engine Data!</h1>

<div id="map"></div>

<script>

var map;

function initMap() {

map = new google.maps.Map (document.getElementById('map'), {

center: {lat: 37.4036, lng: -122.0325},

zoom: 11,

});

// ========= ADD SCRIPTS HERE =========

}

</script>

<script src="https://maps.googleapis.com/maps/api/js ?callback=initMap" async defer></script>

</body>

</html>

65 of 70

66 of 70

Add vector data: KML file

var LanduseSamples = new google.maps.KmlLayer({

url:' https://storage.googleapis.com/ee-demos/eeus/LanduseFeaturesee_export.kml ',

map: map

});

67 of 70

Add raster data: map tiles

var minZoom = 0;

var maxZoom = 14;

var tilePrefix = 'https:\/\/storage.googleapis.com\/ee-demos\/eeus\/tiles\/NDVI2012\/';

var tileSuffix = '';

var overlayMapType = new google.maps.ImageMapType ({

getTileUrl: function(coord, zoom) {

if (zoom < minZoom || zoom > maxZoom) {

return null;

}

var numTiles = 1 << zoom;

var x = ((coord.x % numTiles) + numTiles) % numTiles;

return [tilePrefix, zoom, '/', x, '/', coord.y, tileSuffix].join('');

},

tileSize: new google.maps.Size(256, 256),

});

map.overlayMapTypes.push(overlayMapType);

68 of 70

69 of 70

Hands On

Footnote

Build short hands-on section around Nick’s example in email - see email with attachment “overlay_example.html”

  • Export Raster Tiles
  • Export Vector table & Import to FT
  • Setup sample Maps API page
  • Add Raster & Vector layers

Need to be very simple & fast. Only show code snippets for important bits.

Just show code snippets (no hands-on):

  • UI elements (maps with knobs - show code)
  • Somehting for App Engine??
  • Export GeoTiff => convert to Superoverlay => vis on Earth

70 of 70

Thank you

Create a Mobile Website
View Site in Mobile | Classic
Share by: