5

加载美国邮政编码 topojson 文件后,我在 d3.js 中遇到错误。groupdata在这一行未定义:

  function bind(group, groupData) {
     var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;

错误:

Uncaught TypeError: Cannot read property 'length' of undefined 

我正在调用和创建路径的代码是:

  d3.json("data/us-atlas/us-zipcodes.json", function(error, topology) {
  svg.selectAll("path")
      .data(topojson.feature(topology, topology.objects.zipcodes).features)
      .enter()
      .append("path")
      .attr("d", path)
  });

我从这个 repo 生成了 zipcode topojson 文件:https ://github.com/mbostock/us-atlas 。当我在加载时检查拓扑对象时,我在 topology.objects.zipcodes 下看到 32893 个弧。

我已经成功地使用 chloropleth 示例http://bl.ocks.org/mbostock/4060606加载了县,并且正在使用与此类似的模式。

我正在使用 d3.js 版本 3.2.8 和 topojson.js 版本 1.2.3。

有任何想法吗?它是一个错误的邮政编码文件还是我说错了?

4

1 回答 1

6

@Hugolpz - 抱歉,我没有回应。我没有收到您的评论的通知。

我终于弄明白了。我在这里记录它,所以也许它会对某人有所帮助。

我最初是从美国人口普查网站获得我的邮政编码 shapefile(目前由于政府关闭而关闭)。它被称为 tl_2012_us_zcta510.zip,大小为 836MB。我尝试使用此处建议的参数@mbostock 使用 topojson 对其进行转换:http: //bl.ocks.org/mbostock/4965422

转换花费了 12 多个小时,为 node.js 提供了 6GB 的内存来将 shapefile 转换为 topojson 文件。它仍然无法在 d3.js 中工作(请参阅原始问题中的错误)。此外,调试这么大的 json 文件很难调试。原始 shapefile 也不会显示在 QGIS 中。

我最终放弃并搜索了不同的数据集。Geocommons 有一个 5MB 的邮政编码 shapefile,其中包含邮政编码、州、名称、人口和区域等属性:http: //geocommons.com/overlays/54893。我把它交给了 topojson,它在一分钟内转换了 shapefile:

topojson \
-p name=PO_NAME \
-p zip=ZIP \
-p state=STATE \
-o zips_us_topo.json \
zip_codes_for_the_usa.shp

为了检查 json 文件以理解它,我使用了https://github.com/einars/js-beautify这个命令:

js-beautify zips_us_topo.json -o zips_us_topo_pretty.json

我使用非美化版本加载到浏览器中,因为它更小。

为了映射它,我基本上使用了与@mbostock 的县级叶绿素地图相同的代码。如果您需要它或 d3 代码或清理过的 topojson 文件,您可以在此处获取它们:

https://gist.github.com/jefffriesen/6892860

http://bl.ocks.org/jefffriesen/6892860

于 2013-10-09T03:18:33.537 回答