MapViz = (sel, data, dataSel) => {
const callback = new Object();
let projection
callback.init = () => {
projection = initProjection(sel.select('.backgroundWrapper'));
sel.selectAll(".geo-path")
.style("fill-opacity", 0);
};
const enter = (s) => {
s.append("circle")
.transition().duration(1000)
.style("fill", d => color(d.cluster))
.attr("r", (d, i) => d.radius)
.attr("cx", (d, i) => (d.x = projection([d.longitude, d.latitude])[0]))
.attr("cy", (d, i) => (d.y = projection([d.longitude, d.latitude])[1]))
}
const update = (s) => {
return s.call(s => s.transition().duration(1000)
.attr("r", (d, i) => d.radius)
.attr("cx", (d, i) => (d.x = projection([d.longitude, d.latitude])[0]))
.attr("cy", (d, i) => (d.y = projection([d.longitude, d.latitude])[1]))
);
}
const exit = (s) => {
s.remove();
}
callback.render = () => {
sel.selectAll(".geo-path")
.transition().duration(1000)
.style("fill-opacity", 0.5);
dataSel.join(enter, update, exit)
sel
.selectAll(".blurValues")
.transition()
.duration(4000)
.attrTween("values", function () {
return d3.interpolateString(
"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -5",
"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 6 -5"
);
});
};
callback.stop = () => {
sel.selectAll(".geo-path")
.transition().duration(1000)
.style("fill-opacity", 0.0);
}
return callback;
};