В экосистеме GeoJSON данные могут существовать в нескольких уровнях абстракции: Geometry, Feature и FeatureCollection. Turf.js оперирует всеми тремя, но большинство функций требуют строго определённого формата входных данных, что делает преобразование между форматами ключевым этапом обработки геоданных.
Geometry представляет чистую геометрию без
дополнительных свойств. Feature добавляет к геометрии
свойства properties и служит основным рабочим объектом.
FeatureCollection объединяет множество объектов Feature
в одну структуру.
Базовая операция — преобразование «голой» геометрии в полноценный GeoJSON Feature.
import { feature } from "@turf/helpers";
const geometry = {
type: "Point",
coordinates: [30, 50]
};
const ft = feature(geometry, { name: "A" });
Особенности:
properties.Во многих функциях Turf требуется именно geometry-часть:
const geometry = ft.geometry;
Использование geometry напрямую уменьшает накладные расходы при массовых операциях.
import { featureCollection, point } from "@turf/helpers";
const fc = featureCollection([
point([30, 10]),
point([40, 20])
]);
Особенности:
Для низкоуровневых операций часто требуется извлечь координаты:
import { coordEach } from "@turf/meta";
const coords = [];
coordEach(fc, (coord) => {
coords.push(coord);
});
Поведение:
import { lineString } from "@turf/helpers";
const line = lineString([
[0, 0],
[10, 10],
[20, 25]
]);
import { explode } from "@turf/explode";
const points = explode(line);
Результат:
import { explode } from "@turf/explode";
const points = explode(polygon);
const rings = polygon.geometry.coordinates;
Структура:
Multi-структуры часто требуют нормализации.
const multiPoint = {
type: "MultiPoint",
coordinates: [
[10, 10],
[20, 20]
]
};
import { featureCollection, point } from "@turf/helpers";
const points = featureCollection(
multiPoint.coordinates.map(c => point(c))
);
Для обработки каждой линии отдельно:
const lines = multiLine.coordinates.map(coords =>
lineString(coords)
);
Результат — массив отдельных LineString.
const features = fc.features;
Используется при:
const fc2 = featureCollection(features);
Важно:
import { coordAll } from "@turf/meta";
const allCoords = coordAll(fc);
Особенности:
import { point } from "@turf/helpers";
const features = coords.map(c => point(c));
Типовой сценарий:
Turf поддерживает преобразования через
@turf/projection.
import { toMercator } from "@turf/projection";
const merc = toMercator(geojson);
import { toWgs84 } from "@turf/projection";
const wgs = toWgs84(geojson);
Особенности:
import { feature } from "@turf/helpers";
function normalize(input) {
if (input.type === "Feature") return input;
return feature(input);
}
Сценарии применения:
import { cleanCoords } from "@turf/clean-coords";
const cleaned = cleanCoords(geojson);
Удаляет:
import { truncate } from "@turf/truncate";
const short = truncate(geojson, {
precision: 4
});
Назначение:
import { explode } from "@turf/explode";
Поддерживаемые типы:
Результат:
import { lineString } from "@turf/helpers";
const line = lineString(points.map(p => p.geometry.coordinates));
Используется при:
const polygon = {
type: "Polygon",
coordinates: [lineCoordinates]
};
Требования:
import { featureEach } from "@turf/meta";
featureEach(fc, (feature) => {
console.log(feature);
});
import { geomEach } from "@turf/meta";
geomEach(fc, (geom) => {
console.log(geom.type);
});
Назначение:
import { flatten } from "@turf/flatten";
const flat = flatten(multiGeojson);
Результат:
Типовой поток обработки геоданных в Turf.js выглядит как последовательность трансформаций:
Такая цепочка обеспечивает совместимость между функциями Turf.js и упрощает построение геоалгоритмов без потери структуры данных.