2014-12-18 5 views
25

Also experimentiere ich ein bisschen mit D3's geo streamAPI, und die Dinge fühlen sich ein wenig verschwommen. Ich habe hier durch die Dokumentation gelesen:Was ist die richtige Art, D3 project.stream() zu verwenden?

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

Ein Punkt der Verwirrung ich habe, ist die ordnungsgemäße Durchführung des Strom verwandelt. Sagen wir, ich schaffen ein:

//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 Dokumentation, this.stream verweist auf den "wrapped Strom." Aber was ist der Strom wirklich? Von dem, was ich sammeln kann, ist es eher eine Prozedur als eine explizite Datenstruktur - eine Folge von Daten- und Funktionsaufrufen, um die Daten zu transformieren. Die Syntax scheint oben zu legen nahe, dass der umhüllte Strom ist einfach das Objekt enthält „stream listeners

Umzug auf, ich bin in der Lage, den Strom anwenden verwandle die Projektionsmethode:

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

Während ich don‘ Um die zugrunde liegende Mechanik zu verstehen, scheint der Effekt relativ einfach zu sein: Die zugrundeliegende Transformationsfunktion des Pfadgenerators wird mit transformierten x,y Argumenten aufgerufen.

Für meinen Anwendungsfall finde ich das nicht hilfreich, insbesondere weil meine Eingabedaten nicht bereits projiziert werden. Ich würde gerne eine Projektion verwenden, um die Daten zuerst zu transformieren und dann diese ausgegebenen Koordinaten zu transformieren. Gibt es zu diesem Zweck ein allgemeines Muster für Schichttransformationen?

Ich sehe, dass D3 die projection.stream bereitstellt (Zuhörer) Muster, das zuerst die vorstehende Transformation gilt, vor dem Zuhörer der Anwendung, aber ich bin nicht sicher, wie dies zu implementieren. Was sollte das Argument des Zuhörers sein? Hier ein Beispiel: http://jsfiddle.net/kv7yn8rw/2/.

Jede Anleitung würde sehr geschätzt werden!

+0

Versuchen Sie, Ihre projizierten Kartendaten 20px nach rechts zu bewegen und 5px runter mit dieser Methode? Oder versuchen Sie mehr, wenn Sie sich auf Layer-Transformationen beziehen? – Elijah

+0

Entschuldigung, das Kopfgeld hat keine Antworten generiert. Ich fing an, den Quellcode durchzusehen, aber meine beste Vermutung war, dass 'var path2 = d3.geo.path() .projection (proj.tream (transform));' sollte für Ihre Geige arbeiten, und es war immer noch Fehler werfen. Ich könnte wiederkommen, wenn ich mehr Zeit habe; Ich wollte mehr darüber lernen, wie die d3.geo-Methoden funktionieren. – AmeliaBR

Antwort

4

Eine wichtige Tatsache aus the documentation ist, dass "eine geographische Projektion ist ein Beispiel für eine Stream-Transformation."

Streams ermöglichen es nur einem, Daten mehrfach zu transformieren (z. B. zu projizieren), ohne die Zwischendaten zu speichern. Eine Projektion kann einfach ein Objekt mit einem Stream-Attribut sein, z. proj_then_transform unten.

Der Weg zur Kettenströme ist wie folgt:

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

ich das Beispiel mit einer Arbeitslösung aktualisiert haben: http://jsfiddle.net/cvs5d7o9/2/

+0

Nur um die Reihenfolge der Dinge richtig zu verstehen, heißt die Funktion proj_then_transform, aber es sieht so aus, als ob die Transformation zuerst stattfindet, und dann wird das der Projektion zugeführt.Sollte das der Fall sein? – Brideau