使用D3的projection.stream()的正确方法是什么?

时间:2014-12-18 23:47:44

标签: d3.js geo d3.geo

所以我在D3's geo stream API进行了一些实验,感觉有些模糊。我一直在阅读这里的文档:

https://github.com/mbostock/d3/wiki/Geo-Streams

我遇到的一个困惑是流转换的正确实现。假设我创建一个:

//a stream transform that applies a simple translate [20,5]:
var transform = d3.geo.transform({
    point:function(){this.stream.point(x+20,y+5)}
}) 

根据文档, this.stream 引用“包装流”。但是什么是流,真的吗?从我可以收集到的,它更多的是一个过程而不是显式数据结构 - 一系列数据和函数调用来转换数据。上面的语法似乎表明包装的流只是包含“stream listeners

的对象

继续,我可以使用投影方法应用流变换:

//a path generator with the transform applied using the projection() method
var path = d3.geo.path().projection(transform);

虽然我不太了解底层的机制,但效果似乎相对简单:路径生成器的底层转换函数是使用转换的x,y参数调用的。

对于我的用例,我认为这没有用,特别是因为我的输入数据尚未投影。我想首先使用投影来转换数据,然后转换那些输出的坐标。为此,是否存在分层变换的一般模式?

我看到D3确实提供了projection.stream( listener )模式,它在应用侦听器之前首先应用了投影变换,但我不知道如何实现这个。听众的论点应该是什么?这是一个例子:http://jsfiddle.net/kv7yn8rw/2/

非常感谢任何指导!

1 个答案:

答案 0 :(得分:4)

来自the documentation的关键事实是 "地理投影是流变换的一个例子。"

Streams只允许多次转换(例如投影)数据而不保存中间数据。投影可以只是具有流属性的对象,例如, proj_then_transform以下{/ 1}}。

链流的方式如下:

// stream 1
var proj = d3.geo.equirectangular();
// stream 2
var transform = d3.geo.transform({
    point:function(x,y){this.stream.point(x+20,y+5)}
});
// stream 1 then stream 2
var proj_then_transform = {
        stream: function(s) { 
            return proj.stream(transform.stream(s)); 
        }
     };

我已使用有效的解决方案更新了示例: http://jsfiddle.net/cvs5d7o9/2/