|
<!DOCTYPE html> |
|
<meta charset="utf-8"> |
|
<style> |
|
|
|
.stroke { |
|
fill: none; |
|
stroke: #000; |
|
stroke-width: .5; |
|
} |
|
|
|
</style> |
|
<body> |
|
<script src="http://d3js.org/d3.v3.min.js"></script> |
|
<script src="http://d3js.org/d3.geo.tile.v0.min.js"></script> |
|
<script src="http://d3js.org/topojson.v1.min.js"></script> |
|
<script> |
|
/** |
|
Based on Mike Bostock's http://bl.ocks.org/mbostock/4150951 |
|
*/ |
|
var width = 960, |
|
height = 500; |
|
|
|
var projection = d3.geo.mercator() |
|
.center([0.5491, 40.4942]) |
|
.scale(20000); |
|
|
|
var path = d3.geo.path() |
|
.projection(projection); |
|
|
|
var tile = d3.geo.tile() |
|
.scale(projection.scale() * 2 * Math.PI) |
|
.translate(projection([0, 0])) |
|
.zoomDelta((window.devicePixelRatio || 1) - .5); |
|
|
|
var svg = d3.select("body").append("svg") |
|
.attr("width", width) |
|
.attr("height", height); |
|
|
|
var tiles = tile(); |
|
|
|
var defs = svg.append("defs"); |
|
|
|
var magnitudeScale = d3.scale.linear().domain([2,5]).range([5,30]); |
|
d3.json("data.json", function(error, locations) { |
|
|
|
svg.append("g") |
|
|
|
.selectAll("image") |
|
.data(tiles) |
|
.enter().append("image") |
|
.attr("xlink:href", function(d) { |
|
return "https://a.tiles.mapbox.com/v3/mapbox.world-bright/" + d[2] + "/" + d[0] + "/" + d[1] + ".png"; }) |
|
.attr("width", Math.round(tiles.scale) + 1) |
|
.attr("height", Math.round(tiles.scale) + 1) |
|
.attr("x", function(d) { return Math.round((d[0] + tiles.translate[0]) * tiles.scale); }) |
|
.attr("y", function(d) { return Math.round((d[1] + tiles.translate[1]) * tiles.scale); }); |
|
|
|
svg.append("g") |
|
.append('path') |
|
.attr("d","m 0,0 -8.47858,-5.22254 -8.31623,5.47756 2.34696,-9.67752 -7.77927,-6.21653 9.92909,-0.75852 3.50829,-9.31953 3.78972,9.20873 9.94748,0.45679 -7.58687,6.44982 z") |
|
.attr("stroke","black") |
|
.attr("stroke-width",2) |
|
.style("fill", d3.rgb(90, 90, 90)) |
|
.attr("transform", "translate("+projection([0.66879, 40.33503])[0]+","+projection([0.66879, 40.33503])[1]+")"); |
|
|
|
var locationsG = svg.append("g"); |
|
|
|
|
|
function addLocation(loc){ |
|
locationsG.append('circle') |
|
.attr('class','location') |
|
.attr("r", 5) |
|
.attr("cx", projection([loc.lon, loc.lat])[0]) |
|
.attr("cy", projection([loc.lon, loc.lat])[1]) |
|
.style("fill", d3.rgb(255, 0, 0).darker(2)) |
|
.style("opacity", 0.8) |
|
.transition() |
|
.duration(1000) |
|
.attr("r", magnitudeScale(loc.magnitude)) |
|
.transition() |
|
.delay(2000) |
|
.duration(2000) |
|
.style("opacity",0.3); |
|
|
|
locationsG |
|
.append("text") |
|
.text(loc.magnitude) |
|
.attr("x", projection([loc.lon, loc.lat])[0] - 10) |
|
.attr("y", projection([loc.lon, loc.lat])[1] + 5) |
|
.attr("font-family", "sans-serif") |
|
.attr("font-size", "12px") |
|
.attr("fill", "black") |
|
.style("opacity",0) |
|
.transition() |
|
.duration(1000) |
|
.style("opacity",1) |
|
.transition() |
|
.delay(2000) |
|
.duration(2000) |
|
.style("opacity",0); |
|
} |
|
|
|
//addLocation({"lat": "40.43", "magnitude": "2.7", "lon": "0.7", "datetime": "2013-10-09T06:43:16"}); |
|
|
|
var intDate = new Date("2013-09-10T00:00:00Z"); |
|
var maxDate = new Date("2013-10-04T00:00:00Z"); |
|
var usedLocations = new Array(); |
|
|
|
var dateTitle = svg |
|
.append("text") |
|
.attr("id", "dataTitle") |
|
.text(intDate.toLocaleDateString()) |
|
.attr("x", 70) |
|
.attr("y", 20) |
|
.attr("font-family", "sans-serif") |
|
.attr("font-size", "20px") |
|
.attr("fill", "black"); |
|
|
|
var interval = setInterval(function() { |
|
|
|
dateTitle.text(intDate.toLocaleDateString()); |
|
|
|
for (i = 0; i<locations.length; i++){ |
|
var locationDate = new Date(locations[i].datetime); |
|
|
|
if (locationDate <= intDate && usedLocations.indexOf(locations[i].datetime) == -1){ |
|
|
|
usedLocations.push(locations[i].datetime); |
|
addLocation(locations[i]); |
|
} |
|
|
|
if (intDate>maxDate){ |
|
clearInterval(interval); |
|
} |
|
|
|
} |
|
|
|
intDate.setDate(intDate.getDate() + 1); |
|
}, 1000); |
|
|
|
}); |
|
|
|
</script> |