Created by Brett Carter / @zbskii
We do cool stuff. Mostly logins.
I mostly do backend work. Databases, servers, DevOps, etc.
I'm not a JavaScript programmer :)
Ugh...
I wanted to make something cool
Within a few hours they had live updating stats, a great design, and a deployable server. What could I do?
// Create map projection
_projection = d3.geo.equirectangular()
.scale(100)
.translate([width / 2, height / 2])
.precision(.1);
// Add the svg
var svg = d3.select('#map').append('svg')
.attr('width', width)
.attr('height', height);
// Convert projection to a path
var path = d3.geo.path()
.projection(_projection);
// Add the countries via topojson
_g = svg.append('g');
d3.json('js/world-110m.json', function(error, topology) {
_g.selectAll('path')
.data(topojson.object(topology, topology.objects.countries)
.geometries)
.enter()
.append('path')
.attr('d', path);
// Load data from JSON
d3.json('cities_small.json', function(error, logins) {
if (logins.hasOwnProperty('stat') && logins.stat.fail === 'error') {
return false;
}
// Bind SVG circles to current data set
var circles = overlay.selectAll('circle')
.data(logins, function(d) { return [d.lon, d.lat] });
// Update the view
circles.enter()
.append('circle')
.attr('cx', function(d) {
return _projection([d.lon, d.lat])[0];
})
.attr('cy', function(d) {
return _projection([d.lon, d.lat])[1];
})
.style('opacity', '.5')
.attr('r', 4)
.style('fill', '#77B849');
(D3 makes this crazy easy)
// Update the view
circles.enter()
.append('circle')
.attr('cx', function(d) {
return _projection([d.lon, d.lat])[0];
})
.attr('cy', function(d) {
return _projection([d.lon, d.lat])[1];
})
.attr('r', 15)
.style('fill', '#77B849').style('opacity', '0')
// Animate!
.transition()
.style('opacity', '.5')
.attr('r', 4)
.style('fill', '#77B849')
.duration(1000).delay(function(d, i) {
return i / logins.length * 60000});
circles.exit().remove();