【问题标题】:D3.js - Changes from path.area in version 2 to version 4D3.js - 从版本 2 中的 path.area 更改为版本 4
【发布时间】:2017-09-25 00:17:05
【问题描述】:

我正在尝试更新 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。当然,我已经用谷歌搜索了这个错误以及我正在尝试做的各种描述,但我没有任何运气。提前感谢您的帮助。

【问题讨论】:

  • 有用的提示,加载 non-minified 版本的d3 以便更好地了解您的错误...
  • Harry,你最终是否为 D3.js 第 4 版创建了 d3.cartogram 的工作版本?
  • 还没有。忙于其他事情。

标签: javascript d3.js topojson cartogram


【解决方案1】:

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

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

您的错误表明projectionStream 不是函数;它可能是未定义的。投影流由path.projection 设置,正如文档所述,您指定的投影 必须实现projection.stream。 (当你设置 projection 时,这个错误不是贪婪地强制执行的。当你尝试使用 path 时,它是懒惰地抛出的。)

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

CHANGES

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2016-11-26
    • 1970-01-01
    • 2017-05-17
    • 2021-05-21
    相关资源
    最近更新 更多