2014-12-18 38 views
25

所以我用D3's geo streamAPI做了一点试验,感觉有点朦胧。我一直在读通过这里的文档:使用D3的projection.stream()的正确方法是什么?

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); 

虽然我不不太了解底层机制,效果看起来相对简单:路径生成器的底层变换函数用变换后的参数调用。

对于我的用例,我觉得这没有什么帮助,特别是因为我的输入数据还没有投射出来。我想先使用投影来转换数据,然后转换那些输出的坐标。为此,是否有一种分层转换的一般模式?

我看到D3并提供projection.stream其应用突出的第一变换,将听者之前(听众)的模式,但我不知道如何实现这一点。听众的论点应该是什么?这里有一个例子:http://jsfiddle.net/kv7yn8rw/2/

任何指导,将不胜感激!

+0

你是不是想你的投影地图数据20像素向右移动和5px下来使用这种方法?或者当你参考分层转换时你有更多的尝试做什么? – Elijah 2014-12-26 16:25:00

+0

对不起,赏金还没有任何答案。我开始浏览源代码,但我最好的猜测是'var path2 = d3.geo.path()。projection(proj.stream(transform));'应该为你的小提琴起作用,而且它仍然会抛出错误。当我有更多的时间时,我可能会再回来;我一直想要了解更多关于d3.geo方法的工作原理。 – AmeliaBR 2014-12-29 17:25:30

回答

4

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

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

到链流的方法如下:

// 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/

+0

只是为了正确理解事物的顺序,函数被称为proj_then_transform,但它看起来像是首先发生变换,然后将其馈送到投影。情况应该如此吗? – Brideau 2015-11-26 16:07:48

相关问题