2014-12-18 128 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

相關問題