"use strict"; var datastorm = datastorm || {}; datastorm.forecast = (function(){ var my = {}; var width = document.body.clientWidth; var height = document.body.clientHeight; var config; var locations = []; var startTs; // start time of animation. Used to calculate elapsed time var elapsedTs; var durationTs = 240000; // full length of animation var animationActive = true; var sampleScale = d3.scale.linear().domain([0, durationTs]).range([0, 35]); var colour = d3.scale.linear().domain([0, 22]).range(['white', 'blue']).clamp(true); var radiusScale = d3.scale.linear().domain([0, 100]).range([1, 40]); var opacityScale = d3.scale.linear().domain([0, 100]).range([0, 1]); var drawProbability = d3.scale.linear().domain([0, 100]).range([0, 0.05]); var ctx = datastorm.canvas.ctx; var projection = d3.geo.orthographic() .scale(15000) .translate([1200, 12500]) .clipAngle(90) .precision(.1); var doFrameTimer, updateProjectionTimer; function initialiseData(json) { locations = json; } function doFrame() { ctx.globalAlpha = 0.4; // ctx.shadowBlur = 0; ctx.fillStyle = "rgba(0, 0, 0, 0.1)"; ctx.fillRect(0, 0, width, height); elapsedTs = Date.now() - startTs; render(); } // function updateProjection() { // projection.translate([xTranslateScale(elapsedTs), 7550]); // } function render() { // console.log('render'); ctx.globalAlpha = 0.5; // ctx.shadowBlur = 200; var sampleIndex = Math.floor(sampleScale(elapsedTs)); _.each(locations, function(l) { if(Math.random() > drawProbability(l.speed[sampleIndex])) return; ctx.globalAlpha = opacityScale(l.speed); ctx.fillStyle = colour(l.temp[sampleIndex]); // console.log(l); var pt = projection([l.lon, l.lat]); datastorm.canvas.drawCircle(pt[0], pt[1], radiusScale(l.speed[sampleIndex])); }); } my.init = function(conf) { config = conf; d3.json('https://d28qoto45d39ov.cloudfront.net/datastorm/visualisations/forecast/data/forecast-old.json', function(err, json) { initialiseData(json); if(config.autoStart === true) my.start(); }); } my.start = function() { startTs = Date.now(); doFrameTimer = setInterval(doFrame, 100); // updateProjectionTimer = setInterval(updateProjection, 200); } my.stop = function() { clearInterval(doFrameTimer); // clearInterval(updateProjectionTimer); } return my; }()); datastorm.forecast.init({ autoStart: true });
See the Pen Datastorm - Forecast by Genevieve Smith-Nunes (@readysaltedcode) on CodePen.