В 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);
Результат представляет собой массив координат, идентичный исходной геометрии.
Такой подход полезен в случаях, когда требуется:
Turf.js предоставляет набор функций из @turf/meta,
позволяющих обходить геометрию без прямого доступа к структуре
GeoJSON.
Одной из ключевых является coordEach, которая
последовательно перебирает каждую координату, включая поддержку сложных
геометрий.
import { coordEach } from "@turf/meta";
coordEach(line, (coord, index) => {
console.log(coord, index);
});
Особенности:
LineString, MultiLineString,
Polygon;Функция 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;При работе с линиями важно различать:
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 тем, что:
После извлечения координат часто требуется обратная сборка геометрии:
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);
}
});
Такая операция используется для:
При массовой обработке линий применяется стандартный контейнер 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.Каждая стратегия соответствует разному уровню детализации: