我已经成功地在d3-tile(栅格)地图的顶部分层了一个D3(矢量)地图,该地图从Mapbox中提取了切片.手动缩放功能完美,矢量和光栅同步.
我现在正在尝试实现Mike Bostock的" 缩放到边界框 "功能,应用程序可以在用户点击时缩放所需的国家/地区.我想我差不多了,但是现在似乎有一个不匹配,地图缩小到外太空,可以这么说.
我在这个jsfiddle中重现了这个问题.
在"缩放"功能中需要修改什么才能使地图正确缩放并按预期进行?我认为这就是问题所在:
vector.selectAll("path")
.attr("transform", "translate(" + [transform.x, transform.y] + ")scale(" + transform.k + ")")
.style("stroke-width", 1 / transform.k);
Run Code Online (Sandbox Code Playgroud)
编辑:看起来主要问题只是投影的更新
这里的主要问题是您要根据缩放来更改投影并从中计算边界框。
放大后,你会看到这一行:
projection.scale...
Run Code Online (Sandbox Code Playgroud)
看起来您正在尝试根据缩放来更新投影,但平移和缩放已经由transform
svg 元素的属性处理。
相反,投影用于将球面地理坐标转换为二维空间。它用于计算一个国家/地区的边界,如果它发生变化,边界就会移动,这可能是无意的。删除此投影更新可以让您顺利完成大部分工作。
另一个大问题是,您将点击处理程序中的比例限制为远低于您需要的值(例如,您将比例限制为最大值 8,但初始比例为 4096)。
移除夹子和投影更新应该可以让您点击缩放国家/地区。但我们还没有完成!
另一个问题是您的reset
函数不会重置为原始视图,这使得它缩小到远处。使用初始缩放设置并不能解决d3.zoomIdentity
问题。
这些编辑的结果在这里:https://jsfiddle.net/m7cn0p47/99/
更改许多 DOM 节点通常效率很低。在这种情况下,您将更改 中的每个路径向量zoomed
。相反,将变换应用于一个g
元素(在本例中g
为具有 id 的元素vector
)通常会更有效。
代替:
vector.selectAll("path")
.attr("transform", "translate(" + [transform.x, transform.y] + ")scale(" + transform.k + ")")
.style("stroke-width", 1 / transform.k);
Run Code Online (Sandbox Code Playgroud)
您可以将其更改为简单的:
vector
.attr("transform", "translate(" + [transform.x, transform.y] + ")scale(" + transform.k + ")")
.style("stroke-width", 1 / transform.k);
Run Code Online (Sandbox Code Playgroud)
您还必须stroke-width
从 CSS 中的路径中删除,因为它会覆盖它。
以下是这些更改和更正的更新小提琴:https://jsfiddle.net/m7cn0p47/96/