block by denisemauldin a2fa29af082e85dfaf27d100be01fa47

World tour d3 v4

Full Screen

forked from JulienAssouline‘s block: World tour d3 v4

index.html

<!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>