我正在以这种方式导入svg(从服务器充当静态内容)
d3.xml("http://localhost:3000/mysvg.svg", "image/svg+xml", function(xml) {
var importedNode = document.importNode(xml.documentElement, true);
var mySvg = d3.select("#somediv").node().appendChild(importedNode);
然后我试图遍历所有svg路径并用它们做点什么
d3.selectAll("#somediv svg path").each(function(d, i) {
console.log(this, d, i);
});
}
我得到的是这个问题
i
是从1到路径的数量,这是正确的。
d
是undefined
,而不是正确的svg路径元素。
this
是svg路径元素,就像这个
<path id="m021" fill="#00AAFF" d="M225.438,312.609c-0.665-1.084-1.062-1.691-2.368-1.963c-0.582-0.121-1.686-0.271-2.265-0.069 c-0.507,0.174-0.637,0.649-1.431,0.368c-0.934-0.33-0.665-1.272-0.71-2.104c-0.597-0.021-1.18,0-1.733,0.262 ...etc" ></path>
我希望d
成为真正的svg路径,为什么不呢?
对我想做的事情有点了解可能有所帮助。
我有一个svg,我的城镇的每个区都有一条路径。我想在每条路径的中心制作一些饼图。我现在没有数据,它将用于饼图。我想在路径上创建鼠标悬停功能,并在每条路径上添加一个小红圈(在未来的步骤中将成为饼图)。
这样做的最佳方式是什么?
答案 0 :(得分:6)
简化原始请求,假设您想在每个区域的中心添加一个圆圈。让我们假设这些地区相对平方。请注意,如果您有地理数据而不是路径,这将更加简单。
var svg = d3.select("#somediv svg");
var districts = svg.selectAll("path");
var district_centers = districts[0].map(function(d, i) {
var bbox = this.getBBox();
return [bbox.left + bbox.width/2, bbox.top + bbox.height/2];
});
svg
.selectAll("circle")
.data(district_centers)
.enter()
.append("circle")
.attr("class", "district_circle")
.attr("cx", function(d){ return d[0]})
.attr("cy", function(d){ return d[1]})
.attr("r", 10)
.attr("fill", "red");
答案 1 :(得分:3)
根据API doc for selection.each,d应该是数据,如果之前没有调用.data()将数据绑定到节点,则不应该使用该数据。你所拥有的只是纯SVG,没有数据绑定它。
我注意到你的路径确实有ID,所以如果你有一个匹配这些ID的数据集,你可以使用keys parameter of the .data function
绑定它。