3

我正在制作一张地图,其中我首先使用 GeoJSON 文件定义的路径定义状态轮廓,以及一些额外的信息,例如状态名称。加载后,我想填充状态并根据来自 csv 的数据填充工具提示,使用一些按钮和复选框(年份,不同的数据子集)。

我发现当我第二次使用 csv 而不是 json 文件在状态对象上调用 .data() 时,路径会消失,因为它们只存在于 json 中。有没有办法只能更新某些变量?有没有更好的方法将状态对象绑定到动态数据?

4

1 回答 1

2

我通常采用的方法以及在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);
      });
}
于 2012-08-29T18:36:43.537 回答