我正在制作一张地图,其中我首先使用 GeoJSON 文件定义的路径定义状态轮廓,以及一些额外的信息,例如状态名称。加载后,我想填充状态并根据来自 csv 的数据填充工具提示,使用一些按钮和复选框(年份,不同的数据子集)。
我发现当我第二次使用 csv 而不是 json 文件在状态对象上调用 .data() 时,路径会消失,因为它们只存在于 json 中。有没有办法只能更新某些变量?有没有更好的方法将状态对象绑定到动态数据?
我正在制作一张地图,其中我首先使用 GeoJSON 文件定义的路径定义状态轮廓,以及一些额外的信息,例如状态名称。加载后,我想填充状态并根据来自 csv 的数据填充工具提示,使用一些按钮和复选框(年份,不同的数据子集)。
我发现当我第二次使用 csv 而不是 json 文件在状态对象上调用 .data() 时,路径会消失,因为它们只存在于 json 中。有没有办法只能更新某些变量?有没有更好的方法将状态对象绑定到动态数据?
我通常采用的方法以及在choropleth map example中设置代码的方式是分别加载这两个文件,然后在需要时加入 feature id 上的数据。如果您按顺序加载文件,这是最简单的,如下所示:
// make a container
var counties = svg.append("svg:g")
.attr("id", "counties");
// load the data you're showing
d3.json("unemployment.json", function(data) {
// load the geo data (you could reverse the order here)
d3.json("us-counties.json", function(json) {
// make the map
counties.selectAll("path")
.data(json.features)
.enter().append("svg:path")
.attr("d", path);
// now join the data, maybe in a separate function
update(data)
});
});
在您的update()
函数中,您获取数据并将操作(颜色等)应用于基于 id 的地图:
update(data) {
// look at the loaded counties
counties.selectAll("path")
// update colors based on data
.attr('fill', function(d) {
// get the id from the joined GeoJSON
var countyId = d.id;
// get the data point. This assumes your data is an object; if your data is
// a CSV, you'll need to convert it to an object keyed to the id
var datum = data[countyId];
// now calculate your color
return myColorScale(datum);
});
}