You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D3.js如何根据对应数值为地图各区县区域单独设置填充颜色

D3.js 区县地图按数值着色问题及解决

我希望根据每个区县对应的数值,为地图上的不同区域设置不同的填充色。该地图已经拆分为区县板块,我已经拿到了每个区县对应的数值,想要将数值映射为对应的颜色。
我设置的数值范围为[ 40, 19054 ],一开始测试给整个地图设置单一颜色是正常的,比如设置color(19000)可以让整个地图变为红色。

以下是最初尝试实现地图着色的代码:

let topo = json.features
let datas = aggCounties

d3.json("/counties.json").then(function(json) {
  function getCountPerKOMKODE() {
    for (let i = 0; i < topo.length; i++) {
      for (let j = 0; j < 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()))
});

我当时的疑问是,按查阅的资料,应该可以单独定位到每个path元素,为其应用对应的颜色/数值才对,问题到底出在哪里?

错误原因

核心问题有两处:

  1. 最初的getCountPerKOMKODE函数没有传入当前路径对应的区县编码,调用时只会返回第一个匹配到的数值,所有路径共用同一个数值计算颜色,自然只能显示单一颜色
  2. 给fill样式赋值时直接执行了颜色计算,仅得到一个固定颜色值应用到所有路径,没有为每个路径单独计算对应数值的映射颜色

最终解决代码

修改后的代码如下,修改后地图已经可以正常按区县对应数值着色:

function getCountPerKOMKODE(path) {
  for (let j = 0; j < datas.length; j++) {
    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))
  })

内容的提问来源于stack exchange,提问作者Plewis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:15:07