2014-09-27 52 views
0

首先,请原谅我可怜的英语。
我正在使用网格地图和外部csv进行项目工作。用下拉按钮更新一张等值线地图

网格图不是由矩形或六边形组成的,而是仅与将在末尾使用的任何种类的符号的质心组成。
所以我有一个Topojson文件,质心“ID”和质心“坐标”。

外部CSV由多列组成,第一列具有相同的质心“ID”,另一列具有不同年份的值。

"ID","C2001","C2002","C2003","C2004","C2005","C2006","C2007","C2008","C2009","C2010","C2000" 
6050,"-5.55753","-5.55914","-5.75444","-5.76307","-5.81660","-5.99361","-6.02150","-6.15979","-5.73530","-6.30509","-5.52990" 
6051,"-5.55753","-5.55914","-5.75444","-5.76307","-5.81660","-5.99361","-6.02150","-6.15979","-5.73530","-6.30509","-5.52990" 

这里是我的代码

var width = 960, 
    height = 600; 

var options = [ 
    {date: "2000", selected: "+d.C2000"}, 
    {date: "2001", selected: "+d.C2001"}, 
    {date: "2002", selected: "+d.C2002"}, 
    {date: "2003", selected: "+d.C2003"}, 
    {date: "2004", selected: "+d.C2004"}, 
    {date: "2005", selected: "+d.C2005"}, 
    {date: "2006", selected: "+d.C2006"}, 
    {date: "2007", selected: "+d.C2007"}, 
    {date: "2008", selected: "+d.C2008"}, 
    {date: "2009", selected: "+d.C2009"}, 
    {date: "2010", selected: "+d.C2010"}, 
]; 


var color = d3.scale.threshold() 
    .domain([-1985, -1400, -1000, -700, -300, -100, -25, -0]) 
    .range(["#7f0000", "#b30000", "#d7301f", "#ef6548", "#fc8d59", "#fdbb84", "#fdd49e", "#fee8c8", "#fff7ec"]); 

var path = d3.geo.path() 
    .projection(null) 
    .pointRadius(1.5); 

var svg = d3.select("body").append("svg") 
    .attr("width", width) 
    .attr("height", height); 


queue() 
    .defer(d3.json, "CO2_light.json") 
    .defer(d3.csv, "tdd_CO2_emissions.csv") 
    .await(ready); 

function ready(error, centroid, CO2) { 

    var rateById = {}; 

    console.log(rateById); //To 

    //CO2.forEach(function(d) { rateById[+d.ID] = +d.C2000; }); WORKING FINE = value in rateById 
    CO2.forEach(function(d) { rateById[+d.ID] = options[0].selected; }); //NOT WORKING = inside rateById "+d.C2000" instead the value 

    svg.selectAll("path") 
     .data(topojson.feature(centroid, centroid.objects.CENTROID).features) 
     .enter().append("path") 
     .attr("class", "centerGrid") 
     .attr("d", path) 
     .style("fill", function(d) { return color(rateById[+d.properties.ID]); }); 

    d3.select(".loading").remove(); 

目前我离开按钮,我的下一个问题,我下面

//CO2.forEach(function(d) { rateById[+d.ID] = +d.C2000; }); WORKING FINE = value in rateById 
CO2.forEach(function(d) { rateById[+d.ID] = options[0].selected; }); //NOT WORKING = inside rateById "+d.C2000" instead the value 

集中在这两个线路如果我使用第一行我得到一个很好的网格地图(see image),但如果我试图从第二行options阵列访问特定年份的值,并且执行console.log(rateById);我得到小号

Object 
6050: "+d.C2000" 
6051: "+d.C2000" 
6712: "+d.C2000" 

取而代之的是

Object 
6050: -6.30509 
6051: -6.30509 
6712: -7.0441 
+0

'rateById [+ d.ID] = options [0] .selected;'只是做你要求它做的事情。 options [0] .selected的值是“+ d.C2000”。您想要查找二氧化碳文件的值,为此,您需要正确格式化csv文件数据(在对象中,以便能够根据年份和质心ID访问值)。你会介意创建一个jsfiddle让它更容易帮助你吗? – 2014-09-27 15:54:05

+0

它在那里:[jsfiddle链接](http://jsfiddle.net/z7sLdyu2/1/)非常感谢 – 2014-09-27 16:19:49

回答

1

固定在这里:http://jsfiddle.net/z7sLdyu2/2/

2发生在你的代码来完成:

首先,你的选项中选择不应包含的JavaScript代码是执行(+d.),但只有年份值:

var options = [ 
    {date: "2000", selected: "C2000"}, 
    {date: "2001", selected: "C2001"}, 
    {date: "2002", selected: "C2002"}, 
    {date: "2003", selected: "C2003"}, 
    {date: "2004", selected: "C2004"}, 
    {date: "2005", selected: "C2005"}, 
    {date: "2006", selected: "C2006"}, 
    {date: "2007", selected: "C2007"}, 
    {date: "2008", selected: "C2008"}, 
    {date: "2009", selected: "C2009"}, 
    {date: "2010", selected: "C2010"} 
]; 

然后在循环中,通过访问数据d属性选择像今年这样分配rateById值:

rateById[+d.ID] = +d[options[0].selected];

PS:我不得不在你的jsfiddle删除代码的一部分,在您的jsfiddle版本中找不到质心json,从而导致与此问题无关的错误。

+0

rateById函数中必需的加号+ d.ID是否必需? .ID值不是整数。 – 2014-09-27 17:43:38

+0

你不需要Ids的+符号,你可以摆脱它。 – 2014-09-27 20:55:17

+0

你回答的太快了,我现在不能在那里。它的工作就像一个魅力! _Mécibeaucoup!_(法语) – 2014-09-28 07:32:46