Primeiro, a primeira linha do seu csv deve ser uma lista separada por vírgula de nomes de colunas para usar esse método. Se isso não for possível, adicione um comentário sobre isso e verei se consigo descobrir como usar em d3.csv.parseRows
vez de d3.csv.parse
. d3.csv.parse
é chamado pela função avaliador em .defer(function, url, assessor)
.
Vou assumir que seu arquivo agora está assim:
danger.csv
iso,level
AFG,100
ALB,0
DZA,12
...
Com isso, você pode criar um hash de pesquisa do ISO3 para o nível de perigo.
var dangerByISO3 = d3.map();
queue()
.defer(d3.json, "url to topo.json")
.defer(d3.csv, "url to danger.csv", function(d) {dangerByISO3.set(d.iso, +d.level);})
.await(ready);
function ready(error, world) {
//You now have world as your available topojson
//And you have dangerByISO3 as your danger level hash
//You can lookup a danger level by dangerByISO3.get(ISO3 code)
}
Passo a passo do código
var dangerByISO3 = d3.map();
Primeiro, você cria um objeto d3.map () que funcionará como seu hash da chave e o armazena na variável dangerByISO3.
queue()
Use fila para carregamento paralelo.
.defer(d3.json, "url to topo.json")
Carregue seu topojson como o primeiro argumento a ser passado para a função de espera (após erro). Observe o estilo aqui em que esta função está encadeada queue()
, mas listada em uma linha separada (não há ponto e vírgula final queue()
).
.defer(d3.csv, "url to danger.csv", function(d) {dangerByISO3.set(d.iso, +d.level);})
Duas coisas estão acontecendo aqui. Primeiro, você está carregando danger.csv como seu segundo argumento a ser passado para a função de espera. Como você verá abaixo, esse argumento não é realmente usado. Em vez disso, é fornecido um argumento de avaliador para a função de carregamento, d3.csv. Esse avaliador processará cada linha do csv. Nesse caso, chamamos a função set em dangerByISO3 para que, para cada combinação de uma iso
chave, definamos level
como o valor correspondente a essa chave. A +d.level
notação usa unário +
para coagir o valor de d.level a um número.
.await(ready);
Depois que as duas fontes de dados são carregadas, elas são passadas como dois argumentos separados para a função ready()
. O primeiro argumento para o retorno de chamada é sempre o primeiro erro que ocorreu. Se nenhum erro ocorreu, nulo será passado como o primeiro argumento. O segundo argumento é a primeira fonte de dados (resultado da primeira tarefa) e o terceiro argumento é a segunda fonte de dados (resultado da segunda tarefa).
function ready(error, world) {...}
Esta é a função de retorno de chamada ready()
. Primeiro, tomamos o error
argumento que deve ser nulo se as duas tarefas de carregamento forem concluídas com êxito (você deve realmente adicionar linguagem para capturar e manipular erros). A seguir, tomamos os dados do topojson como objeto countries
. Esses dados devem ser processados no corpo da função com algo parecido .data(topojson.feature(world,world.objects.countries).features)
. Como ready()
não adota um terceiro argumento, o resultado da segunda tarefa, nosso csv, é simplesmente descartado. Nós o usamos apenas para criar o hash da chave e não precisamos dele depois disso.