-
Notifications
You must be signed in to change notification settings - Fork 1
RU Геометрические потоки
Вики ▸ Справка по 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]].