Работа с геометриями в геопространственных данных часто требует не только построения и анализа объектов, но и их разбиения, извлечения отдельных сегментов, пересечения или выделения подмножеств координат. Библиотека Turf.js предоставляет набор инструментов, позволяющих выполнять такие операции над GeoJSON-геометриями без необходимости подключать тяжёлые ГИС-системы.
Извлечение частей геометрий в Turf.js строится вокруг нескольких категорий операций:
Эти операции используются в маршрутизации, анализе дорожных сетей, работе с кадастровыми данными и визуализации пространственных структур.
Turf.js оперирует стандартом GeoJSON. Основные типы:
PointLineStringPolygonMultiLineStringMultiPolygonЛюбая операция извлечения частей геометрии в конечном счёте сводится к манипуляции массивами координат:
const line = {
type: "Feature",
geometry: {
type: "LineString",
coordinates: [
[0, 0],
[10, 10],
[20, 20]
]
}
};
Координаты всегда представлены в порядке
[долгота, широта], что критично при геометрических
преобразованиях.
Функция lineChunk используется для разбиения линии на
части фиксированной длины.
import lineChunk from "@turf/line-chunk";
const chunks = lineChunk(line, 5, { units: "kilometers" });
Каждый фрагмент представляет собой самостоятельный
LineString. Внутренне происходит интерполяция точек вдоль
линии с учётом геодезического расстояния.
Ключевые особенности:
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Типичные применения:
Одна из наиболее важных операций — извлечение фрагмента линии между двумя точками в терминах расстояния вдоль линии.
import lineSubstring from "@turf/line-substring";
const segment = lineSubstring(line, 2, 8, { units: "kilometers" });
Алгоритм:
Особенности:
lineSlice отличается от lineSubstring тем,
что использует реальные точки на линии, а не расстояния.
import lineSlice from "@turf/line-slice";
const start = [2, 2];
const end = [18, 18];
const sliced = lineSlice(start, end, line);
Алгоритм:
Применяется в задачах:
Для работы с границами часто требуется преобразовать полигон в линейные сегменты.
import polygonToLine from "@turf/polygon-to-line";
const outline = polygonToLine(polygon);
Результат:
LineStringMultiLineStringЭто базовая операция для дальнейшего разбиения границ.
Хотя Turf.js не предоставляет отдельной функции
booleanCut, операции типа:
booleanIntersectionbooleanDifferencebooleanUnionиспользуются для извлечения частей полигонов.
Пример пересечения:
import booleanIntersects from "@turf/boolean-intersects";
const intersects = booleanIntersects(poly1, poly2);
Для извлечения именно геометрической части используется:
import intersect from "@turf/intersect";
const clipped = intersect(poly1, poly2);
Результат:
bboxClip позволяет ограничить геометрию прямоугольным
окном.
import bboxClip from "@turf/bbox-clip";
const clipped = bboxClip(geometry, [0, 0, 10, 10]);
Механизм:
Используется для:
import coordAll from "@turf/coord-all";
const coords = coordAll(feature);
Возвращает:
Используется для:
import explode from "@turf/explode";
const points = explode(polygon);
Каждая вершина превращается в Point.
Применения:
import segmentReduce from "@turf/segment-reduce";
const result = segmentReduce(line, (acc, segment) => {
return acc + segment.distance;
}, 0);
Позволяет:
Хотя операция не напрямую «извлекает» часть геометрии, она создаёт параллельную линию, фактически формируя производную геометрию.
import lineOffset from "@turf/line-offset";
const offset = lineOffset(line, 2, { units: "kilometers" });
Применяется для:
import truncate from "@turf/truncate";
const clean = truncate(geometry, { precision: 3 });
Позволяет:
MultiLineString и MultiPolygon требуют дополнительной обработки:
Пример логики:
for (const part of multiLine.geometry.coordinates) {
// обработка каждой линии отдельно
}
Это важно при:
На практике извлечение частей геометрий почти всегда является цепочкой операций:
truncate)polygonToLine)lineSplit, lineChunk)lineSubstring,
lineSlice)bboxClip)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 для извлечения частей геометрий можно структурировать следующим образом:
Линейные операции:
Полигональные операции:
Координатные операции:
Преобразования:
Эта система образует единый набор инструментов для декомпозиции пространственных данных на уровне координат, сегментов и подгеометрий.