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

时间:2017-04-27 09:23:39

标签: javascript d3.js topojson cartogram

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

1 个答案:

答案 0 :(得分: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将隐式地将其包装在默认投影对象中,以添加自适应采样和antimedirian切割等功能。 D3 4.0删除了此功能,强制您明确:您必须实现投影 .stream才能使用d3.geoPath。

CHANGES

  

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

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