Прежде всего, первая строка вашего csv должна быть списком имен столбцов через запятую, чтобы использовать этот метод. Если это невозможно, добавьте комментарий об этом, и я посмотрю, смогу ли я решить, как использовать d3.csv.parseRows
вместо d3.csv.parse
. d3.csv.parse
вызывается функцией оценщика на .defer(function, url, assessor)
.
Я предполагаю, что ваш файл теперь выглядит так:
danger.csv
iso,level
AFG,100
ALB,0
DZA,12
...
Используя это, вы можете создать хеш поиска от ISO3 до уровня опасности.
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)
}
Код прохождение
var dangerByISO3 = d3.map();
Сначала вы создаете объект d3.map (), который будет функционировать в качестве ключевого хэша, и сохраняете его в переменной dangerByISO3.
queue()
Используйте очередь для параллельной загрузки.
.defer(d3.json, "url to topo.json")
Загрузите ваш топойсон в качестве первого аргумента, который будет передан функции await (после ошибки). Обратите внимание на стиль, в котором эта функция queue()
включена, но указана в отдельной строке (нет конечной точки с запятой queue()
).
.defer(d3.csv, "url to danger.csv", function(d) {dangerByISO3.set(d.iso, +d.level);})
Здесь происходят две вещи. Во-первых, вы загружаете danger.csv в качестве второго аргумента, который передается в функцию await. Как вы увидите ниже, этот аргумент фактически не используется. Вместо этого в функцию загрузки передается аргумент оценки d3.csv. Этот оценщик будет обрабатывать каждый ряд CSV. В этом случае мы вызываем функцию set для dangerByISO3, чтобы для каждой комбинации iso
клавиш мы указывали level
значение, соответствующее этой клавише. В +d.level
нотации используется унарный, +
чтобы привести значение d.level к числу.
.await(ready);
После загрузки обоих источников данных они передаются в качестве двух отдельных аргументов функции ready()
. Первым аргументом обратного вызова всегда является первая произошедшая ошибка. Если ошибки не произошло, то в качестве первого аргумента будет передано значение NULL. Второй аргумент - это первый источник данных (результат первой задачи), а третий аргумент - второй источник данных (результат второй задачи).
function ready(error, world) {...}
Это функция обратного вызова ready()
. Сначала мы возьмем error
аргумент, который должен быть нулевым, если две задачи загрузки завершены успешно (вы должны добавить язык для отлова и обработки ошибок). Далее мы берем данные топойсона как объект countries
. Эти данные должны быть обработаны в теле функции с чем-то вроде .data(topojson.feature(world,world.objects.countries).features)
. Поскольку ready()
третий аргумент не принимает, результат второй задачи, нашего csv, просто отбрасывается. Мы использовали его только для создания ключевого хэша, и после этого он нам не понадобился.