我是d3.js的菜鸟。我使用topoJSON数据来渲染地图,到目前为止它一直很好用。现在我想在每个国家/地区的顶部覆盖一些数据,如文字或圆圈,我正在撞墙。我有类似的代码:
var countries = g.append("g")
.attr("id", "countries")
.selectAll("path")
.data(topojson.feature(collection, collection.objects.countries).features)
.enter().append("path")
.attr("d", path)
.style("fill", colorize)
.attr("class", "country")
.on("click", clicked)
正确呈现我的地图。为了覆盖它上面的一些圆圈,我执行以下操作:
countries
.append("circle")
.attr("r", function(d, i, j) {
return 10; // for now
})
// getCentroid below is a function that returns the
// center of the poligon/path bounding box
.attr("cy", function(d, i, j) { return getCentroid(countries[0][j])[0]})
.attr("cx", function(d, i, j) { return getCentroid(countries[0][j])[1]})
.style("fill", "red")
这非常繁琐(特别是它访问国家/地区数组的方式),但它成功地为代表国家/地区的每条路径添加了一个圆圈。问题是圆圈存在于SVG标记中,但在文档中根本不显示。我显然做错了什么,但我不知道它是什么。
答案 0 :(得分:2)
问题是,您要将circle
元素附加到path
元素,而这些元素在SVG中无法做到。您需要将它们附加到父g
元素。代码看起来像这样。
var countries = g.selectAll("g.countries")
.data(topojson.feature(collection, collection.objects.countries).features)
.enter().append("g")
.attr("id", "countries");
countries.append("path")
.datum(function(d) { return d; })
.attr("d", path)
// etc
countries.append("circles")
// etc