В геоинформационных системах базовой единицей данных выступает координатная пара, описывающая положение точки на поверхности Земли. В контексте Turf.js работа с координатами строится на строгом соблюдении формата GeoJSON, где порядок значений фиксирован: [долгота, широта].
Такой порядок принципиален. Ошибка в перестановке значений приводит к смещению объектов на тысячи километров, поскольку интерпретация координат становится некорректной относительно глобальной системы WGS84.
GeoJSON определяет координаты как массив чисел:
[longitude, latitude]
Примеры:
// Алматы
[76.8897, 43.2389]
// Караганда
[73.0850, 49.8060]
В Turf.js все геометрические операции опираются именно на этот стандарт, без исключений.
Базовая операция — создание геометрической точки.
import { point } from "@turf/turf";
const p = point([73.0850, 49.8060]);
Объект результата:
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [73.085, 49.806]
},
properties: {}
}
Точка является фундаментальной сущностью, от которой строятся остальные геометрии.
import { getCoord } from "@turf/turf";
const coord = getCoord(p);
Результат:
[73.085, 49.806]
Функция работает только с Feature
Для сложных геометрий применяется:
import { coordAll } from "@turf/turf";
Пример с линией:
const line = {
type: "Feature",
geometry: {
type: "LineString",
coordinates: [
[73.0, 49.8],
[74.0, 50.0],
[75.0, 50.2]
]
}
};
coordAll(line);
Результат:
[
[73.0, 49.8],
[74.0, 50.0],
[75.0, 50.2]
]
Для Polygon возвращаются все вершины всех колец.
Координаты в сложных структурах имеют вложенную организацию:
[
[lon, lat],
[lon, lat]
]
[
[
[lon, lat],
[lon, lat],
[lon, lat],
[lon, lat]
]
]
Первое кольцо — внешний контур, последующие — отверстия.
Одна из ключевых операций — вычисление геодезического расстояния.
import { distance } from "@turf/turf";
const from = [73.0850, 49.8060];
const to = [76.8897, 43.2389];
distance(from, to, { units: "kilometers" });
Особенности:
unitsПоддерживаемые единицы:
Азимут (bearing) определяет угол направления от одной точки к другой.
import { bearing } from "@turf/turf";
const angle = bearing(
[73.0850, 49.8060],
[76.8897, 43.2389]
);
Результат:
-145.32
Значение интерпретируется в градусах относительно северного направления.
Функция destination позволяет вычислить новую точку:
import { destination } from "@turf/turf";
const start = [73.0850, 49.8060];
const result = destination(start, 100, 90, {
units: "kilometers"
});
Параметры:
Для интерполяции используется midpoint:
import { midpoint } from "@turf/turf";
const a = [73.0850, 49.8060];
const b = [76.8897, 43.2389];
midpoint(a, b);
Результат — географически корректная середина с учётом кривизны Земли.
Координаты часто хранятся в виде массивов, требующих нормализации.
const coords = [
[73.08, 49.80],
null,
[74.00, 50.00],
undefined
];
const clean = coords.filter(Boolean);
Избыточная точность приводит к росту объёма данных:
function roundCoord([lon, lat], precision = 5) {
return [
Number(lon.toFixed(precision)),
Number(lat.toFixed(precision))
];
}
Bounding box описывает минимальный прямоугольник, охватывающий геометрию.
import { bbox } from "@turf/turf";
const poly = {
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [
[
[73, 49],
[74, 49],
[74, 50],
[73, 50],
[73, 49]
]
]
}
};
bbox(poly);
Результат:
[minLon, minLat, maxLon, maxLat]
import { bboxPolygon } from "@turf/turf";
const box = [73, 49, 74, 50];
bboxPolygon(box);
Типичные ошибки:
Пример проверки:
function isValid([lon, lat]) {
return (
typeof lon === "number" &&
typeof lat === "number" &&
lat >= -90 && lat <= 90 &&
lon >= -180 && lon <= 180
);
}
Часто данные приходят в формате [lat, lon], что требует
преобразования:
function toGeoJSONCoord([lat, lon]) {
return [lon, lat];
}
Массовая конвертация:
const converted = coords.map(([lat, lon]) => [lon, lat]);
Для унификации входных данных применяется приведение к Feature:
import { point } from "@turf/turf";
function normalize(input) {
if (Array.isArray(input)) {
return point(input);
}
return input;
}
Polygon → все точки:
import { coordAll } from "@turf/turf";
coordAll(polygonFeature);
FeatureCollection → все координаты:
coordAll(featureCollection);
При работе с наборами координат важны свойства:
Проверка замкнутости:
function isClosed(ring) {
const a = ring[0];
const b = ring[ring.length - 1];
return a[0] === b[0] && a[1] === b[1];
}
Для сглаживания маршрутов используется линейная интерполяция:
function interpolate(a, b, t) {
return [
a[0] + (b[0] - a[0]) * t,
a[1] + (b[1] - a[1]) * t
];
}
При обработке больших массивов:
Несмотря на внешнюю простоту формата [lon, lat],
операции над координатами требуют учета сферической модели Земли.
Прямое сложение координат допустимо только для локальных приближений:
const shifted = [
lon + deltaLon,
lat + deltaLat
];
Для глобальных вычислений применяются функции типа
destination, distance, bearing,
обеспечивающие корректную геодезическую интерпретацию.