Извлечение частей геометрий

Работа с геометриями в геопространственных данных часто требует не только построения и анализа объектов, но и их разбиения, извлечения отдельных сегментов, пересечения или выделения подмножеств координат. Библиотека Turf.js предоставляет набор инструментов, позволяющих выполнять такие операции над GeoJSON-геометриями без необходимости подключать тяжёлые ГИС-системы.

Извлечение частей геометрий в Turf.js строится вокруг нескольких категорий операций:

  • разбиение линий и полигонов
  • извлечение подотрезков
  • обрезка по границам
  • преобразование геометрий в составные элементы
  • фильтрация координат и сегментов

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


Представление геометрий и базовая модель работы

Turf.js оперирует стандартом GeoJSON. Основные типы:

  • Point
  • LineString
  • Polygon
  • MultiLineString
  • MultiPolygon

Любая операция извлечения частей геометрии в конечном счёте сводится к манипуляции массивами координат:

const line = {
  type: "Feature",
  geometry: {
    type: "LineString",
    coordinates: [
      [0, 0],
      [10, 10],
      [20, 20]
    ]
  }
};

Координаты всегда представлены в порядке [долгота, широта], что критично при геометрических преобразованиях.


Разбиение линий на сегменты

lineChunk — разбиение на равные отрезки

Функция lineChunk используется для разбиения линии на части фиксированной длины.

import lineChunk from "@turf/line-chunk";

const chunks = lineChunk(line, 5, { units: "kilometers" });

Каждый фрагмент представляет собой самостоятельный LineString. Внутренне происходит интерполяция точек вдоль линии с учётом геодезического расстояния.

Ключевые особенности:

  • сохраняется порядок сегментов
  • длина сегментов приближённая (из-за геодезической природы)
  • применяется для равномерной сегментации маршрутов

lineSplit — разрезание линий по геометрии

lineSplit выполняет разбиение линии по другой геометрии (чаще всего Point, LineString или Polygon).

import lineSplit from "@turf/line-split";

const splitter = {
  type: "Feature",
  geometry: {
    type: "LineString",
    coordinates: [[10, 0], [10, 20]]
  }
};

const result = lineSplit(line, splitter);

Механика:

  • пересечения вычисляются геометрически
  • исходная линия разбивается в точках пересечения
  • возвращается FeatureCollection

Типичные применения:

  • разрезание дорог перекрёстками
  • сегментация маршрутов по границам зон
  • анализ сетей

lineSubstring — извлечение участка линии по расстоянию

Одна из наиболее важных операций — извлечение фрагмента линии между двумя точками в терминах расстояния вдоль линии.

import lineSubstring from "@turf/line-substring";

const segment = lineSubstring(line, 2, 8, { units: "kilometers" });

Алгоритм:

  • вычисляется длина всей линии
  • определяется положение start/end вдоль линии
  • выполняется интерполяция промежуточных точек

Особенности:

  • работает независимо от количества сегментов
  • сохраняет геодезическую точность
  • учитывает кривизну линий на сфере

lineSlice — извлечение участка между двумя точками

lineSlice отличается от lineSubstring тем, что использует реальные точки на линии, а не расстояния.

import lineSlice from "@turf/line-slice";

const start = [2, 2];
const end = [18, 18];

const sliced = lineSlice(start, end, line);

Алгоритм:

  • проецируются точки на линию
  • определяется их положение вдоль геометрии
  • возвращается подотрезок между ними

Применяется в задачах:

  • выделение участков маршрутов
  • анализ движения между событиями
  • обрезка трасс

Извлечение частей полигонов

polygonToLine — преобразование полигона в набор линий

Для работы с границами часто требуется преобразовать полигон в линейные сегменты.

import polygonToLine from "@turf/polygon-to-line";

const outline = polygonToLine(polygon);

Результат:

  • внешний контур становится LineString
  • внутренние кольца (holes) также преобразуются
  • возвращается MultiLineString

Это базовая операция для дальнейшего разбиения границ.


booleanCut и пространственные операции

Хотя Turf.js не предоставляет отдельной функции booleanCut, операции типа:

  • booleanIntersection
  • booleanDifference
  • booleanUnion

используются для извлечения частей полигонов.

Пример пересечения:

import booleanIntersects from "@turf/boolean-intersects";

const intersects = booleanIntersects(poly1, poly2);

Для извлечения именно геометрической части используется:

