我正在尝试为我的等值区域地图设置d3工具提示。我有工具提示工作,并能够从我用来分配地图颜色的lotteryMapNum.json中提取数据,但我无法显示任何文本。无论我做什么,我要么是“未定义”,要么是NaN。我想我需要以其他方式调用数据,但我不确定如何。
var newDict = {};
d3.json("data/myData/lotteryMapNum.json", function(data) {
data.forEach(function(d) { newDict[d.id] = +d.hopeDollars;})
data.forEach(function(d) { newDict[d.COUNTY] = +d.COUNTY;});
});
d3.json("data/myData/simpleGA.json", function(json) {
counties.selectAll("path")
.data(json.features)
.enter().append("svg:path")
.attr("class", function(d) { return quantize(newDict[d.id]);})
.attr("d", path)
.call(d3.helper.tooltip()
//.attr({class: function(d, i) { return d + ' ' + i + ' A'; }})
.text(function(d){ return 'value: '+newDict[d.id]+newDict[d.COUNTY]; })
)
.on('mouseover', function(d){ d3.select(this).style({fill: 'green', stroke: 'red'}); })
.on('mouseout', function(d){ d3.select(this).style({fill: '', stroke: ''}); });
});
lotteryMapNum.json
[
{"COUNTY":"APPLING",
"hopeDollars":12921240,
"id":"0"}
]
simpleGA.json
{
"type": "FeatureCollection",
"features": [
{ "type": "Feature", "id": 0, "properties": { "NAMELSAD10": "Appling County"}, "geometry": { "type": "Polygon", "coordinates": [ [ [ -83.04292, 30.947296 ], [ -83.05332, 30.94753 ],] ] } }
]
}
答案 0 :(得分:1)
1)看起来json.features中没有任何属性'd.COUNTY'... text()函数中的'd'引用dom元素上的数据,直接来自simpleGA .json('id'存在,但'COUNTY'不存在。)
相反,您可能想要参考:
d.properties['NAMELSAD10']
2)两个请求并行加载,但一个响应取决于另一个。在lotteryMapNum.json请求完成之前,simpleGA.json的完成代码可能正在执行...在这种情况下,'newDict'的元素可能仍未定义。
可能的解决方案是根据依赖关系链接两个请求:
var newDict = {};
d3.json("data/myData/lotteryMapNum.json", function(data) {
data.forEach(function(d) { newDict[d.id] = +d.hopeDollars;})
data.forEach(function(d) { newDict[d.COUNTY] = +d.COUNTY;});
d3.json("data/myData/simpleGA.json", function(json) {
counties.selectAll("path")
.data(json.features)
.enter().append("svg:path")
.attr("class", function(d) { return quantize(newDict[d.id]);})
.attr("d", path)
.call(d3.helper.tooltip()
//.attr({class: function(d, i) { return d + ' ' + i + ' A'; }})
.text(function(d){ return 'value: '+newDict[d.id]+newDict[d.COUNTY]; })
)
.on('mouseover', function(d){ d3.select(this).style({fill: 'green', stroke: 'red'}); })
.on('mouseout', function(d){ d3.select(this).style({fill: '', stroke: ''}); });
});
});
如果您需要更多帮助,请发布两个.json文件的链接,我可以使用jsfiddle进行更好的排查。
编辑:jsfiddle给了我很多大文件的问题...但这里基本上我的意思是数据库般的连接...也使用列表而不是geojson地图:// load json1
d3.json("lotterMapNum.json", function(lotterMapNum) {
// load json2
d3.json("simpleGA.json", function(simpleGA) {
for (var i = 0; i < simpleGA.features.length; i++) {
newDict[simpleGA.features[i].id] = simpleGA.features[i];
}
for (var j = 0; j < lotteryMapNum.length; j++) {
if (typeof newDict[lotteryMapNum[j].id] === 'undefined') {
newDict[lotteryMapNum[j].id] = {};
}
newDict[lotteryMapNum[j].id].hopeDollars = lotteryMapNum[j].hopeDollars;
newDict[lotteryMapNum[j].id].COUNTY = lotteryMapNum[j].COUNTY;
}
var counties = d3.select('#counties')
.data(newDict)
.enter()
.append('li')
.text(function(d){return d.id + ': ' + d.COUNTY + ', $' + d.hopeDollars;});
});
});
答案 1 :(得分:1)
d3.json("data/myData/lotteryMapNum.json", function(data) {
data.forEach(function(d) { newDict[d.id] = [+d.hopeDollars, d.COUNTY];});
然后只需以相同的方式访问欲望工具提示文本:
.text(function(d){ return 'value: '+ newDict[d.id][0] + newDict[d.id][1]; })