chart = {
const context = DOM.context2d(width, height);
const r = 0.5;
var persons = [];
const zoom_initiales = 20
const zoom_initiales_noms = 50
const zoom_noms_seuls = 80
d3.json('https://api.memorial-covid.org/persons?limit=100&covid=1').then(function(data) {
console.log(data);
persons = data
var i; for (i = 0; i < persons.length/4; i++) {
persons.splice(Math.round(Math.random()*persons.length),0,{surnames: "?",surname1: "?", name: '?'});
}
});
d3.select(context.canvas).call(d3.zoom()
.scaleExtent([0.8, 400])
.on("zoom", ({transform}) => zoomed(transform)));
function zoomed(transform) {
const zoom = transform.k
context.save();
context.fillStyle = "#444";
context.fillRect(0, 0, width, height);
if (zoom < 10) {
context.beginPath();
context.fillStyle = "#fff";
}
var lastColor = -1;
for (const d of data) {
// coordonnées pour dessin dans le canvas
const [x, y] = transform.apply(d);
// récupération des données de la personne correspondant à cet emplacement
const person = persons[d[2] % persons.length]
// inutile de dessiner hors zone visible
if (x > -zoom & x < width+zoom & y > -zoom & y < height+zoom) {
// changement de gris pour le titre, si changement de couleur
if (zoom < 20 & lastColor != d[3]) {
if (lastColor>=0) context.fill();
context.beginPath();
if (d[3]!=0) {
context.fillStyle = "#fff";
} else {
context.fillStyle = "#888";
if (zoom > 12) context.fillStyle = "#aaa";
if (zoom > 14) context.fillStyle = "#bbb";
if (zoom > 16) context.fillStyle = "#ccc";
if (zoom > 18) context.fillStyle = "#ddd";
}
lastColor = d[3];
}
// dessin des points/disques
if (zoom >= 20) { context.beginPath(); context.fillStyle = "#fff"; }
context.moveTo(x + r*transform.k, y);
context.arc(x, y, r*transform.k, 0, 2 * Math.PI);
if (zoom >= 10) { context.fill(); }
// les initiales
if (zoom > zoom_initiales & zoom < zoom_noms_seuls) {
const size = zoom/2.5
context.font = size+"px Times";
context.textAlign = "center";
// transitions blanc > gris > noir > gris > blanc
context.fillStyle = "#aaa";
if (zoom > zoom_initiales+10) { context.fillStyle = "#888"; }
if (zoom > zoom_initiales+20) { context.fillStyle = "#000"; }
if (zoom > zoom_initiales_noms) { context.fillStyle = "#888"; }
if (zoom > (zoom_initiales_noms+zoom_noms_seuls)/2) { context.fillStyle = "#aaa"; }
context.fillText(person.surnames[0]+person.name[0], x, y+size*0.35);
}
// les prénoms / noms + dates
if (zoom >= zoom_initiales_noms) {
const size = zoom/4
context.font = size+"px Times";
context.textAlign = "center";
// noir > gris > blanc
context.fillStyle = "#444";
if (zoom > (zoom_initiales_noms+zoom_noms_seuls)/2) { context.fillStyle = "#888"; }
if (zoom > zoom_noms_seuls) { context.fillStyle = "#fff"; }
context.fillText(person.surname1, x, y+size+zoom/2);
if (person.surname1 != '?') {
context.fillText(person.name, x, y+2.25*size+zoom/2);
context.font = size*0.7+"px Times";
context.fillText(person.birth_date.substring(0,4)+"-"+person.death_date.substring(0,4), x, y+3.25*size+zoom/2);
}
}
}
}
if (zoom < 10) { context.fill(); }
context.restore();
}
zoomed(d3.zoomIdentity);
return context.canvas;
}