block by mbostock 94b9fd26e12c586f342d

Raster & Vector I

Full Screen

Using d3-tile to display raster image tiles underneath some TopoJSON vectors. Compare to the zoomable version.

Tiles copyright OpenStreetMap contributors.

Updated Example →

index.html

<!DOCTYPE html>
<meta charset="utf-8">
<style>

#streets {
  fill: none;
  stroke: black;
  stroke-width: 1.5px;
  stroke-linejoin: round;
}

</style>
<svg width="960" height="960"></svg>
<script src="//d3js.org/d3.v4.min.js"></script>
<script src="//d3js.org/d3-tile.v0.0.min.js"></script>
<script src="//d3js.org/topojson.v1.min.js"></script>
<script>

var pi = Math.PI,
    tau = 2 * pi;

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

var projection = d3.geoMercator()
    .scale((1 << 18) / tau)
    .translate([width / 2, height / 2])
    .center([-83.15, 42.43]);

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

d3.json("detroit.json", function(error, detroit) {
  if (error) throw error;

  var tiles = d3.tile()
      .size([width, height])
      .scale(projection.scale() * tau)
      .translate(projection([0, 0]))
      ();

  svg.selectAll("image")
      .data(tiles)
    .enter().append("image")
      .attr("xlink:href", function(d) { return "//" + "abc"[d[1] % 3] + ".tile.openstreetmap.org/" + d[2] + "/" + d[0] + "/" + d[1] + ".png"; })
      .attr("x", function(d) { return (d[0] + tiles.translate[0]) * tiles.scale; })
      .attr("y", function(d) { return (d[1] + tiles.translate[1]) * tiles.scale; })
      .attr("width", tiles.scale)
      .attr("height", tiles.scale);

  svg.append("path")
      .attr("id", "streets")
      .datum(topojson.mesh(detroit, detroit.objects.detroit))
      .attr("d", path);
});

</script>