d3如何在缩放的地图中正确更新svg圆半径?

时间:2014-02-26 19:10:43

标签: svg d3.js

我正在制作一个由维度归类的意大利城市地图(更多人 - >更大半径)
这里是预览(检查完整代码)http://www.danielepennati.com/prove/mapping/ita_popolazione.html
当你放大地图我缩放半径,它工作正常

s = d3.event.scale; //s is defined in the main function  
g.selectAll('circle')
  .attr("r", function(d) { return raggioCittà(rateByIdCF[d.id][anno]) / s; })

如果您使用地图左侧的选项更改年份并使用新数据更新圆半径...如果地图未缩放,则一切顺利 如果地图是缩放的,我尝试设置缩放的半径(如果我记录了半径的值是正确的),但是在圆形元素的“r”值中,它是未缩放的,圆圈显然是太大了 这是更新年份选择圈子的代码:

g.selectAll(".punto_comun")
        .data(topojson.feature(base, base.objects.com2011_g).features)
        .attr('fill', function(d) { 
          if(rateByIdCF[d.id]){
            if(raggioCittà(rateByIdCF[d.id][anno]) < 4){ return '#0042b0'}
          }
          return '#ff0000';
        })
        .attr("r", function(d) { 
          if(rateByIdCF[d.id]){
            //check if map is scaled, if yes scale the radius down
            if(s){ return raggioCittà(rateByIdCF[d.id][anno] / s);  }
            //if not use the standard radius
            return raggioCittà(rateByIdCF[d.id][anno]); 
          }
        })  

我真的不明白为什么它不能正常工作......也许我对缩放行为缺失了一些东西 我真的很感激任何建议 感谢
丹尼尔

1 个答案:

答案 0 :(得分:0)

问题是以下代码结构:

var s;

function move(s, t) {
  s = ...;
}

s变量指的是不同的东西。顶级s在函数s的声明中被move遮蔽。也就是说,s内的move是指第一个参数,而不是全局s。对它的任何更改只会影响该参数(因此只有本地范围),而不会影响您想要更改的s

要修复,只需使用不同的变量名称。