D3.js - JSON数据数组将相同的数组元素绑定到所有内容

时间:2015-10-02 08:24:23

标签: javascript d3.js

我正在加载包含对象数组的GeoJSON数据文件,每个对象包含不同国家/地区轮廓的矢量信息。相同的数组元素绑定到每个DOM元素。我之前在JavaScript中遇到过这个范围问题,但我所做的每一项更改都没有引起任何问题。

我附上jsfiddle。我使用一个示例数据文件,似乎需要几秒钟才能加载。

来自jsfiddle的代码如下:

U1.departments

1 个答案:

答案 0 :(得分:12)

您不需要遍历各种功能。您的数据文件是一个FeatureCollection,D3 can draw,作为单个路径元素:

svg.append("path").datum(data).attr("d", d3.geo.path());

或作为单独的路径元素,每个功能(国家/地区)一个:

svg.selectAll("path").data(data.features)
  .enter().append("path").attr("d", d3.geo.path())

默认情况下,D3使用投影d3.geo.albersUsa()将夏威夷带到墨西哥和阿拉斯加,就在热带之外。您可以切换到equirectangular projection以查看整个世界:



d3.json(
  "https://raw.githubusercontent.com/datasets/geo-boundaries-world-110m/6cf0946a0f4d027d21686e8402f19b524c4f6385/countries.geojson",
  function(error, data) {
    var projection = d3.geo.equirectangular();
    var path = d3.geo.path().projection(projection);
    var width = 960;
    var height = 600;
    var svg = d3.select("body").append("svg")
      .attr("width", width)
      .attr("height", height);

    svg.selectAll("path")
      .data(data.features)
      .enter().append("path")
      .attr("d", path)
      .attr("fill", "#3e429a");
  }
);

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
&#13;
&#13;
&#13;

结语:我最初尝试使用更常见的Mercator projection,但却发现it cannot handle Antarctica。 D3绘制了大陆的形状,然后填充其余的海洋。

在同一个D3论坛帖子中,D3 mentioned a bug in the TopoJSON tool的作者用于生成地图,因此可能是您使用的数据文件存在问题。如果您更喜欢墨卡托,您可能需要与geo-boundaries-world-110m的维护者一起修复数据文件,或者只是从地图中排除南极洲。

墨卡托的南极洲演示:

&#13;
&#13;
d3.json(
  "https://raw.githubusercontent.com/datasets/geo-boundaries-world-110m/6cf0946a0f4d027d21686e8402f19b524c4f6385/countries.geojson",
  function(error, data) {
    var projection = d3.geo.mercator();
    var path = d3.geo.path().projection(projection);
    var width = 960;
    var height = 600;
    var svg = d3.select("body").append("svg")
      .attr("width", width)
      .attr("height", height);

    var antarctica = data.features.splice(6, 1);
    // now "data" has the rest of the world
    svg.selectAll("path")
      .data(antarctica)
      .enter().append("path")
      .attr("d", path)
      .attr("stroke", "red").attr("stroke-width", 10)
      // thick borders so we can see the odd paths
      .attr("fill", "#3e429a");
  }
);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
&#13;
&#13;
&#13;