Skip to content

RU Геометрические потоки

mingun edited this page Jun 16, 2014 · 1 revision

ВикиСправка по APIГеографияГеометрические потоки
English | Русский

Для быстрого преобразования геометрии без создания временных копий геометрических объектов, D3 использует геометрические потоки. Главный метод d3.geo.stream конвертирует входной объект GeoJSON в поток: серию вызовов методов на слушателе потока. Кроме того, D3 предоставляет несколько преобразований потоков, которые оборачивают слушатели и трансформируют геометрию. Например, интерфейс projection.stream преобразует сферические координаты в декартовы координаты, а d3.geo.path сериализует геометрию в SVG или холст. Реализации обрезания и поворота так же используют потоковые преобразования.

# d3.geo.stream(object, listener)

Направляет указанный объект GeoJSON object в указанный поток listener (несмотря на название «stream», этот метод в настоящее время вызывается синхронно). Хотя в качестве входных параметров поддерживаются как характеристики, так и геометрические объекты, потоковый интерфейс описывает только геометрию и поэтому дополнительные свойства характеристик не будут видны в слушателях.

Слушатели потока

Слушатели потока должны реализовывать несколько методов для обхода геометрии. Слушатели по своей природе обладают состоянием; это означает, что результат вызова point зависит от того, находится точка внутри линии, а линия внутри кольца в многоугольнике.

# listener.point(x, y[, z])

Определяет точку с указанными координатами x и y (и необязательной координатой z). Система координат не определяется и зависит от реализации; например, проецирующие потоки требуют в качестве входных параметров сферические координаты в градусах. Вне контекста многоугольника или линии точка определяет геометрический объект точки (Point или MultiPoint). Внутри линии или кольца многоугольника точка определяет контрольную точку.

# listener.lineStart()

Определяет начало линии или кольца. Внутри многоугольника определяет начало кольца. Первое кольцо многоугольника является внешним и обычно обходится по часовой стрелке. Любые последующие кольца определяют отверстия в многоугольнике и обычно обходятся против часовой стрелки.

# listener.lineEnd()

Определяет конец линии или кольца. Внутри многоугольника определяет конец кольца. В отличии от GeoJSON, избыточная закрывающая координата кольца не указывается через point, а неявно указывается через lineEnd внутри многоугольника. Таким образом, данный входной многоугольник:

{
  "type": "Polygon",
  "coordinates": [
    [[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]
  ]
}

приведёт к следующей серии вызовов методов слушателя:

listener.polygonStart();
listener.lineStart();
listener.point(0, 0);
listener.point(1, 0);
listener.point(1, 1);
listener.point(0, 1);
listener.lineEnd();
listener.polygonEnd();

# listener.polygonStart()

Определяет начало многоугольника. Первая линия многоугольника определяет внешнее кольцо, а любые последующие линии определяют внутренние отверстия.

# listener.polygonEnd()

Определяет конец многоугольника.

# listener.sphere()

Определяет сферу (глобус; единичная сфера с центром в точке ⟨0, 0, 0⟩).

Потоковые преобразования

Потоковые преобразования оборачивают слушатели потока, трансформируя геометрию до её передачи в обёрнутый слушатель. Одним из примеров потоковых преобразований являются географические проекции. Класс d3.geo.transform предоставляет простой способ реализации собственных потоковых преобразований.

# d3.geo.transform(methods)

Создаёт новое потоковое преобразование, используя указанную таблицу методов methods. Таблица может содержать реализации любых стандартных методов слушателя потока: sphere, point, lineStart, lineEnd, polygonStart и polygonEnd. Любой метод, не представленный в указанной таблице, будет реализован передачей управления непосредственно в обёрнутый поток. Для доступа к обёрнутому потоку внутри метода используйте this.stream. К примеру, реализуем простое двумерное матричное преобразование:

function matrix(a, b, c, d, tx, ty) {
  return d3.geo.transform({
    point: function(x, y) { this.stream.point(a * x + b * y + tx, c * x + d * y + ty); },
  });
}

Это преобразование затем может использоваться совместно с d3.geo.path. Например, для реализации двумерного аффинного преобразования отражения по оси y:

var path = d3.geo.path()
    .projection(matrix(1, 0, 0, -1, 0, height));

# transform.stream(listener)

По указанному слушателю потока listener возвращает обёрнутый слушатель потока, который применяет данное преобразование к любой входной геометрии перед передачей её в обёрнутый слушатель.

# d3.geo.clipExtent()

Создаёт новое потоковое преобразование, которое реализует отсечение прямоугольником, выровненным по осям координат. Оно обычно используется для обрезания геометрии по области просмотра после проецирования.

# clipExtent.extent([extent])

Если указан параметр extent, устанавливает размеры обрезания в указанный прямоугольник [​[x0, y0], [x1, y1]​] и возвращает преобразование. Если параметр extent не указан, возвращает текущие размеры обрезания, которые по умолчанию установлены в [​[0, 0], [960, 500]​].

Clone this wiki locally