因此,我使用默认的 d3.behavior.zoom() 和限制以防止地图被完全拖出页面,得到了一个带有鼠标缩放的世界地图。开始工作很痛苦,但现在可以工作了。
我现在的问题是该项目还需要界面中无用的缩放 + 和 - 按钮,我找不到具有两种缩放类型的示例。它要么是仅鼠标缩放,要么是仅通过按钮进行的糟糕缩放。
我试着简单地调用 zoom.scale(newScale); 但它不更新任何东西。我似乎走在正确的轨道上,因为在控制台中您可以看到比例已更新,但没有更新,当我用鼠标缩放时,它突然跳到使用按钮定义的比例。但似乎我还需要更新翻译,我不确定如何像地图中心一样计算缩放到那里所需的翻译。
我还需要知道如何在调用 zoom.scale(newScale); 后更新投影。如果这是这样做的方法。
我用缩放按钮做了一个简化的演示,显然现在不起作用。 http://bl.ocks.org/jfmmm/f5c62bc056e557b80447
谢谢!
编辑:现在如此接近,它缩放到地图的中心,因为我使用与计算屏幕中间相同的计算,但使用了新的比例。问题是我希望它放大屏幕中间的对象,而不是地图中间的国家。
function zoomBtn(action) {
var currentZoom = zoom.scale();
if( action == 'in' ){
if(currentZoom < options.maxZoomLevel){
var newScale = Math.floor(currentZoom) + 1;
var b = path.bounds(mapFeatures);
var t = [(width - newScale * (b[1][0] + b[0][0])) / 2, (height - newScale * (b[1][1] + b[0][1])) / 2];
zoom.scale(newScale)
.translate(t)
.event(svg);
}
}else{
if(currentZoom > options.minZoomLevel){
var newScale = Math.floor(currentZoom) - 1;
var b = path.bounds(mapFeatures);
var t = [(width - newScale * (b[1][0] + b[0][0])) / 2, (height - newScale * (b[1][1] + b[0][1])) / 2];
zoom.scale(newScale)
.translate(t)
.event(svg);
}
}
}
我会在一分钟内更新我的示例。