D3.js 循环过渡并按给定顺序显示国家

D3.js 循环过渡并按给定顺序显示国家,d3.js,D3.js,我正在使用迈克·博斯托克的世界巡演地图,我想做一些修改 1) 我想在最后一个国家的展览后重播动画 2) 不按名称DESC排序,我想按tsv文件上的行号定义顺序 我曾尝试在转换中添加重播功能,但运气不佳,我似乎无法真正理解它是如何工作的,因此我需要一些帮助 function ready(error, world, names) { if (error) throw error; var globe = {type: "Sphere"}, land = topojson.fea

我正在使用迈克·博斯托克的世界巡演地图,我想做一些修改

1) 我想在最后一个国家的展览后重播动画

2) 不按名称DESC排序,我想按tsv文件上的行号定义顺序

我曾尝试在转换中添加重播功能,但运气不佳,我似乎无法真正理解它是如何工作的,因此我需要一些帮助

function ready(error, world, names) {
  if (error) throw error;

  var globe = {type: "Sphere"},
      land = topojson.feature(world, world.objects.land),
      countries = topojson.feature(world, world.objects.countries).features,
      borders = topojson.mesh(world, world.objects.countries, function(a, b) { return a !== b; }),
      i = -1,
      n = countries.length;

  countries = countries.filter(function(d) {
    return names.some(function(n) {
      //if (d.id == n.id) return d.name = n.name;
      if (d.id == n.id) {
          d.name = n.name;
          d.org = n.org;
          return d;
      }
    });
  }).sort(function(a, b) {
    return a.name.localeCompare(b.name);
  });

  (function transition() {
    d3.transition()
        .duration(1250)
        .each("start", function() {
          var data_pais = countries[i = (i + 1) % n]
          title.text(data_pais.name);
          subtitle.text(data_pais.org);
        })
        .tween("rotate", function() {
          var p = d3.geo.centroid(countries[i]),
              r = d3.interpolate(projection.rotate(), [-p[0], -p[1]]);
          return function(t) {
            projection.rotate(r(t));
            c.clearRect(0, 0, width, height);
            c.fillStyle = "#ccc", c.beginPath(), path(land), c.fill();
            c.fillStyle = "#f00", c.beginPath(), path(countries[i]), c.fill();
            c.strokeStyle = "#fff", c.lineWidth = .5, c.beginPath(), path(borders), c.stroke();
            c.strokeStyle = "#000", c.lineWidth = 2, c.beginPath(), path(globe), c.stroke();
          };
        })
      .transition()
        .each("end", transition);
  })();
}

bl.ock中的原始代码实际上是重复的(不过我还没有看到)。显示的国家/地区位于以下部分:

title.text(countries[i = (i + 1) % n].name);
这允许列表重复。然而,n是由地理特征的数量而不是TSV中条目的数量定义的。如果你想访问每一个国家,这是很好的,但如果你想访问一些国家,就不那么好了。因此,您可以将n重新定义为:

 n = names.length;
至于排序,如果您只想删除字母排序,您应该能够删除

 .sort(function(a, b) {
return a.name.localeCompare(b.name)
但是,现在默认的显示顺序将是世界json中功能的顺序。为了改变这一点,我尝试将“order”列应用于TSV,并将该值应用于排序:

countries = countries.filter(function(d) {
return names.some(function(n) {
   if (d.id == n.id) { return  [d.order = n.order, d.name = n.name] }
   })
}).sort(function(a, b) {
   return +a.order - +b.order; 
});
这使用了一个名为“order”的TSV列,尽管可能会有更优雅的方法使用行编号

同样重要的是要注意,TSV中的初始条目(标有负数的条目)在地图上不作为特征存在,因此明智的做法是不要在任何自定义TSV中使用它们

我认为问题中引用的bl.ock可能会停在萨摩亚上,从最后的第三个,因为我在测试这个解决方案时遇到了一些困难,删除它修复了这个问题。它可能不是json世界中的一个特性。因此,可能还有其他一些原因导致打嗝


示例:

bl.ock中的原始代码实际上是重复的(但我还没有看到这一点)。显示的国家/地区位于以下部分:

title.text(countries[i = (i + 1) % n].name);
这允许列表重复。然而,n是由地理特征的数量而不是TSV中条目的数量定义的。如果你想访问每一个国家,这是很好的,但如果你想访问一些国家,就不那么好了。因此,您可以将n重新定义为:

 n = names.length;
至于排序,如果您只想删除字母排序,您应该能够删除

 .sort(function(a, b) {
return a.name.localeCompare(b.name)
但是,现在默认的显示顺序将是世界json中功能的顺序。为了改变这一点,我尝试将“order”列应用于TSV,并将该值应用于排序:

countries = countries.filter(function(d) {
return names.some(function(n) {
   if (d.id == n.id) { return  [d.order = n.order, d.name = n.name] }
   })
}).sort(function(a, b) {
   return +a.order - +b.order; 
});
这使用了一个名为“order”的TSV列,尽管可能会有更优雅的方法使用行编号

同样重要的是要注意,TSV中的初始条目(标有负数的条目)在地图上不作为特征存在,因此明智的做法是不要在任何自定义TSV中使用它们

我认为问题中引用的bl.ock可能会停在萨摩亚上,从最后的第三个,因为我在测试这个解决方案时遇到了一些困难,删除它修复了这个问题。它可能不是json世界中的一个特性。因此,可能还有其他一些原因导致打嗝


示例:

嘿,安德鲁,你的名字说得对。长度位,谢谢!。自定义排序不起作用,为了以防万一,我删除了排序代码并将tsv传递到csv文件,但它以字母顺序显示国家。啊,是的,我想我应该在测试时交换顺序。我想我设法解决了这个问题;在一些有限的测试中,我管理了一个定制订单。我已经用一些额外的代码更新了答案。嘿,安德鲁,关于名字你是对的。长度位,谢谢!。自定义排序不起作用,为了以防万一,我删除了排序代码并将tsv传递到csv文件,但它以字母顺序显示国家。啊,是的,我想我应该在测试时交换顺序。我想我设法解决了这个问题;在一些有限的测试中,我管理了一个定制订单。我已经用一些额外的代码更新了答案。