Первая программа с Turf.js

Turf.js представляет собой набор функций для пространственных вычислений в браузере и Node.js. Библиотека работает с GeoJSON-структурами и позволяет выполнять геометрические операции, анализ расстояний, проверку пересечений, построение буферных зон и множество других задач, характерных для геоинформационных систем.

Перед созданием первой программы требуется установить окружение JavaScript-проекта. В зависимости от среды выполнения используются разные подходы.

Установка через npm

В 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:

  • Point — точка
  • LineString — линия
  • Polygon — полигон

Каждая функция 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 задаёт единицы измерения:

  • kilometers
  • meters
  • miles
  • degrees

Результатом будет число, представляющее расстояние.

Работа с линиями

Линии в 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 задаёт границы области:

  • minX, minY
  • maxX, maxY

Преобразование и измерение площадей

Площадь полигона

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);

Здесь последовательно выполняются:

  1. создание точки
  2. построение буфера
  3. проверка принадлежности

Особенности работы с координатами

При использовании Turf.js критично соблюдать географический порядок координат:

[longitude, latitude]

Ошибки порядка приводят к некорректным вычислениям расстояний и областей.

Также следует учитывать:

  • Земля моделируется как сфера
  • результаты являются приближёнными
  • высокая точность требует специализированных проекций

Типичная структура GeoJSON в Turf

Каждый объект имеет следующую структуру:

{
  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);

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