GeoJSON представляет собой текстовый формат обмена географическими данными, основанный на JSON. Его основная задача — описывать геометрические объекты, их свойства и наборы объектов в единой, строго структурированной форме, удобной для передачи по сети и обработки в JavaScript, включая библиотеки пространственного анализа, такие как Turf.js.
Ключевая особенность GeoJSON заключается в том, что он объединяет геометрию и атрибутивные данные в одном документе, сохраняя при этом простую и предсказуемую структуру JSON.
Любой GeoJSON-документ строится вокруг нескольких фундаментальных типов:
Каждый из этих типов является JSON-объектом с фиксированными полями.
Point представляет одну координату в пространстве.
{
"type": "Point",
"coordinates": [30.5, 50.5]
}
Важные особенности:
[lon, lat, alt]LineString описывает последовательность точек, соединённых линией.
{
"type": "LineString",
"coordinates": [
[30.0, 50.0],
[31.0, 51.0],
[32.0, 52.0]
]
}
Особенности:
Polygon задаёт замкнутую область.
{
"type": "Polygon",
"coordinates": [
[
[30.0, 50.0],
[31.0, 50.0],
[31.0, 51.0],
[30.0, 51.0],
[30.0, 50.0]
]
]
}
Ключевые правила:
Для представления набора однотипных объектов используются мульти-типы.
{
"type": "MultiPoint",
"coordinates": [
[30.0, 50.0],
[31.0, 51.0]
]
}
{
"type": "MultiLineString",
"coordinates": [
[
[30.0, 50.0],
[31.0, 51.0]
],
[
[32.0, 52.0],
[33.0, 53.0]
]
]
}
{
"type": "MultiPolygon",
"coordinates": [
[
[
[30.0, 50.0],
[31.0, 50.0],
[31.0, 51.0],
[30.0, 51.0],
[30.0, 50.0]
]
],
[
[
[32.0, 52.0],
[33.0, 52.0],
[33.0, 53.0],
[32.0, 53.0],
[32.0, 52.0]
]
]
]
}
Позволяет объединять разные типы геометрий в одном объекте.
{
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [30.0, 50.0]
},
{
"type": "LineString",
"coordinates": [
[30.0, 50.0],
[31.0, 51.0]
]
}
]
}
Feature — основной строительный блок GeoJSON в прикладных задачах, включая Turf.js.
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [30.5, 50.5]
},
"properties": {
"name": "Объект A",
"population": 12000
}
}
type — всегда "Feature"geometry — объект геометрии или nullproperties — произвольный набор атрибутовid (опционально) — уникальный идентификаторFeatureCollection объединяет несколько Feature в единый контейнер.
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [30.0, 50.0]
},
"properties": {
"name": "A"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [31.0, 51.0]
},
"properties": {
"name": "B"
}
}
]
}
Особенности:
GeoJSON использует фиксированную систему координат:
[долгота, широта] (longitude, latitude)
Это критически важное правило, часто вызывающее ошибки при интеграции с картографическими системами.
Пример:
[37.6173, 55.7558]
Допускается третье значение:
[lon, lat, elevation]
Ранее GeoJSON поддерживал явное указание системы координат через поле
crs. Однако в актуальной спецификации:
crs считается устаревшимGeoJSON допускает отсутствие геометрии:
{
"type": "Feature",
"geometry": null,
"properties": {
"name": "без координат"
}
}
Это используется для:
Polygon имеет специфическую структуру вложенности:
Логика вложенности:
Polygon
└── LinearRing (outer)
└── coordinates[]
└── LinearRing (hole)
└── coordinates[]
При работе с GeoJSON важно соблюдать ряд строгих правил:
properties должны быть объектом или
nullTurf.js строится вокруг строгого понимания GeoJSON как универсального контейнера данных.
Основные принципы взаимодействия:
Пример использования:
import * as turf from "@turf/turf";
const point = turf.point([30.5, 50.5]);
const buffer = turf.buffer(point, 5, { units: "kilometers" });
Результат buffer — полноценный GeoJSON Polygon внутри
Feature.
Часто встречается ошибка:
[latitude, longitude]
вместо правильного:
[longitude, latitude]
[
[30, 50],
[31, 50],
[31, 51]
]
Отсутствие замыкания приводит к некорректной геометрии.
Каждый уровень вложенности имеет строгую структуру. Ошибка в одном уровне ломает всю геометрию.
GeoJSON выступает универсальным форматом для:
Turf.js использует GeoJSON как внутренний стандарт, что позволяет не преобразовывать данные между форматами при выполнении операций.
GeoJSON допускает расширение через:
properties (произвольные данные)При этом структура geometry остаётся неизменной, что гарантирует совместимость между библиотеками.