{
const wrapper = d3.select(DOM.element("div"));
const svg = wrapper
.append("svg")
.attr("width", mapWidth)
.attr("height", mapHeight);
const g = svg.append("g");
g.selectAll("path")
.data(geoJsonUsa.features)
.enter()
.append("path")
.attr("fill", "#eee")
.attr("stroke", "#bbb")
.attr("d", d3.geoPath(projection));
g.selectAll("circle")
.data(points)
.enter()
.append("circle")
.attr("cx", function(d) {
console.log(projection(d));
return projection(d)[0];
})
.attr("cy", function(d) {
return projection(d)[1];
})
.attr("r", "2px")
.attr("fill", "red");
const bar = svg.append("g").call(scaleBarWapoZoom);
bar.select(".domain").style("stroke-width", 1.5);
// Call d3.zoom on your SVG element
svg.call(
d3
.zoom()
.scaleExtent([1, 10])
.translateExtent([[0, 0], [mapWidth, mapHeight]])
.on("zoom", _ => {
const t = d3.event.transform;
g.attr("transform", t);
scaleBarWapoZoom
.label(
`${Math.round(
scaleBarWapoZoom.distance() / t.k
)} ${scaleBarWapoZoom.units()}`
)
.zoomFactor(t.k);
bar.call(scaleBarWapoZoom);
})
);
// add slider
var moving = false;
var currentValue = 0;
var targetValue = width;
var playButton = d3.select("#play-button");
var x = d3
.scaleTime()
.domain([min_date, max_date])
.range([0, targetValue])
.clamp(true);
var slider = svg
.append("g")
.attr("class", "slider")
.attr("transform", "translate(" + margin.left + "," + height / 5 + ")");
slider
.append("line")
.attr("class", "track")
.attr("x1", x.range()[0])
.attr("x2", x.range()[1])
.select(function() {
return this.parentNode.appendChild(this.cloneNode(true));
})
.attr("class", "track-inset")
.select(function() {
return this.parentNode.appendChild(this.cloneNode(true));
})
.attr("class", "track-overlay")
.call(
d3
.drag()
.on("start.interrupt", function() {
slider.interrupt();
})
.on("start drag", function() {
currentValue = d3.event.x;
update(x.invert(currentValue));
})
);
slider
.insert("g", ".track-overlay")
.attr("class", "ticks")
.attr("transform", "translate(0," + 18 + ")")
.selectAll("text")
.data(x.ticks(10))
.enter()
.append("text")
.attr("x", x)
.attr("y", 10)
.attr("text-anchor", "middle")
.text(function(d) {
return formatDateIntoYear(d);
});
var handle = slider
.insert("circle", ".track-overlay")
.attr("class", "handle")
.attr("r", 9);
var label = slider
.append("text")
.attr("class", "label")
.attr("text-anchor", "middle")
.text(formatDate(min_date))
.attr("transform", "translate(0," + -25 + ")");
// plot
function update(h) {
// update position and text of label according to slider scale
handle.attr("cx", x(h));
label.attr("x", x(h)).text(formatDate(h));
// // filter data set and redraw plot
// var newData = dataset.filter(function(d) {
// return d.date < h;
// });
// drawPlot(newData);
}
return wrapper.node();
}