function createMap(list_region, list_departement, rivieres, site, handleSiteClick, graphique) {
const nom_site = document.createElement("div");
nom_site.id = "nom_site";
nom_site.replaceChildren(html`<h4 id="">Evolution du débit total de tous les sites</h4>`);
const chartContainer_scrubber = document.createElement("div");
chartContainer_scrubber.id = "chart-container";
console.log(graphique)
const scrubber = Scrubber(
[...new Set(graph.map(d => d.date))].sort(),
{ autoplay: false, delay: 750, loop: false }
);
chartContainer_scrubber.replaceChildren(scrubber)
const graph_filter = graphique.filter(d => d.date == scrubber.value)
const width = 400, height = 500;
const svg = d3.create("svg")
.attr("width", width)
.attr("height", height);
const projection = d3.geoConicConformal()
.center([4.5, 45])
.scale(8000)
.translate([width / 2, height / 2]);
const pathGenerator = d3.geoPath().projection(projection);
svg.selectAll("path.departement")
.data(list_departement)
.enter().append("path")
.attr("class", "departement")
.attr("d", pathGenerator)
.attr("stroke", "#aaa")
.attr("fill", "#f0f0f0")
.attr("stroke-width", 1); // Augmenter la largeur du trait
// Dessiner le fond de carte (départements)
svg.selectAll("path.region")
.data(list_region) // Utilisation de liste_region directement
.enter().append("path")
.attr("class", "region")
.attr("d", pathGenerator)
.attr("stroke", "black")
.attr("fill", "none")
.attr("stroke-width", 3); // Augmenter la largeur du trait
// Dessiner les rivières
svg.selectAll("path.riviere")
.data(rivieres.features)
.enter().append("path")
.attr("class", "riviere")
.attr("d", pathGenerator)
.attr("stroke", "blue")
.attr("fill", "none")
.attr("stroke-width", 3)
.on("mouseover", function(event, d) {
// Agrandir la rivière au survol
d3.select(this)
.attr("stroke-width", 10); // Agrandir la ligne de la rivière
// Afficher le nom de la rivière
svg.append("text")
.attr("id", "nomRiviere")
.attr("x", event.offsetX + 10) // Décalage horizontal
.attr("y", event.offsetY - 10) // Décalage vertical
.attr("font-size", 22)
.attr("fill", "black")
.text(d.properties.name);
})
.on("mouseout", function() {
// Rétablir la taille normale
d3.select(this)
.attr("stroke-width", 3);
// Supprimer le texte du nom de la rivière
d3.select("#nomRiviere").remove();
})
.on("mousemove", function(event, d) {
// Mise à jour de la position du texte lors du mouvement de la souris
d3.select("#nomRiviere")
.attr("x", event.offsetX + 10)
.attr("y", event.offsetY - 10);
});
// Conteneur pour le graphique
const chartContainer = document.createElement("div");
chartContainer.id = "chart-container";
console.log(graphique)
chartContainer.replaceChildren(handleSiteClick({ "properties": { "code_site": "" } }, graphique, scrubber.value));
const chartContainer2 = document.createElement("div");
chartContainer2.id = "chart-container";
const initialData = graphique.filter(d => d.date == scrubber.value);
const tooltip = d3.select("body").append("div")
.attr("class", "tooltip")
.style("position", "absolute")
.style("background", "white")
.style("border", "1px solid black")
.style("border-radius", "5px")
.style("padding", "5px")
.style("display", "none") // Caché par défaut
.style("pointer-events", "none"); // Empêche d'interférer avec la souris
// Créer le graphique Sankey initial
let sankeyChart = SankeyChart({
links: initialData
}, {
nodeGroup: d => d.id.split(/_/)[0], // Take first word for color
nodeAlign: "right", // E.g., d3.sankeyJustify
linkColor: "source-target", // E.g., "source" or "target"
format: (f => d => `${f(d)} m3/s`)(d3.format(",.1~f")),
width: 1200,
height: 450,
});
chartContainer2.replaceChildren(sankeyChart);
// Ajouter un événement sur le scrubber pour mettre à jour le graphique Sankey
scrubber.addEventListener("input", function() {
const selectedDate = scrubber.value;
// Filtrer les données selon la date sélectionnée
const filteredData = graphique.filter(d => d.date == selectedDate);
console.log("scrubber value", scrubber.value)
// Mettre à jour le graphique Sankey avec les nouvelles données
sankeyChart = SankeyChart({
links: filteredData
}, {
nodeGroup: d => d.id.split(/_/)[0], // Take first word for color
nodeAlign: "right", // E.g., d3.sankeyJustify
linkColor: "source-target", // E.g., "source" or "target"
format: (f => d => `${f(d)} m3/s`)(d3.format(",.1~f")),
width: 1200,
height: 450
});
// Mettre à jour le conteneur avec le nouveau Sankey Chart
chartContainer2.replaceChildren(sankeyChart);
console.log("nom_site", nom_site.firstElementChild)
console.log("site_id", nom_site.firstElementChild.id)
chartContainer.replaceChildren(handleSiteClick({ "properties": { "code_site": nom_site.firstElementChild.id }}, graphique, scrubber.value)); // Passe les données du site cliqué à la fonction
});
// Dessiner les points des sites
svg.selectAll("circle")
.data(site.features)
.enter().append("circle")
.attr("cx", d => projection(d.geometry.coordinates)[0])
.attr("cy", d => projection(d.geometry.coordinates)[1])
.attr("r", 6)
.attr("fill", "red")
.attr("stroke", "black")
.attr("stroke-width", 1)
.on("mouseover", function (event, d) {
d3.select(this).attr("fill", "green"); // Change la couleur en vert
tooltip.style("display", "block")
.html(`Site: ${d.properties.source}`);
})
.on("mousemove", function (event) {
tooltip.style("left", (event.pageX - 60) + "px")
.style("top", (event.pageY + 30) + "px");
})
.on("mouseout", function () {
d3.select(this).attr("fill", "red"); // Remet la couleur rouge
tooltip.style("display", "none");
})
.on("click", function(event, d) {
// Appeler une fonction lorsque le site est cliqué
chartContainer.replaceChildren(handleSiteClick(d, graphique, scrubber.value)); // Passe les données du site cliqué à la fonction
nom_site.replaceChildren(html`<h4 id=${d.properties.code_site}>Evolution du débit au niveau de la station de mesure ${d.properties.source}</h4>
`);
});
svg.on("click", function(event, d) {
// Vérifier si le clic a eu lieu sur un cercle ou ailleurs
if (!event.target.closest("circle")) {
chartContainer.replaceChildren(handleSiteClick({ "properties": { "code_site": "" } }, graphique, scrubber.value)); // Passe les données du site cliqué à la fonction
nom_site.replaceChildren(html`<h4 id="">Evolution du débit total de tous les sites</h4>`);
}
});
return html`
<h2>Visualisation du débit sur le Rhône et ses affluents</h2>
<div>${chartContainer_scrubber}</div>
<div style="display: flex; flex-direction: column; gap: 20px;">
<!-- Partie haute : chartContainer2 qui prend toute la largeur -->
<div style="width: 100%;">
${chartContainer2}
</div>
<!-- Partie basse : svg.node() et chartContainer côte à côte -->
<div style="display: flex; gap: 20px;">
<div style="flex: 1;">
<h4>Carte des sites de mesure du Rhône et de ses affluents </h4>
${svg.node()}
</div>
<div style="flex: 1;">
${nom_site}
${chartContainer}
</div>
</div>
</div>
`
// Retourne le noeud SVG pour l'inclure dans le DOM
// return svg.node()
}