You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

D3加载GeoJSON可生成路径但TopoJSON路径为空问题咨询

嘿,这问题我熟!刚用D3玩TopoJSON的时候踩过一模一样的坑~核心原因是TopoJSON和GeoJSON的结构完全不是一回事,D3的地理路径生成器(d3.geoPath)不认原生的TopoJSON,必须先转成GeoJSON格式才能用。下面给你拆解具体原因和解决办法:

1. 最常见的错误:没把TopoJSON转成GeoJSON

GeoJSON是直接存储地理要素(比如多边形、点)的格式,所以你加载后直接拿data.features就能用;但TopoJSON是经过拓扑压缩的,它存的是共享的弧段数据,不是直接的图形路径。必须用topojson.feature()工具把它转换成GeoJSON结构,D3才能识别。

2. 容易忽略的细节:图层名称要对应

TopoJSON文件里通常会把地理要素放在objects属性下的某个子对象里,比如你的Arizona数据可能存在topoData.objects.Arizona或者topoData.objects.arizona(注意大小写!),你得准确指定这个图层名,不然转换出来的GeoJSON是空的,自然没有<path>d属性。

3. 别漏了引入TopoJSON工具库

D3本身不包含TopoJSON的解析工具,你得额外引入topojson-client(可以用CDN或者npm安装),不然topojson.feature()这个方法会直接报错,导致转换失败。

给你改个示例代码对比

原来的GeoJSON加载代码:

d3.json('geojson/Arizona.geojson')
  .then(geoData => {
    d3.select('svg g')
      .selectAll('path')
      .data(geoData.features)
      .enter()
      .append('path')
      .attr('d', d3.geoPath());
  });

修改后的TopoJSON加载代码:

// 先确保引入了topojson-client,比如用CDN
// <script src="https://unpkg.com/topojson-client@3"></script>

d3.json('topojson/Arizona.topo.json')
  .then(topoData => {
    // 关键一步:转换TopoJSON到GeoJSON,替换成你实际的图层名
    const geoData = topojson.feature(topoData, topoData.objects.Arizona);
    
    d3.select('svg g')
      .selectAll('path')
      .data(geoData.features)
      .enter()
      .append('path')
      .attr('d', d3.geoPath());
  });

排查小技巧

  • 打开浏览器控制台,看看有没有报错:如果提示topojson is not defined,就是没引库;如果提示Cannot read properties of undefined,大概率是图层名称写错了。
  • 打印topoData看看结构,确认objects下面的子对象名称到底是什么。

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

火山引擎 最新活动