Генератор географических путей d3.geoPath() является
центральным механизмом библиотеки D3 для преобразования географических
данных в SVG или Canvas-представление. Он связывает абстрактные
геометрические описания в формате GeoJSON с конкретной графической
инструкцией отрисовки.
Основная задача генератора — преобразование координат долготы и широты в пиксельные координаты с учётом заданной географической проекции.
d3.geoPath() работает с объектами GeoJSON, поддерживая
следующие типы геометрии:
PointMultiPointLineStringMultiLineStringPolygonMultiPolygonGeometryCollectionFeatureFeatureCollectionКаждый объект интерпретируется как геометрическая структура на сфере, а не на плоскости, что принципиально отличает географическую визуализацию от обычной двумерной графики.
Генератор пути строится вокруг трёх ключевых компонентов:
Сигнатура:
const path = d3.geoPath();
По умолчанию используется проекция null, что означает
работу в сыром географическом пространстве без преобразования в экранные
координаты.
Проекция задаётся методом:
path.projection(projection);
Проекция определяет математическое отображение сферы на плоскость.
Пример использования:
const projection = d3.geoMercator()
.scale(150)
.translate([width / 2, height / 2]);
const path = d3.geoPath().projection(projection);
Проекция влияет на:
Особенность архитектуры заключается в том, что geoPath
не выполняет проекцию самостоятельно, а делегирует её объекту проекции,
соблюдая принцип разделения ответственности.
По умолчанию geoPath() возвращает строку атрибута
d для элемента <path>:
const d = path(geojsonFeature);
Результат:
"M10,20L30,40L50,60Z"
Этот режим используется для декларативного рендеринга в SVG.
При установке контекста:
const context = canvas.getContext("2d");
const path = d3.geoPath()
.projection(projection)
.context(context);
Генератор начинает напрямую вызывать Canvas API:
moveTolineToarcclosePathВ этом режиме строка d не создаётся, что значительно
повышает производительность при больших наборах данных.
Ключевая особенность geoPath() — использование потоковой
обработки.
Каждая геометрия разбивается на последовательность событий:
Проекция получает поток координат и трансформирует его без необходимости хранения всей структуры в памяти.
Это позволяет:
Точка отображается как окружность с фиксированным радиусом:
path.pointRadius(4);
Метод:
path(geojsonPoint);
Формирует окружность в SVG или arc в Canvas.
Линии преобразуются в последовательность сегментов:
Полигон включает:
Правило заполнения зависит от winding rule (ненулевое или even-odd), используемого SVG/Canvas.
Каждый полигон обрабатывается независимо, затем объединяется в общий путь.
Географическая особенность — разрыв по 180° долготы.
geoPath() автоматически разрезает линии, пересекающие
антимеридиан, предотвращая визуальные артефакты.
Это реализуется через:
path.projection(projection);
Устанавливает или возвращает текущую проекцию.
path.context(context);
Переключает режим вывода:
null → SVG stringCanvasRenderingContext2D → Canvas drawingpath.pointRadius(3);
Определяет радиус точек при отрисовке Point
геометрии.
При вызове генератора:
path(feature);
происходит цепочка преобразований:
geoPath() оптимизирован для работы с большими массивами
геоданных.
Ключевые факторы производительности:
Canvas-режим предпочтителен при:
SVG-режим предпочтителен при:
При отсутствии проекции:
const path = d3.geoPath();
координаты интерпретируются напрямую как x/y.
Это используется для:
Любая проекция в geoPath() вносит искажения:
Генератор не компенсирует эти эффекты, а только применяет заданную проекцию.
d3.geoPath() является частью более широкой системы:
d3-geod3-projectiond3-geo-streamОн не работает изолированно, а зависит от:
При обработке:
nullгенератор возвращает пустую строку ("") или не
производит отрисовку в Canvas.
Контекст может быть расширен для нестандартного рендеринга:
Контекст обязан реализовывать методы:
moveTolineToarcclosePathВ отличие от плоских систем координат, geoPath()
учитывает:
Это обеспечивает географически корректное отображение маршрутов и границ.