Skip to content

Instantly share code, notes, and snippets.

Last active January 11, 2017 09:23
What would you like to do?
Using d3.behavior.drag() with a map (updated)
<!DOCTYPE html>
<meta charset="utf-8">
body {
background: #fcfcfa;
height: 500px;
position: relative;
width: 960px;
.stroke {
fill: none;
stroke: #000;
stroke-width: 3px;
.fill {
fill: #fff;
.graticule {
fill: none;
stroke: #777;
stroke-width: .5px;
stroke-opacity: .5;
.land {
fill: #222;
<script src=""></script>
<script src=""></script>
var width = 960,
height = 500,
rotate = [0,0],
graticule = d3.geo.graticule();
var projection = d3.geo.azimuthalEqualArea()
.clipAngle(180 - 1e-3)
var path = d3.geo.path()
var m0,
var drag = d3.behavior.drag()
.on("dragstart", function() {
// Adapted from and updated for d3 v3
var proj = projection.rotate();
m0 = [d3.event.sourceEvent.pageX, d3.event.sourceEvent.pageY];
o0 = [-proj[0],-proj[1]];
.on("drag", function() {
if (m0) {
var m1 = [d3.event.sourceEvent.pageX, d3.event.sourceEvent.pageY],
o1 = [o0[0] + (m0[0] - m1[0]) / 4, o0[1] + (m1[1] - m0[1]) / 4];
projection.rotate([-o1[0], -o1[1]]);
// Update the map
path = d3.geo.path().projection(projection);
d3.selectAll("path").attr("d", path);
var svg ="body").append("svg")
.attr("width", width)
.attr("height", height)
.datum({type: "Sphere"})
.attr("id", "sphere")
.attr("d", path);
.attr("class", "stroke")
.attr("xlink:href", "#sphere");
.attr("class", "fill")
.attr("xlink:href", "#sphere");
.attr("class", "graticule")
.attr("d", path);
d3.json("plate0.json", function(error, plates) {
svg.insert("path", ".graticule")
.datum(topojson.feature(plates, plates.objects.plates0))
.attr("class", "land")
.attr("d", path);
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment