В основе работы Turf.js лежит стандарт GeoJSON, определяющий способ представления географических данных. Центральные структуры этого стандарта — Feature и FeatureCollection — формируют базовый слой данных, с которым работают все геопространственные операции библиотеки.
Feature представляет собой единичный географический объект. Это универсальная оболочка, которая связывает геометрию с набором атрибутов.
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [102.0, 0.5]
},
"properties": {
"name": "Example Point",
"category": "marker"
}
}
Поле type всегда имеет значение:
"Feature" — фиксирует объект как GeoJSON FeatureЭто обязательный идентификатор структуры.
Поле geometry описывает пространственную сущность
объекта.
Поддерживаемые типы геометрии:
PointLineStringPolygonMultiPointMultiLineStringMultiPolygonGeometryCollectionПример Point:
{
"type": "Point",
"coordinates": [30.5, 50.5]
}
Особенности:
[долгота, широта]properties — контейнер для метаданных.
Это произвольный объект, который может содержать:
Пример:
{
"properties": {
"id": 1,
"name": "Park",
"area": 1200.5,
"active": true,
"tags": ["green", "recreation"]
}
}
Особенности:
{}Feature всегда содержит ровно одну геометрию:
Point,
Polygon)nullПример пустого объекта:
{
"type": "Feature",
"geometry": null,
"properties": {}
}
Использование null означает отсутствие пространственной
информации при сохранении атрибутов.
FeatureCollection — контейнер для набора Feature объектов. Это основной формат для массовой обработки данных в Turf.js.
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [102.0, 0.5]
},
"properties": {
"name": "A"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [103.0, 1.0]
},
"properties": {
"name": "B"
}
}
]
}
Фиксированное значение:
"FeatureCollection"Массив объектов Feature.
Свойства массива:
{
"type": "FeatureCollection",
"features": []
}
Пустая коллекция допустима и часто используется как результат пространственных операций, не находящих совпадений.
FeatureCollection является верхнеуровневой структурой, а Feature — атомарной единицей данных.
Иерархия:
FeatureCollection
Feature
Turf.js почти все операции принимает в виде:
Во всех структурах GeoJSON:
[longitude, latitude]
Пример:
[37.6173, 55.7558]
Ошибочный порядок:
[55.7558, 37.6173]
GeoJSON предполагает:
Любые расчёты расстояний в Turf.js учитывают сферическую модель Земли.
properties активно используются для:
features.filter(f => f.properties.type === "park")
Turf.js часто добавляет вычисленные поля:
{
"properties": {
"length": 1250.7,
"buffer_radius": 100
}
}
{
"type": "Feature",
"geometry": {
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [10, 10]
},
{
"type": "LineString",
"coordinates": [[10, 10], [20, 20]]
}
]
},
"properties": {}
}
Используется реже, но поддерживается Turf.js для комплексных операций.
{
"geometry": {...},
"properties": {}
}
Недопустимо — структура не распознаётся как GeoJSON.
Критическая ошибка при расчётах расстояний и буферов.
Например:
"PointLine"
Такой тип не существует в стандарте.
{
"type": "Feature",
"geometry": null,
"properties": {}
}
Turf.js операции часто требуют проверки
geometry !== null.
Внутри Turf.js эти структуры используются как универсальный вход и выход:
Любая функция библиотеки опирается на единый контракт данных: GeoJSON Feature или FeatureCollection.
const collection = {
type: "FeatureCollection",
features: [feature]
};
Внутреннее представление:
import { point } from "@turf/helpers";
const feature = point([30, 50]);
const features = collection.features;
GeoJSON в контексте Turf.js рассматривается как:
Это важно для предсказуемости геоалгоритмов.
GeoJSON структуры широко поддерживаются:
Turf.js выступает как слой вычислений поверх стандартного формата.
FeatureCollection может включать:
Пример смешанной коллекции:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [0, 0] },
"properties": { "type": "station" }
},
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [[0, 0], [10, 10]]
},
"properties": { "type": "route" }
}
]
}
Чёткое разделение:
обеспечивает: