Подтвердить что ты не робот

Каков правильный способ использования D3 projection.stream()?

Итак, я немного экспериментирую с D3 geo stream API, и все кажется немного туманным. Я читал здесь документацию:

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 ссылается на "завернутый поток". Но что такое поток, на самом деле? Из того, что я могу собрать, это скорее процедура, чем явная структура данных - последовательность вызовов данных и функций для преобразования данных. Синтаксис выше, по-видимому, предполагает, что обернутый поток - это просто объект, содержащий " потоковые прослушиватели"

Двигаясь дальше, я могу применить преобразование потока с помощью метода проецирования:

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

Пока я не совсем понимаю основную механику, эффект кажется относительно простым: основная трансформационная функция генератора путей вызывается с преобразованными аргументами x,y.

В моем случае использования я не считаю это полезным, особенно потому, что мои исходные данные еще не проецируются. Я хотел бы использовать проекцию, чтобы сначала преобразовать данные, а затем преобразовать полученные выходные координаты. С этой целью существует общий шаблон для преобразований слоев?

Я вижу, что D3 предоставляет шаблон projection.stream(listener), который сначала применяет проецирующее преобразование, прежде чем применять слушателя, но я не уверен, как это реализовать. Каким должен быть аргумент слушателя? Вот пример: http://jsfiddle.net/kv7yn8rw/2/.

Любое руководство будет принята с благодарностью!

4b9b3361

Ответ 1

Ключевым фактом из документации является то, что "Географическая проекция является одним из примеров преобразования потока".

Потоки позволяют просто несколько раз преобразовывать (например, проект) данные без сохранения промежуточных данных. Проекция может быть просто объектом с атрибутом потока, например. 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/