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
Why “Analysis to Impact”?
You’ve done your analysis….
You’ve crunched the data….
Footnote
And your results are amazing!
Footnote
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
To make an impact, your work needs to…
Be accessible to the relevant people.
Be useful.
(Most people don’t know how to use EE or how to interpret geographic datasets.)
Footnote
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):
Footnote
Impact in Education (formal)
Footnote
Impact in Advocacy
Footnote
Impact in decision making
Footnote
Ok, so what can I do with my EE analysis results?
Sharing your results
1. Sharing through Earth Engine (for other EE users)
2. Exporting data and sharing through other tools
Footnote
Earth Engine UI API
| |
|
|
|
|
|
|---|---|---|---|---|---|
| Chart |
Image |
Earth Engine Asset |
Table |
Video |
Map |
Exporting images as they appear in the Code Editor
Export Video
Export Video
Google Confidential and Proprietary
Google Confidential and Proprietary
Google Confidential and Proprietary
Google Confidential and Proprietary
Video Export
All Sentinel 2 images over Sydney
ffmpeg \
-i input.mp4 \
output.gif
ffmpeg \
-i timelapse.mp4 \
-f image2 \
-start_number 1984 \
image-%03d.jpg
Google Confidential and Proprietary
Export Map Tiles
Tile Export
*Unless you choose not to write public tiles (writePublicTiles=false), in which case the tiles inherit the bucket’s default object ACL
Footnote
15/10367/14681
15/10367/14682
15/10368/14681
15/10368/14682
Export Map Tiles
View exported map
Tile Export
Table Export
Footnote
Chart Export
Chart Export
Chart Export
CSV Export
SVG Export
PNG
Now What?
Publishing Tools
Google Has some options
Lots of 3rd party options too!
Maps
Earth
Fusion Tables
My Maps
Street View
Tour Builder
Google Tools for publishing
Google Maps API
Google Earth
Google Crisis Map - easy map mashups
Fusion Tables - table & kml publishing/mapping
Tour Builder - storytelling!
App Engine - host complex interactive sites
Google Maps APIs
https://developers.google.com/maps/
New Earth:
Old/Classic Earth:
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):
Google Fusion Tables
AppEngine
Other Tools - 3rd Party, etc.
Many other tools out there… here are a few we’ve seen used with EE output:
Leaflet
CartoDB , MapBox , ArcGIS Online
Github
QGIS , ESRI/ArcGIS
Global Forest Watch
AppEngine hosted
Google Maps API
Exported raster tiles
Etc.
High Impact!
Map of Life
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
Hansen Forest Data Explorer
http:// earthenginepartners.appspot.com/science-2013-global-forest
Google Crisis Map
AppEngine hosted
Tile Export
Code Time! Let’s try it...
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
});
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'
});
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>
Add vector data: KML file
var LanduseSamples = new google.maps.KmlLayer({
url:' https://storage.googleapis.com/ee-demos/eeus/LanduseFeaturesee_export.kml ',
map: map
});
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);
Hands On
Footnote
Build short hands-on section around Nick’s example in email - see email with attachment “overlay_example.html”
Need to be very simple & fast. Only show code snippets for important bits.
Just show code snippets (no hands-on):
Thank you