Turf.js работает поверх стандарта GeoJSON и рассматривает все пространственные объекты как геометрические примитивы:
Ключевая особенность модели — строгое соответствие GeoJSON-структурам. Любая функция Turf.js принимает и возвращает валидные GeoJSON-объекты, что обеспечивает совместимость с картографическими библиотеками (Mapbox GL, Leaflet, OpenLayers).
Пример точки:
const point = turf.point([30.5, 50.5]);
Пример полигона:
const polygon = turf.polygon([[
[30, 50],
[30, 51],
[31, 51],
[31, 50],
[30, 50]
]]);
Одной из базовых возможностей является вычисление геометрических характеристик.
Функция distance рассчитывает геодезическое
расстояние:
const from = turf.point([30.5, 50.5]);
const to = turf.point([30.6, 50.6]);
const dist = turf.distance(from, to, { units: 'kilometers' });
Особенности:
const area = turf.area(polygon);
Ключевой момент: площадь вычисляется на сфере, а не в плоской проекции, что критично для больших территорий.
Turf.js предоставляет инструменты для анализа линейных объектов.
const line = turf.lineString([
[30, 50],
[30.5, 50.5],
[31, 51]
]);
const length = turf.length(line, { units: 'kilometers' });
Разбиение линии на равные части:
const segments = turf.lineChunk(line, 5, { units: 'kilometers' });
Применение:
Turf.js поддерживает трансформации координат без изменения логической структуры объектов.
const moved = turf.transformTranslate(point, 10, 90, { units: 'kilometers' });
const scaled = turf.transformScale(polygon, 2);
const rotated = turf.transformRotate(polygon, 45);
Особенность: все трансформации выполняются в географических координатах с учетом сферической модели.
Буферизация — создание зоны вокруг объекта на заданном расстоянии.
const buffer = turf.buffer(point, 5, { units: 'kilometers' });
Используется для:
Алгоритм учитывает кривизну поверхности Земли, что отличает Turf.js от простых геометрических библиотек.
const intersect = turf.intersect(polygonA, polygonB);
Возвращает область пересечения двух полигонов или null,
если пересечения нет.
const union = turf.union(polygonA, polygonB);
const diff = turf.difference(polygonA, polygonB);
Ключевая особенность: операции работают в географическом пространстве и корректно обрабатывают сложные формы, включая самопересечения.
const center = turf.center(polygon);
Центроид может находиться вне геометрии, особенно у вогнутых фигур.
const centroid = turf.centroid(polygon);
const bbox = turf.bbox(polygon);
const bboxPolygon = turf.bboxPolygon(bbox);
Применение:
Turf.js поддерживает группировку точек по пространственной близости.
const clustered = turf.clustersKmeans(points, {
numberOfClusters: 3
});
Результат: каждая точка получает свой кластерный индекс.
Дополнительные алгоритмы:
const inside = turf.booleanPointInPolygon(point, polygon);
const crosses = turf.booleanCrosses(line1, line2);
const equal = turf.booleanEqual(poly1, poly2);
Особенность: все проверки основаны на строгих геометрических правилах, а не на визуальном совпадении координат.
Turf.js может создавать синтетические наборы пространственных объектов.
const grid = turf.pointGrid([-180, -85, 180, 85], 100, {
units: 'kilometers'
});
const randomPoints = turf.randomPoint(100, {
bbox: [30, 50, 31, 51]
});
Использование:
const interpolated = turf.interpolate(points, 1, {
gridType: 'points',
property: 'temperature'
});
const tin = turf.tin(points, 'value');
Назначение:
Turf.js работает в WGS84 (EPSG:4326). Все операции предполагают:
Следствие: для высокоточных инженерных задач требуется предварительная проекция в соответствующую систему координат.
Работа с большими наборами геоданных требует учета особенностей выполнения:
Рекомендованные подходы:
simplify)const simplified = turf.simplify(polygon, {
tolerance: 0.01,
highQuality: true
});
FeatureCollection — основной контейнер для массовых операций.
const features = turf.featureCollection([
turf.point([30, 50]),
turf.point([31, 51])
]);
Многие функции Turf.js принимают коллекции и возвращают коллекции, что позволяет строить цепочки пространственных преобразований без ручной итерации.
Turf.js ориентирован на композицию функций:
const result = turf.buffer(
turf.centroid(polygon),
10,
{ units: 'kilometers' }
);
Такой подход позволяет строить сложные геоалгоритмы через последовательность чистых преобразований без изменения исходных объектов.