2014-12-18 34 views
25

Więc eksperymentuję trochę z D3's geo streamAPI, a rzeczy wydają się nieco mgliste. Czytałem poprzez dokumentację tutaj:Jaki jest właściwy sposób korzystania z projection.stream() D3?

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

Jeden punkt zamieszania mam jest właściwa realizacja transformacji strumienia. Powiedzmy, że tworzę One:

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

Per dokumentacji this.stream References "owinięty stream". Ale jaki jest strumień? Z tego co mogę zebrać, jest to raczej procedura niż jawna struktura danych - sekwencja wywołań danych i funkcji w celu transformacji danych. Powyższa składnia wydaje się sugerować, że owinięty strumień jest po prostu obiekt zawierający „stream listeners

Idąc dalej, jestem w stanie zastosować strumień przekształcać stosując metodę projekcji:

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

Podczas I don” Zupełnie zrozumiemy mechanikę leżącą u podstaw, efekt wydaje się stosunkowo prosty: podstawowa funkcja transformacji generatora ścieżek jest wywoływana z przekształconymi argumentami x,y.

Dla mojego przypadku użycia, nie uważam tego za pomocne, szczególnie, że moje dane wejściowe nie są już wyświetlane. Chciałbym użyć rzutowania, aby najpierw transformować dane, a następnie przekształcać te wyjściowe współrzędne. W tym celu istnieje ogólny wzór transformacji warstwowych?

widzę, że D3 ma zapewnić projection.stream (słuchacza) wzorzec, który ma zastosowanie wystająca przekształcić pierwszy, przed nałożeniem słuchacza, ale nie jestem pewien, jak zaimplementować to. Jaki powinien być argument słuchacza? Oto przykład: http://jsfiddle.net/kv7yn8rw/2/.

Wszelkie wskazówki będą mile widziane!

+0

starasz się przenieść swój projektowany 20px danych map w prawo i 5px w dół za pomocą tej metody? Czy jest coś więcej, co próbujesz zrobić, kiedy odwołujesz się do transformacji warstwowych? – Elijah

+0

Niestety, nagroda nie wygenerowała żadnych odpowiedzi. Zacząłem przeglądać kod źródłowy, ale zgadywałem, że 'var path2 = d3.geo.path(). Projection (proj.stream (transform));' powinien działać dla twojego skrzypiec, i wciąż był wyrzucaniem błędów. Mogę wrócić, gdy będę mieć więcej czasu; Chciałem dowiedzieć się więcej o tym, jak działają metody d3.geo. – AmeliaBR

Odpowiedz

4

Kluczowym faktem z the documentation jest to, że "rzutowanie geograficzne jest jednym z przykładów przekształcenia strumienia."

Strumienie pozwalają na wielokrotne przekształcanie danych (np. Projektów) bez zapisywania danych pośrednich. Rzut może być po prostu obiektem z atrybutem strumienia, np. proj_then_transform poniżej.

Droga do strumieni łańcucha jest następujący:

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

zaktualizowałem przykład z roztworu roboczego: http://jsfiddle.net/cvs5d7o9/2/

+0

Po prostu, aby zrozumieć porządek rzeczy poprawnie, funkcja nazywa się proj_then_transform, ale wygląda na to, że transformacja odbywa się najpierw, a następnie jest przekazywana do projekcji.Czy tak powinno być? – Brideau