我使用栅格(d3.tile
和 map 库)和矢量(SVG 形状中的 TopoJSON)制作了有效的 D3 map 。但当我将它们组合起来时,我遇到了一个错误。
我遵循了 Mike Bostock 的光栅和矢量示例,尤其是他的 "Raster & Vector III" ,它会更改变换和描边宽度以更新矢量的显示方式。
我的 map 几乎完美运行。然而,加载后,仅显示光栅图 block ;向量是不可见的:
但是一旦我触发 d3.zoom
事件(通过平移或缩放),矢量就会显示:
我不明白这一点,因为我明确告诉浏览器,独立于缩放事件来绘制向量。这是相关片段:
// read in the topojson
d3.json("ausElectorates.json", function(error, mapData) {
if (error) throw error;
var electorates = topojson.feature(mapData, mapData.objects.tracts);
// apply a zoom transform equivalent to projection{scale,translate,center}
map.call(zoom)
.call(zoom.transform, d3.zoomIdentity
.translate(mapWidth / 2, mapHeight / 2)
.scale(1 << 12)
.translate(-centre[0], -centre[1]));
// draw the electorate vectors
vector.selectAll("path")
.data(electorates.features)
.enter().append("path")
.attr("class", "electorate")
.attr("d", path);
});
出于某种原因,d3.json()
函数的最后一行 - .attr("d", path")
- 没有可视化向量。
Click here查看 map 。 Click here访问完整代码及其使用的 TopoJSON。
我很想得到关于这个问题的建议,这让我很困惑!
(PS 对于省略 map 图 block 、D3.js 库等的版权归属表示歉意 - 我只是试图最小化此示例的代码。)
最佳答案
它正在绘制矢量 - 但是,您不能仅仅依靠使用 d3 geoProjection 缩放和平移矢量,因为当您缩放时,您会将平移和缩放应用于路径本身 - 而不是投影:
vector.selectAll("path")
.attr("transform", "translate(" + [change.x, change.y] + ")scale(" + change.k + ")")
.style("stroke-width", 1 / change.k);
由于您没有设置比例和平移,因此在加载矢量时它们无法正确绘制。它们画得非常小 - 因为您的投影比例为 1/tau
,翻译为 [0,0]
。检查页面加载时的 svg 表明它们在那里,而且很小。
解决方案是在 map.call("zoom")
之前绘制矢量 - 这样您可以在手动缩放之前在路径上应用基本变换(中心、变换和缩放) :
// read in the topojson
d3.json("ausElectorates.json", function(error, mapData) {
if (error) throw error;
var electorates = topojson.feature(mapData, mapData.objects.tracts);
// draw the electorate vectors
vector.selectAll("path")
.data(electorates.features)
.enter().append("path")
.attr("class", "electorate")
.attr("d", path);
// apply a zoom transform equivalent to projection{scale,translate,center}
map.call(zoom)
.call(zoom.transform, d3.zoomIdentity
.translate(mapWidth / 2, mapHeight / 2)
.scale(1 << 12)
.translate(-centre[0], -centre[1]));
});
关于javascript - 看不见的向量?组合 d3.tile()、d3.zoom() 和 TopoJSON 向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47737488/