1

我正在尝试更新d3-cartogram以使用 D3.js 版本 4。到目前为止,一切都很好 - 我刚刚更新了所有函数,以便将它们写入版本 4 的扁平命名空间中。例如, 而不是d3.geo.path(), 它是d3.geoPath(). 我还更改了一些小东西,以便代码可以与最新版本的TopoJSON 一起使用。例如,不是topojson.object(topology, geom).coordinates,而是topojson.feature(topology, geom).geometry.coordinates

但是我遇到了一个我似乎无法解决的问题。该文件cartogram.js有一行内容为var areas = objects.map(path.area),其中objects是 TopoJSON 功能的集合。path.area在 D3.js 版本 2 和 4 中有所不同,我似乎无法调和它们。如果我在每个版本中进行控制台登录,它看起来像这样:

  • 版本 2:function (n){return n&&e.hasOwnProperty(n.type)?e[n.type](n):t}
  • 版本 4:function (t){return U_(t,r(Ag)),Ag.result()}

在版本 4 中,它记录错误:Uncaught TypeError: r is not a function. 自然,我已经用谷歌搜索了这个错误以及我正在尝试做的各种描述,但我没有任何运气。提前感谢您的帮助。

4

1 回答 1

5

正如 Mark 建议的那样,您应该使用非缩小代码进行调试。来自path/index.js的相关非缩小代码如下所示:

path.area = function(object) {
  stream(object, projectionStream(pathArea));
  return pathArea.result();
};

您的错误说这projectionStream不是功能;它可能是未定义的。投影流由path .projection设置,正如文档所述,您指定的投影必须实现projection .stream(设置投影时不会贪婪地强制执行此错误。尝试使用路径时会延迟抛出。)

这里的问题是 D3 3.x 的路径.projection 支持“后备投影”的概念,这只是一个将经纬度数组作为输入并返回 xy 数组作为输出的裸函数。D3 3.x 会隐式地将其包装在默认投影对象中,以添加自适应采样和反时子切割等功能。D3 4.0 删除了这个特性,迫使你明确:你必须实现投影.stream 才能使用 d3.geoPath。

每次更改

“后备投影”——当你将一个函数而不是一个投影传递给路径.projection时——不再受支持。对于地理投影,使用d3.geoProjectiond3.geoProjectionMutator定义自定义投影。对于任意几何变换,实现流接口;另见d3.geoTransform

每当您寻求帮助时,我建议您链接到演示您的问题的实时示例,因为一小段代码和描述通常不足以隔离问题。在这里不清楚您要与 d3.geoPath 一起使用什么投影。对于平面变换,您很可能希望使用 d3.geoTransform 或 d3.geoIdentity。对于球面到平面的投影,您需要使用 d3.geoProjection 或 d3.geoProjectionMutator。

于 2017-04-27T14:49:49.260 回答