D3js как мне раскрасить отдельные части карты?

#javascript #svg #d3.js

Вопрос:

Я хочу раскрасить разные части карты разными цветами в зависимости от существующего значения. Карта разделена на округа, и у меня есть значения для каждого округа, которые я хочу перевести в цвет. Это мой код для попытки раскрасить карту.

Диапазон, который я установил, находится между [ 40, 19054 ] . Он хорошо работает, окрашивая всю карту в один цвет, поэтому, например, установка цвета(19000) сделает всю карту красной.

 let topo = json.features  let datas = aggCounties    d3.json("/counties.json").then(function(json) {  function getCountPerKOMKODE() {  for (let i = 0; i lt; topo.length; i  ) {  for (let j = 0; j lt; datas.length; j  ) {  let jsonKOMKODE = json.features[i].properties.KOMKODE;  let csvKOMKODE = datas[j].kommune_kode  let csvCOUNT =  datas[j].count    if (csvKOMKODE == jsonKOMKODE) {  return csvCOUNT  }  }  }    }  }   let color = d3.scaleQuantize()  .domain(d3.extent(getRangeDomain()))  .range(["white", "pink", "red"])    let g = svg.append("g");    g.selectAll("path").append("g")  .data(topo)  .enter()  .append('path')  .attr('class', 'county')  .attr("d", path)  .style('fill', color(getCountPerKOMKODE()))  });  

Мне кажется, что я неправильно понимаю процесс того, как окрашена карта? Из того, что я читал, он должен ориентироваться на отдельные пути и применять заданный цвет/значение?

Спасибо

РЕДАКТИРОВАТЬ — проблема решена, благодаря @AndrewReid, см. Обновления кода ниже:

 function getCountPerKOMKODE(path) {  for (let j = 0; j lt; datas.length; j  ) {  // var jsonKOMKODE = json.features[j].properties.KOMKODE;  let csvKOMKODE = datas[j].kommune_kode  let csvCOUNT =  datas[j].count   if (csvKOMKODE == path) {  return csvCOUNT  }  }  }  g.selectAll("path").append("g")  .data(topo)  .enter().append('path').attr('class', 'county')  .attr("d", path).style('fill', function(d,i) {  let komkode = d.properties.KOMKODE  return color(getCountPerKOMKODE(komkode))  })  

И вуаля, карта теперь раскрашена.

Комментарии:

1. Можете ли вы поделиться этой функцией getCountPerCounty() ? Если вы изменили имя для удобства чтения в вопросе , и это getCountPerKOMKODE функция, которая не принимает параметров, как будет извлекаться другое значение при каждом ее вызове и как это возвращаемое значение будет соотноситься с путем, который вы раскрашиваете?

2. @AndrewReid извини, это опечатка! Исправил это сейчас. Он не принимает параметров, потому что проверяет, что коды округов равны из json и csv-файла, а затем возвращает соответствующее значение из числа столбцов csv-файла, в котором сопоставлен этот код округа. Я надеюсь, что в этом есть смысл. Поэтому, если код округа из json равен 600, он находит то же значение в csv и возвращает соответствующее количество.

3. @AndrewReid О, вы имеете в виду, что он должен иметь параметр со значением пути, а затем проверить значение этого пути в функции? Да, я вижу, что это недостаток..

4. В настоящее время вы создаете путь для каждого элемента(/функции) в topo . Вы можете получить доступ к этим связанным данным (функции) с .style('fill', function(d,i) { /* logic */ return color(value) }) помощью » где d находится эта функция (и i ее индекс)». Это должно помочь вам избежать необходимости использовать цикл topo «для». В качестве альтернативы вы можете задать свойство каждого объекта в цикле for, а затем получить к нему доступ при передаче значения цвету.

5. О, ты только что заставил так много вещей щелкать для меня, ха-ха, большое спасибо, теперь это работает. Мне просто нужно добавить лучшую цветовую схему, чтобы подстроиться под диапазон значений, но наконец-то есть цвета ура!