Dana Silver @DanaRSilver GitHub

March 11, 2014

Map of the U.S

A simple demonstration of TopoJSON and interactivity. Mouseover to show the state's abbreviation and the latitude and longitude of the point.

Visualization

In addition to D3, this visualization relies on TopoJSON. The map uses an Albers USA projection, for which Alaska is scaled by 0.35x, giving it a lie factor of 3. On mousemoves, the corresponding state abbreviation in the data is shown, and the latitude and longitude is computed by inverting the mouse position.


var width = 840,
    height = 500;

var projection = d3.geo.albersUsa()
    .scale(1000)
    .translate([width / 2, height / 2]);

var path = d3.geo.path()
    .projection(projection);

var svg = d3.select("svg")
    .attr("width", width)
    .attr("height", height);

d3.json("us2.json", function(error, us) {
  svg.selectAll(".state")
      .data(topojson.feature(us, us.objects.usStates).features)
    .enter()
      .append("path")
      .attr("class", "state")
      .attr("d", path)
      .on("mouseover", function() { focus.style("display", null); })
      .on("mouseout", function() { focus.style("display", "none"); })
      .on("mousemove", function(d) {
        var pos = d3.mouse(this),
            latlng = projection.invert(pos);
        focus.select(".abbr").text(d.properties.STATE_ABBR);
        focus.select(".latlng").text("(" + d3.round(latlng[0], 2) + "\u00B0, "
                                         + d3.round(latlng[1], 2) + "\u00B0)");
        focus.attr("transform", "translate(" + pos[0] + "," + pos[1] + ")");
      });

  var focus = svg.append("g")
      .attr("class", "focus")
      .style("display", "none");

  focus.append("text")
      .attr("class", "abbr")
      .attr("x", -10)
      .attr("y", -30)
      .attr("dy", ".35em");

  focus.append("text")
      .attr("class", "latlng")
      .attr("x", -10)
      .attr("y", -13)
      .attr("dy", ".35em");
});