forked from JulienAssouline‘s block: World tour d3 v4
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.country {
fill: #b8b8b8;
stroke: #fff;
stroke-width: .5px;
stroke-linejoin: round;
}
.graticule {
fill: none;
stroke: #000;
stroke-opacity: .3;
stroke-width: .5px;
}
.graticule-outline {
fill: none;
stroke: #333;
stroke-width: 1.5px;
}
text {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 18px;
font-weight: bold;
text-anchor: middle;
z-index: 100;
}
</style>
<body>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="//d3js.org/topojson.v0.min.js"></script>
<script>
var width = 960,
height = 500;
var projection = d3.geoOrthographic()
.scale(248)
.clipAngle(90);
var path = d3.geoPath(projection);
var graticule = d3.geoGraticule()
.extent([[-180, -90], [180 - .1, 90 - .1]]);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
var line = svg.append("path")
.datum(graticule)
.attr("class", "graticule")
.attr("d", path);
svg.append("circle")
.attr("class", "graticule-outline")
.attr("cx", width / 2)
.attr("cy", height / 2)
.attr("r", projection.scale());
d3.json("readme-world-110m.json", function(error, world) {
var countries = topojson.object(world, world.objects.countries).geometries,
i = -1,
n = countries.length;
var country = svg.selectAll(".country")
.data(countries)
.enter().insert("path", ".graticule")
.attr("class", "country")
.attr("d", path);
var title = svg.append("text")
.attr("x", width / 2)
.attr("y", height * 3 / 5);
step();
function step() {
if (++i >= n) i = 0;
title.text(countries[i].id);
country.transition()
.style("fill", function(d, j) { return j === i ? "red" : "#b8b8b8"; });
d3.transition()
.delay(250)
.duration(1250)
.tween("rotate", function() {
var point = d3.geoCentroid(countries[i]),
rotate = d3.interpolate(projection.rotate(), [-point[0], -point[1]]);
return function(t) {
projection.rotate(rotate(t));
line.attr("d", path);
country.attr("d", path);
};
})
.transition()
.on("end", step);
}
});
</script>