Built with blockbuilder.org
forked from anonymous's block: Animated path with two videos
Built with blockbuilder.org
forked from anonymous's block: Animated path with two videos
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset='utf-8' /> | |
| <title></title> | |
| <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /> | |
| <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.12.0/mapbox-gl.js'></script> | |
| <script src='http://api.tiles.mapbox.com/mapbox.js/plugins/turf/v2.0.2/turf.min.js'></script> | |
| <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.12.0/mapbox-gl.css' rel='stylesheet' /> | |
| <style> | |
| body { margin:0; padding:0; } | |
| #map { position:absolute; top:0; bottom:0; width:100%; } | |
| </style> | |
| </head> | |
| <body> | |
| <div id='map'></div> | |
| <script> | |
| var Tour = function() { | |
| mapboxgl.accessToken = 'pk.eyJ1IjoidHdlbGNoIiwiYSI6Il9pX3dtb3cifQ.YcYnsO0X2p3x0HpHPFfleg'; | |
| }; | |
| Tour.prototype.start = function() { | |
| this.map = new mapboxgl.Map({ | |
| container: 'map', | |
| style: 'mapbox://styles/twelch/cihxvsxy000oeaikoz39jjthw', | |
| center: [-122.580067, 45.548602], | |
| zoom: 14, | |
| minzoom: 18 | |
| }); | |
| this.map.on('style.load', function () { | |
| this.startTour(); | |
| }.bind(this)); | |
| }; | |
| Tour.prototype.startTour = function() { | |
| var time = 0; | |
| var timePerStep = 100; | |
| var interval = setInterval(function() { | |
| time += timePerStep; | |
| if (time === 2000) {this.easeIn();} | |
| if (time === 4500) {this.startPerson();} | |
| else if (time === 4100) {this.startVideo('front');} | |
| else if (time === 4200) {this.startVideo('back');} | |
| else if (time === 14000) {this.stopPerson();} | |
| else if (time === 14100) {this.stopVideo('front');} | |
| else if (time === 14200) {this.stopVideo('back');} | |
| else if (time === 14300) {this.easeOut();} | |
| }.bind(this), timePerStep); | |
| }; | |
| Tour.prototype.easeIn = function(text) { | |
| this.map.easeTo({ | |
| zoom: 20, | |
| duration: 3000 | |
| }); | |
| } | |
| Tour.prototype.easeOut = function(text) { | |
| this.map.easeTo({ | |
| zoom: 17, | |
| bearing: 45, | |
| pitch: 50, | |
| duration: 5000 | |
| }); | |
| } | |
| Tour.prototype.startPerson = function() { | |
| var iPath = turf.linestring([ | |
| [ -122.579915799999981, 45.5485545, 0.0 ], [ -122.57994530000002, 45.5485536, 0.0 ], [ -122.579944, 45.5485996, 0.0 ], [ -122.580011, 45.54860810000001, 0.0 ], [ -122.5799507, 45.5486043, 0.0 ], [ -122.579954700000016, 45.5485489, 0.0 ], [ -122.579903799999983, 45.5485489, 0.0 ] | |
| ]); | |
| var iPathLength = turf.lineDistance(iPath, 'miles'); | |
| var iPoint = turf.along(iPath, 0, 'miles'); | |
| var iPathSoFar = turf.linestring([]); | |
| this.map.addSource("pDot", { | |
| "type": "geojson", | |
| "data": iPoint, | |
| "maxzoom": 20 | |
| }); | |
| this.map.addLayer({ | |
| "id": "pDot", | |
| "type": "symbol", | |
| "source": "pDot", | |
| "layout": { | |
| "icon-image": "person-gray", | |
| "icon-size": { | |
| "base": 0.5, | |
| "stops": [ | |
| [0,0.01], | |
| [15,0.01], | |
| [20,0.5]] | |
| }, | |
| }, | |
| "paint": {}, | |
| "interactive": true | |
| }); | |
| var step = 0; | |
| var numSteps = 400; //Change this to set animation resolution | |
| var timePerStep = 25; //Change this to alter animation speed | |
| var pDotSource = this.map.getSource('pDot'); | |
| this.personinterval = setInterval(function() { | |
| step += 1; | |
| if (step > numSteps) { | |
| clearInterval(this.personInterval); | |
| } else { | |
| var curDistance = step / numSteps * iPathLength; | |
| var iPoint = turf.along(iPath, curDistance, 'miles'); | |
| pDotSource.setData(iPoint); | |
| iPathSoFar.geometry.coordinates.push(iPoint.geometry.coordinates); | |
| if (iPathSoFar.geometry.coordinates.length === 2) { | |
| this.pLineSource = new mapboxgl.GeoJSONSource({ | |
| "type": "geojson", | |
| "data": iPathSoFar, | |
| "maxzoom": 20 | |
| }); | |
| this.map.addSource("pLine", this.pLineSource); | |
| this.map.addLayer({ | |
| "id": "pLine", | |
| "type": "line", | |
| "source": "pLine", | |
| "layout": { | |
| "line-join": "round", | |
| "line-cap": "round" | |
| }, | |
| "paint": { | |
| "line-color": "#4999D2", | |
| "line-opacity": "0.6", | |
| "line-width": 6, | |
| "line-dasharray": [0.25,2], | |
| "line-blur": 1 | |
| } | |
| }, "pDot"); | |
| } | |
| if (iPathSoFar.geometry.coordinates.length >= 2) { | |
| this.pLineSource.setData(iPathSoFar); | |
| } | |
| } | |
| }.bind(this), timePerStep); | |
| }; | |
| Tour.prototype.stopPerson = function() { | |
| this.map.removeLayer('pLine'); | |
| this.map.removeLayer('pDot'); | |
| this.map.removeSource('pLine'); | |
| this.map.removeSource('pDot'); | |
| clearInterval(this.personInterval); | |
| }; | |
| Tour.prototype.startVideo = function(name) { | |
| var videos = { | |
| 'front': { | |
| "urls": ["https://cldup.com/KpVLU35SZv.webm", "https://cldup.com/B-IRzEIuWZ.mp4"], | |
| "coordinates": [ | |
| [-122.580085, 45.548739], | |
| [-122.579842, 45.548739], | |
| [-122.579842, 45.548654], | |
| [-122.580085, 45.548654] | |
| ] | |
| }, | |
| 'back': { | |
| "urls": ["https://cldup.com/3JLxT-6DlL.webm"], | |
| "coordinates": [ | |
| [-122.580393, 45.548566], | |
| [-122.580200, 45.548566], | |
| [-122.580200, 45.548498], | |
| [-122.580393, 45.548498] | |
| ] | |
| } | |
| }; | |
| var videoParams = videos[name]; | |
| var videoSrc = new mapboxgl.VideoSource(videoParams); | |
| videoSrc.on('change', function (e) { | |
| this.video = videoSrc.getVideo(); | |
| }.bind(this)); | |
| this.map.addSource(name, videoSrc); | |
| this.map.addLayer({ | |
| "id": name, | |
| "type": "raster", | |
| "source": name | |
| }); | |
| }; | |
| Tour.prototype.stopVideo = function(name) { | |
| this.video.pause(); | |
| this.map.removeLayer(name); | |
| this.map.removeSource(name); | |
| }; | |
| var tour = new Tour(); | |
| tour.start(); | |
| </script> | |
| </body> | |
| </html> |