map = {
let container = d3.select(DOM.element("div"));
let context = this ? this.getContext("2d") : DOM.context2d(width, width);
container.append(() => context.canvas);
let tooltip = container.append("div").attr("id","tooltip");
let height = context.canvas.height;
let originalScale = height / 2.1;
let scale = originalScale;
let previousScaleFactor = 1;
let rotation;
let sphere = {type: 'Sphere'};
let path = d3.geoPath(projection, context);
let tooltipQuadtree = getQuadtree();
let tooltipPositions = [];
let tooltipPositionsIndex = {};
let twitterUserFeatures = twitterUsers.features;
function drawWorld() {
context.clearRect(0, 0, width, height);
context.beginPath(), path(graticule), context.lineWidth = .4; context.strokeStyle = "#ccc", context.stroke();
context.beginPath(), path(land), context.fillStyle = '#888', context.fill(); context.strokeStyle = "#fff"; context.lineWidth = .3; context.stroke();
context.beginPath(), path(sphere),context.strokeStyle = "#333", context.stroke();
path.pointRadius(3.5);
twitterUserFeatures.forEach(d => {
context.beginPath(), context.fillStyle = 'blue'; path(d); context.fill()
});
tooltipPositions = []; tooltipPositionsIndex = {}; tooltipQuadtree = getQuadtree();
for(let i=0, len=twitterUserFeatures.length; i<len; i++){
let pixelCoords = projection(twitterUserFeatures[i].geometry.coordinates);
tooltipPositions.push(pixelCoords);
tooltipPositionsIndex[pixelCoords.join(",")] = twitterUserFeatures[i].properties.screenName;
}
tooltipQuadtree.addAll(tooltipPositions);
d3.select('#tooltip').style('opacity', 0);
}
d3.geoZoom()
.projection(projection)
.northUp(true)
.onMove(drawWorld)
(d3.select(context.canvas).node());
drawWorld();
d3.select(context.canvas).on("mousemove click",function(){
let mouse = d3.mouse(this);
let closest = tooltipQuadtree.find(mouse[0], mouse[1], 10);
if(closest){
d3.select('#tooltip')
.style('opacity', 0.8)
.style('top', mouse[1] + 5 + 'px')
.style('left', mouse[0] + 5 + 'px')
.html("@"+tooltipPositionsIndex[closest.join(",")]);
} else {
d3.select('#tooltip')
.style('opacity', 0);
}
});
return container.node();
}