我正在尝试使用topjson加载D3地图并使用单独的CSV文件加入我想用来为地图着色的数据。我可以在多个图层之间切换,但不是每次都不重绘地图。我已经在董事会上搜索了一些关于如何做到这一点的线索,但我似乎无法弄明白。任何人都可以提供任何帮助吗?
我希望将CSV和JSON数据分开,以防我们想要动态编辑CSV。我想一次性将相关类添加到每个国家/地区,或者在用户在三个按钮之间切换时添加和删除类。要么对我有用,我似乎无法弄明白该怎么做。
var width = 945
var height = 550
var svg = d3.select('#content').append('svg').attr('width', width).attr('height', height);
var projection = d3.geo.mercator().scale(175);
var path = d3.geo.path().projection(projection);
var all_data = {};
var tierById = d3.map();
var quantize = d3.scale.quantize()
.domain([0, 1])
.range(d3.range(2).map(function(i) { return "tier" + i; }));
queue()
.defer(d3.json, "data/world.json")
.defer(d3.csv, "data/wod.csv")
.await(setUpChoropleth);
function setUpChoropleth(error, json) {
svg.append("g")
.attr("class", "countries")
.selectAll("path")
.data(topojson.feature(json, json.objects.countries).features)
.enter().append("svg:path")
.attr("d", path);
}
function drawTierI() {
queue()
.defer(d3.json, "data/world.json")
.defer(d3.csv, "data/wod.csv", function(d) { tierById.set(d.id, +d.tier_i); })
.await(ready);
function ready(error, json) {
svg.append("g")
.attr("class", "countries")
.selectAll("path")
.data(topojson.feature(json, json.objects.countries).features)
.enter().append("path")
.attr("class", function(d) { return quantize(tierById.get(d.id)); })
.attr("d", path);
}
}
function drawTierII() {
queue()
.defer(d3.json, "data/world.json")
.defer(d3.csv, "data/wod.csv", function(d) { tierById.set(d.id, +d.tier_ii); })
.await(ready);
function ready(error, json) {
svg.append("g")
.attr("class", "countries")
.selectAll("path")
.data(topojson.feature(json, json.objects.countries).features)
.enter().append("path")
.attr("class", function(d) { return quantize(tierById.get(d.id)); })
.attr("d", path);
}
}
function drawTierIIPlus() {
queue()
.defer(d3.json, "data/world.json")
.defer(d3.csv, "data/wod.csv", function(d) { tierById.set(d.id, +d.tier_ii_plus); })
.await(ready);
function ready(error, json) {
svg.append("g")
.attr("class", "countries")
.selectAll("path")
.data(topojson.feature(json, json.objects.countries).features)
.enter().append("path")
.attr("class", function(d) { return quantize(tierById.get(d.id)); })
.attr("d", path);
}
}
$('button#tier_i').click(function (e) {
$( "svg" ).empty();
drawTierI();
});
$('button#tier_ii').click(function (e) {
$( "svg" ).empty();
drawTierII();
});
$('button#tier_ii_plus').click(function (e) {
$( "svg" ).empty();
drawTierIIPlus();
});
这是我的代码的一个小问题:http://jsfiddle.net/2H7Pm/但是,我似乎在那里遇到了一些JSON的语法问题。
示例地图可以在我的github上工作:http://newamericafoundation.github.io/worldofdrones/
感谢您的帮助!
答案 0 :(得分:1)
您只需选择现有路径,而不是在初始设置等值时添加新路径,例如
function drawTierI() {
csv.forEach(function(d) { tierById.set(d.id, +d.tier_i); });
function ready(error, json) {
svg.selectAll("path")
.attr("class", function(d) { return quantize(tierById.get(d.id)); })
.attr("d", path);
}
}
和其他功能类似。您不需要在每一步重新加载JSON和CSV - 上面的代码假设您的CSV数据存储在变量csv
中,您将填充这些变量:
var csv;
function setUpChoropleth(error, json, _csv) {
csv = _csv;
// rest of setup
}
然后你可以简单地做
$('button#tier_i').click(function (e) {
drawTierI();
});
更改显示的变量,而无需先清空SVG。