2014-12-18 19 views
25

Quindi sto sperimentando un po 'con D3's geo streamAPI e le cose mi sembrano un po' confuse. Ho letto attraverso la documentazione qui:Qual è il modo corretto di usare projection.stream() di D3?

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

Un punto di confusione che ho è la corretta attuazione di trasformazioni flusso. Diciamo che creo uno:

//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 la documentazione, this.stream riferimenti al "flusso incapsulato". Ma qual è il flusso, davvero? Da quello che posso raccogliere, è più una procedura che una struttura dati esplicita - una sequenza di chiamate di dati e funzioni per trasformare i dati. La sintassi di cui sopra sembra suggerire che il flusso incapsulato è semplicemente l'oggetto contenente "stream listeners"

Passando, io sono in grado di applicare il flusso di trasformare utilizzando il metodo della proiezione:

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

Mentre I don' Per comprendere appieno le meccaniche di base, l'effetto sembra relativamente semplice: la funzione di trasformazione sottostante del generatore di percorsi viene chiamata con argomenti trasformati x,y.

Per il mio caso d'uso, non lo trovo così utile, soprattutto perché i miei dati di input non sono già stati proiettati. Mi piacerebbe utilizzare una proiezione per trasformare prima i dati, quindi trasformare quelle coordinate in output. A tal fine, esiste un modello generale per la stratificazione delle trasformazioni?

vedo che D3 fornisce la projection.stream (ascoltatore) modello cui si applica la proiezione di trasformare la prima, prima di applicare l'ascoltatore, ma non sono sicuro come implementare questa. Quale dovrebbe essere l'argomento dell'ascoltatore? Ecco un esempio: http://jsfiddle.net/kv7yn8rw/2/.

Qualsiasi consiglio sarebbe molto apprezzato!

+0

Stai cercando di spostare il 20px mappa di dati proiettato verso destra e 5px verso il basso usando questo metodo? O c'è altro che stai cercando di fare quando ti riferisci alle trasformazioni di stratificazione? – Elijah

+0

Mi spiace che bounty non abbia generato alcuna risposta. Ho iniziato a guardare attraverso il codice sorgente, ma la mia ipotesi migliore era che 'var path2 = d3.geo.path(). Projection (proj.stream (transform));' avrebbe dovuto funzionare per il tuo violino, e stava ancora generando errori. Potrei tornare di nuovo quando avrò più tempo; Volevo imparare di più su come funzionano i metodi d3.geo. – AmeliaBR

risposta

4

Un fatto chiave da the documentation è che "una proiezione geografica è un esempio di una trasformazione di flusso".

Gli stream consentono di trasformare i dati (ad esempio progetto) più volte senza salvare i dati intermedi. Una proiezione può essere solo un oggetto con un attributo stream, ad es. proj_then_transform qui sotto.

Il modo per i flussi della catena è la seguente:

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

ho aggiornato l'esempio con una soluzione di lavoro: http://jsfiddle.net/cvs5d7o9/2/

+0

Giusto per capire l'ordine delle cose correttamente, la funzione è chiamata proj_then_transform, ma sembra che la trasformazione stia avendo luogo per prima, e poi viene alimentata alla proiezione.Dovrebbe essere così? – Brideau