Turf.js представляет собой набор функций для пространственных вычислений в браузере и Node.js. Библиотека работает с GeoJSON-структурами и позволяет выполнять геометрические операции, анализ расстояний, проверку пересечений, построение буферных зон и множество других задач, характерных для геоинформационных систем.
Перед созданием первой программы требуется установить окружение JavaScript-проекта. В зависимости от среды выполнения используются разные подходы.
В Node.js-проекте установка выполняется стандартной командой:
npm install @turf/turf
После установки библиотека подключается как модуль:
const turf = require('@turf/turf');
В современных ESM-проектах используется импорт:
import * as turf from '@turf/turf';
Для браузера возможно подключение через CDN:
<script src="https://cdn.jsdelivr.net/npm/@turf/turf@6/turf.min.js"></script>
После подключения глобальный объект turf становится
доступным без дополнительных импортов.
Основой работы Turf.js являются GeoJSON-объекты. Любая геометрия описывается стандартом GeoJSON:
Каждая функция Turf принимает GeoJSON и возвращает новый GeoJSON или числовое значение.
Простейшая задача — работа с координатами и измерение расстояния между ними.
import * as turf from '@turf/turf';
const pointA = turf.point([30.5, 50.5]);
const pointB = turf.point([30.6, 50.6]);
Каждая точка создаётся через функцию
turf.point([longitude, latitude]). Важно соблюдать порядок
координат: сначала долгота, затем широта.
const distance = turf.distance(pointA, pointB, { units: 'kilometers' });
console.log(distance);
Функция turf.distance вычисляет геодезическое расстояние
между двумя точками по поверхности Земли.
Параметр units задаёт единицы измерения:
Результатом будет число, представляющее расстояние.
Линии в GeoJSON представляют последовательность координат.
const line = turf.lineString([
[30.0, 50.0],
[30.5, 50.5],
[31.0, 51.0]
]);
const length = turf.length(line, { units: 'kilometers' });
console.log(length);
Функция turf.length суммирует расстояния между всеми
сегментами линии.
Буферная зона — область вокруг геометрии на заданном расстоянии.
const center = turf.point([30.5, 50.5]);
const buffer = turf.buffer(center, 10, { units: 'kilometers' });
Здесь создаётся полигон, охватывающий территорию радиусом 10 километров вокруг точки.
Буфер часто используется в задачах:
Одна из базовых операций GIS — проверка, находится ли точка внутри области.
const polygon = turf.polygon([[
[30.0, 50.0],
[31.0, 50.0],
[31.0, 51.0],
[30.0, 51.0],
[30.0, 50.0]
]]);
const pt = turf.point([30.5, 50.5]);
const inside = turf.booleanPointInPolygon(pt, polygon);
console.log(inside);
Функция возвращает:
true, если точка внутри полигонаfalse, если точка вне областиTurf.js предоставляет инструменты для анализа пересечений.
const line1 = turf.lineString([
[30.0, 50.0],
[31.0, 51.0]
]);
const line2 = turf.lineString([
[30.0, 51.0],
[31.0, 50.0]
]);
const intersects = turf.lineIntersect(line1, line2);
console.log(intersects);
Результатом будет FeatureCollection точек пересечения.
Для тестирования и моделирования часто требуется набор случайных координат.
const randomPoints = turf.randomPoint(10, {
bbox: [30, 50, 31, 51]
});
console.log(randomPoints);
Параметр bbox задаёт границы области:
const area = turf.area(polygon);
console.log(area);
Результат возвращается в квадратных метрах.
Центроид — геометрический центр объекта:
const center = turf.centroid(polygon);
console.log(center);
Реальные задачи редко ограничиваются одной функцией. Обычно используется цепочка вычислений.
Пример: создание буфера и проверка попадания точки внутрь него
const origin = turf.point([30.5, 50.5]);
const buffered = turf.buffer(origin, 5, { units: 'kilometers' });
const testPoint = turf.point([30.55, 50.55]);
const result = turf.booleanPointInPolygon(testPoint, buffered);
console.log(result);
Здесь последовательно выполняются:
При использовании Turf.js критично соблюдать географический порядок координат:
[longitude, latitude]
Ошибки порядка приводят к некорректным вычислениям расстояний и областей.
Также следует учитывать:
Каждый объект имеет следующую структуру:
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [30.5, 50.5]
},
properties: {}
}
Turf автоматически оборачивает примитивные геометрии в Feature-структуры.
GeoJSON позволяет добавлять метаданные:
const city = turf.point([30.5, 50.5], {
name: "Sample City",
population: 100000
});
Эти свойства не влияют на геометрию, но используются в аналитике.
const poly1 = turf.polygon([[
[30, 50],
[31, 50],
[31, 51],
[30, 50]
]]);
const poly2 = turf.polygon([[
[31, 50],
[32, 50],
[32, 51],
[31, 50]
]]);
const union = turf.union(poly1, poly2);
Результатом является объединённый полигон без внутренних границ.
Минимальная практическая программа на Turf.js обычно включает:
Пример:
import * as turf from '@turf/turf';
const start = turf.point([30, 50]);
const end = turf.point([30.2, 50.2]);
const dist = turf.distance(start, end, { units: 'kilometers' });
console.log('Distance:', dist);
Такая структура используется как фундамент для более сложных геоинформационных приложений, включая маршрутизацию, анализ зон покрытия и пространственную агрегацию.