var MapChart = { init: function(svg, html_tag_attr, projection, map){ var wSvg = $(html_tag_attr).width(), hSvg = $(html_tag_attr).height(); var path = d3.geoPath().projection(projection); Promise.all([map]).then(values => { createMap(values[0]); }); // Code for map zooming var zoomSettings = d3.zoomIdentity .translate(wSvg / 2, hSvg / 2) .scale(hSvg / 2); var mapZoom = d3.zoom().on("zoom", zoomed); function zoomed(){ var e = d3.event; projection.translate([e.transform.x, e.transform.y]).scale(e.transform.k); d3.selectAll("path.countries").attr("d", path); } function zoomButton(zoomDirection) { var width = 500; var height = 500; if (zoomDirection == "in") { var newZoom = projection.scale() * 1.5; var newX = ((projection.translate()[0] - (width / 2)) * 1.5) + width / 2; var newY = ((projection.translate()[1] - (height / 2)) * 1.5) + height / 2; } else if (zoomDirection == "out") { var newZoom = projection.scale() * .75; var newX = ((projection.translate()[0] - (width / 2)) * .75) + width / 2; var newY = ((projection.translate()[1] - (height / 2)) * .75) + height / 2; } var newZoomSettings = d3.zoomIdentity.translate(newX, newY).scale(newZoom); svg.transition().duration(500).call(mapZoom.transform, newZoomSettings); } d3.select(html_tag_attr).select(html_tag_attr+"_controls").append("button").attr("classed", "btn btn-success").on("click", () => { zoomButton("in")}).html("Zoom In"); d3.select(html_tag_attr).select(".controls").append("button").on("click", () => { zoomButton("out")}).html("Zoom Out"); function createMap(countries){ svg.selectAll("path") .data(countries.features) .enter() .append("path") .attr("d", path) .attr("class", "countries"); svg.call(mapZoom).call(mapZoom.transform, zoomSettings); } } };