Array.prototype.clean = function(deleteValue) { for (var i = 0; i < this.length; i++) { if (this[i] == deleteValue) { this.splice(i, 1); i--; } } return this; }; /* Array.findRanges Turns this: ["a","a","a","b","b","c","c","c","c","c","a","a","c"] into this: { "a":[ { "from":0, "to":2 }, { "from":10, "to":11 } ], "b":[ { "from":3, "to":4 } ], "c":[ { "from":5, "to":9 }, { "from":12, "to":12 } ] } */ Array.prototype.findRanges = function() { var buckets = {}; for(var i = 0; i < this.length; i++) { if(!(this[i] in buckets)) { buckets[this[i]] = [{ from: i, to: i }] } else { var last = buckets[this[i]][ buckets[this[i]].length-1 ]; if(i == last.to + 1) { last.to = i; } else { buckets[this[i]].push({ from: i, to: i }) } } } return buckets; }; var map = L.map('map', { zoomControl: false }).setView([45.516, -122.660], 14, null, null, 24); var layer = L.esri.basemapLayer("Topographic"); layer.maxZoom = 24; layer.maxNativeZoom = 24; layer.addTo(map); new L.Control.Zoom({ position: 'topleft' }).addTo(map); var geojsonLineOptions = { color: "#0033ff", weight: 4, opacity: 0.5 }; var visible_layers = []; var visible_data = []; var highlightedMarker; var animatedMarker; var timers = []; var batteryChart; /* Chart.defaults.global.animation = false; Chart.defaults.global.responsive = true; */ function resetAnimation() { if(animatedMarker) { map.removeLayer(animatedMarker); } if(timers.length > 0) { for(var i in timers) { clearTimeout(timers[i]); } } } jQuery(function($){ $('.calendar a').click(function(evt){ var append = evt.altKey; if(!append) { $('.calendar a').removeClass('selected'); if(visible_layers.length) { for(var i in visible_layers) { map.removeLayer(visible_layers[i]); } } visible_layers = []; visible_data = []; } $(this).addClass('selected'); resetAnimation(); var db_name = $("#database").data("name"); var db_token = $("#database").data("token"); $.get("/api/query?format=linestring&date="+$(this).data('date')+"&tz=America/Los_Angeles&token="+db_token, function(data){ if(data.coordinates && data.coordinates.length > 0) { visible_data.push(data); visible_layers.push(L.geoJson(data, { style: geojsonLineOptions }).addTo(map)); // If the new layer is completely outside the current view, zoom the map to fit all layers var layer = visible_layers[visible_layers.length - 1]; var is_outside = false; if(!map.getBounds().intersects(layer.getBounds())) { is_outside = true; } if(is_outside) { var full_bounds; for(var i in visible_layers) { layer = visible_layers[i]; if(full_bounds) { full_bounds.extend(layer.getBounds()); } else { full_bounds = layer.getBounds(); } } map.fitBounds(full_bounds); } var batteryStateBands = []; var buckets = data.properties.map(function(d){return d.battery_state}).findRanges(); for(var i in buckets) { for(var j=0; j{point.y}', valueSuffix: '%' }, turboThreshold: 0 }] }); $('#battery-chart').mousemove(function(event){ var chart = $('#battery-chart').highcharts(); var percent = (event.offsetX - chart.plotLeft) / chart.plotWidth; if(percent >= 0 && percent <= 1) { var coord = pointFromGeoJSON(visible_data[0].coordinates[Math.round(percent * visible_data[0].coordinates.length)]); if(!highlightedMarker) { highlightedMarker = L.marker(coord).addTo(map); } else { highlightedMarker.setLatLng(coord); } } }); } }); return false; }); function pointFromGeoJSON(geo) { return L.latLng(geo[1], geo[0]) } $('#btn-play').click(function(){ console.log(visible_data[0].coordinates[0]); var point = pointFromGeoJSON(visible_data[0].coordinates[0]); resetAnimation(); animatedMarker = L.marker(point); animatedMarker.addTo(map); timers = []; var interval = 3; for(var i in visible_data[0].coordinates) { (function(i){ timers.push(setTimeout(function(){ point = pointFromGeoJSON(visible_data[0].coordinates[i]); animatedMarker.setLatLng(point); }, interval*i)); })(i); } }); $(".calendar a[data-date='"+((new Date()).toISOString().slice(0,10))+"']").focus().click(); //////////////////// //batteryChart = new Chart(document.getElementById("battery-chart").getContext("2d")); });