import intersect from "@turf/intersect";

const clipped = intersect(poly1, poly2);

Результат:

  • возвращается часть первого полигона, находящаяся внутри второго
  • возможны MultiPolygon результаты

bboxClip — обрезка по прямоугольной области

bboxClip позволяет ограничить геометрию прямоугольным окном.

import bboxClip from "@turf/bbox-clip";

const clipped = bboxClip(geometry, [0, 0, 10, 10]);

Механизм:

  • вычисляется пересечение с bounding box
  • координаты обрезаются по границам
  • добавляются новые вершины на границах окна

Используется для:

  • тайловой генерации карт
  • оптимизации отображения
  • фильтрации данных по области

Работа с координатами как способ извлечения частей

coordAll — извлечение всех координат

import coordAll from "@turf/coord-all";

const coords = coordAll(feature);

Возвращает:

  • все координаты из вложенных геометрий
  • включая MultiPolygon и GeometryCollection

Используется для:

  • анализа плотности точек
  • построения кластеров
  • упрощения геометрии

explode — преобразование геометрии в точки

import explode from "@turf/explode";

const points = explode(polygon);

Каждая вершина превращается в Point.

Применения:

  • визуализация вершин
  • анализ узлов графа
  • подготовка к агрегации

segmentReduce — обработка сегментов линии

import segmentReduce from "@turf/segment-reduce";

const result = segmentReduce(line, (acc, segment) => {
  return acc + segment.distance;
}, 0);

Позволяет:

  • проходить по каждому сегменту линии
  • выполнять агрегацию
  • извлекать статистику по частям геометрии

Геометрические операции извлечения подструктур

lineOffset — смещение линии

Хотя операция не напрямую «извлекает» часть геометрии, она создаёт параллельную линию, фактически формируя производную геометрию.

import lineOffset from "@turf/line-offset";

const offset = lineOffset(line, 2, { units: "kilometers" });

Применяется для:

  • создания буферных линий
  • построения дорожных полос
  • визуального дублирования маршрутов

truncate — ограничение точности координат

import truncate from "@turf/truncate";

const clean = truncate(geometry, { precision: 3 });

Позволяет:

  • уменьшить количество значащих цифр
  • стабилизировать геометрию перед разбиением
  • устранить шум координат

Извлечение фрагментов в Multi-геометриях

MultiLineString и MultiPolygon требуют дополнительной обработки:

  • каждая часть рассматривается отдельно
  • результаты объединяются в FeatureCollection
  • операции выполняются рекурсивно

Пример логики:

for (const part of multiLine.geometry.coordinates) {
  // обработка каждой линии отдельно
}

Это важно при:

  • работе с дорожными сетями
  • анализе административных границ
  • обработке сложных картографических данных

Комбинирование операций извлечения

На практике извлечение частей геометрий почти всегда является цепочкой операций:

  1. нормализация геометрии (truncate)
  2. преобразование (polygonToLine)
  3. разбиение (lineSplit, lineChunk)
  4. извлечение фрагмента (lineSubstring, lineSlice)
  5. фильтрация (bboxClip)
  6. агрегация (segmentReduce, coordAll)

Пример композиции:

const clipped = bboxClip(line, bbox);
const parts = lineSplit(clipped, splitter);
const segment = lineSubstring(parts.features[0], 1, 5, {
  units: "kilometers"
});

Особенности точности и геодезических вычислений

Все операции извлечения частей геометрий в Turf.js опираются на сферическую модель Земли:

  • расстояния вычисляются по геодезическим формулам
  • линии интерполируются по дугам большого круга
  • погрешность растёт при длинных сегментах

Это означает, что:

  • прямые линии в координатах не всегда прямые на поверхности
  • разбиение может давать слегка разные результаты при разных функциях
  • порядок точек влияет на стабильность результата

Итоговая структура инструментов извлечения

Инструменты Turf.js для извлечения частей геометрий можно структурировать следующим образом:

Линейные операции:

  • lineSplit
  • lineChunk
  • lineSubstring
  • lineSlice

Полигональные операции:

  • polygonToLine
  • intersect
  • bboxClip

Координатные операции:

  • coordAll
  • explode
  • segmentReduce

Преобразования:

  • lineOffset
  • truncate

Эта система образует единый набор инструментов для декомпозиции пространственных данных на уровне координат, сегментов и подгеометрий.