Извлечение точек из линии

В Turf.js линейные объекты представлены в формате GeoJSON как LineString. Такая геометрия описывается массивом координат, где каждая точка имеет вид [longitude, latitude], а при необходимости может включать третью компоненту — высоту.

const line = {
  type: "Feature",
  geometry: {
    type: "LineString",
    coordinates: [
      [30.31413, 59.93863],
      [30.32005, 59.93545],
      [30.33102, 59.93310]
    ]
  }
};

Любые операции извлечения точек из линии в Turf.js опираются именно на этот базовый формат.


Вершины линии как исходный набор точек

Самый прямой способ получить точки линии — обратиться к её координатам без геометрических преобразований. В Turf.js это делается через стандартную работу с GeoJSON или через вспомогательную функцию getCoords.

import { getCoords } from "@turf/invariant";

const coords = getCoords(line);

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

Такой подход полезен в случаях, когда требуется:

  • получить только узловые точки;
  • сохранить исходную структуру линии;
  • выполнить собственную обработку без интерполяции.

Итерация по координатам через meta-функции

Turf.js предоставляет набор функций из @turf/meta, позволяющих обходить геометрию без прямого доступа к структуре GeoJSON.

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

import { coordEach } from "@turf/meta";

coordEach(line, (coord, index) => {
  console.log(coord, index);
});

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

  • поддерживает LineString, MultiLineString, Polygon;
  • позволяет обрабатывать потоково без создания новых массивов;
  • удобна для фильтрации или трансформации точек.

Преобразование линии в набор точек через explode

Функция explode выполняет преобразование линии в набор отдельных точек, возвращая FeatureCollection<Point>.

import { lineString, explode } from "@turf/turf";

const result = explode(line);

Результат имеет структуру:

{
  type: "FeatureCollection",
  features: [
    { type: "Feature", geometry: { type: "Point", coordinates: [...] } },
    { type: "Feature", geometry: { type: "Point", coordinates: [...] } }
  ]
}

Ключевая особенность explode:

  • каждая вершина линии становится отдельным Point;
  • сохраняется порядок следования точек;
  • не выполняется интерполяция новых значений.

Разница между вершинами и сегментной декомпозицией

При работе с линиями важно различать:

  • вершины (vertices) — исходные координаты;
  • сегменты (segments) — отрезки между вершинами;
  • интерполированные точки — вычисленные значения вдоль линии.

explode работает только с вершинами и не затрагивает сегментное пространство.


Получение точек вдоль линии

Для извлечения точек с заданным шагом используется подход интерполяции по длине линии. Основные функции:

  • length — вычисляет длину линии;
  • along — возвращает точку на заданной дистанции от начала линии.
import { lineString, length, along } from "@turf/turf";

const total = length(line, { units: "kilometers" });

Далее можно получать точки вдоль линии:

const step = 1; // 1 км
const points = [];

for (let d = 0; d <= total; d += step) {
  const pt = along(line, d, { units: "kilometers" });
  points.push(pt);
}

Такой подход используется для:

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

Сегментация линии перед извлечением точек

При необходимости более сложной структуры используется разбиение линии на части с помощью lineSlice и связанных функций.

import { lineSlice, along } from "@turf/turf";

const segment = lineSlice(
  line.geometry.coordinates[0],
  line.geometry.coordinates[2],
  line
);

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


Преобразование в равномерную сетку точек

Комбинация length и along позволяет формировать регулярную выборку координат, что часто используется при анализе движения.

import { length, along } from "@turf/turf";

function sampleLine(line, step, units = "kilometers") {
  const result = [];
  const total = length(line, { units });

  for (let d = 0; d <= total; d += step) {
    result.push(along(line, d, { units }));
  }

  return result;
}

Такой подход отличается от explode тем, что:

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

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

После извлечения координат часто требуется обратная сборка геометрии:

import { lineString } from "@turf/turf";

const coords = getCoords(line);

const rebuilt = lineString(coords);

Это позволяет:

  • модифицировать набор точек;
  • фильтровать координаты;
  • перестраивать геометрию после обработки.

Фильтрация точек линии

При обходе координат часто применяется фильтрация по условиям:

import { coordEach } from "@turf/meta";

const filtered = [];

coordEach(line, (coord) => {
  if (coord[0] > 30.32) {
    filtered.push(coord);
  }
});

Такая операция используется для:

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

Использование LineString в связке с FeatureCollection

При массовой обработке линий применяется стандартный контейнер GeoJSON:

const collection = {
  type: "FeatureCollection",
  features: [line1, line2, line3]
};

Для извлечения всех точек из коллекции используется coordEach:

import { coordEach } from "@turf/meta";

coordEach(collection, (coord) => {
  console.log(coord);
});

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


Практическая модель извлечения точек

Обобщённый подход к работе с линией в Turf.js обычно строится вокруг трёх стратегий:

  • прямое извлечение вершин через координаты;
  • декомпозиция через explode;
  • интерполяция через along и length.

Каждая стратегия соответствует разному уровню детализации:

  • вершины — исходная структура данных;
  • explode — дискретное представление геометрии;
  • along — равномерное семплирование пространства линии.