Javascript D3.js-从版本2中的path.area更改为版本4

Javascript D3.js-从版本2中的path.area更改为版本4,javascript,d3.js,topojson,cartogram,Javascript,D3.js,Topojson,Cartogram,我正在尝试更新以使用D3.js版本4。到目前为止,一切都进展顺利——我刚刚更新了所有函数,以便将它们写入版本4的扁平名称空间中。例如,它不是d3.geo.path(),而是d3.geoPath()。我还做了一些小改动,使代码能够与最新版本的配合使用。例如,它不是topojson.object(topology,geom).coordinates,而是topojson.feature(topology,geom).geometry.coordinates 但我遇到了一个似乎无法解决的问题。文件ca

我正在尝试更新以使用D3.js版本4。到目前为止,一切都进展顺利——我刚刚更新了所有函数,以便将它们写入版本4的扁平名称空间中。例如,它不是
d3.geo.path()
,而是
d3.geoPath()
。我还做了一些小改动,使代码能够与最新版本的配合使用。例如,它不是
topojson.object(topology,geom).coordinates
,而是
topojson.feature(topology,geom).geometry.coordinates

但我遇到了一个似乎无法解决的问题。文件
cartogram.js
有一行内容为
var areas=objects.map(path.area)
,其中
objects
是TopoJSON特性的集合<代码>路径.区域在D3.js版本2和4中有所不同,我似乎无法协调它们。如果我将其登录到每个版本中,看起来是这样的:

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

在版本4中,它记录错误:
uncaughttypeerror:r不是函数
。当然,我已经在谷歌上搜索了错误以及我试图做的各种描述,但我没有任何运气。提前感谢您的帮助。

正如Mark所建议的,您应该使用非精简代码进行调试。中的相关非精简代码如下所示:

path.area = function(object) {
  stream(object, projectionStream(pathArea));
  return pathArea.result();
};
您的错误表明
projectionStream
不是一个函数;它可能没有定义。投影流由设置,如文档所述,您指定的投影必须实现。(设置投影时不会强制执行此错误。尝试使用路径时会延迟抛出此错误。)

这里的问题是D33.x的path.projection支持“回退投影”的概念,这只是一个简单的函数,将经纬度数组作为输入,并返回一个x-y数组作为输出。D33.x会隐式地将其包装在默认的投影对象中,以添加自适应采样和反媒体切割等功能。D3 4.0删除了此功能,迫使您显式:必须实现projection.stream才能使用D3.geoPath

Per:

“回退投影”(当您将函数而不是投影传递给时)不再受支持。对于地理投影,请使用或定义自定义投影。对于任意几何体变换,实现;另见


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

正如Mark所建议的,您应该使用非精简代码进行调试。中的相关非精简代码如下所示:

path.area = function(object) {
  stream(object, projectionStream(pathArea));
  return pathArea.result();
};
您的错误表明
projectionStream
不是一个函数;它可能没有定义。投影流由设置,如文档所述,您指定的投影必须实现。(设置投影时不会强制执行此错误。尝试使用路径时会延迟抛出此错误。)

这里的问题是D33.x的path.projection支持“回退投影”的概念,这只是一个简单的函数,将经纬度数组作为输入,并返回一个x-y数组作为输出。D33.x会隐式地将其包装在默认的投影对象中,以添加自适应采样和反媒体切割等功能。D3 4.0删除了此功能,迫使您显式:必须实现projection.stream才能使用D3.geoPath

Per:

“回退投影”(当您将函数而不是投影传递给时)不再受支持。对于地理投影,请使用或定义自定义投影。对于任意几何体变换,实现;另见


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

有用的提示,加载未缩小版本的
d3
以便更好地了解您的错误…Harry,您是否最终为
d3.js
版本4创建了一个工作版本的
d3.cartogram
?还没有。忙着做其他事情。有用的提示,加载未缩小版本的
d3
,以便更好地了解您的错误…哈利,您是否最终为
d3.js
版本4创建了一个工作版本的
d3.cartogram
?还没有。忙着做其他事情。