Формат GeoJSON

GeoJSON представляет собой текстовый формат обмена географическими данными, основанный на JSON. Его основная задача — описывать геометрические объекты, их свойства и наборы объектов в единой, строго структурированной форме, удобной для передачи по сети и обработки в JavaScript, включая библиотеки пространственного анализа, такие как Turf.js.

Ключевая особенность GeoJSON заключается в том, что он объединяет геометрию и атрибутивные данные в одном документе, сохраняя при этом простую и предсказуемую структуру JSON.


Базовые элементы структуры GeoJSON

Любой GeoJSON-документ строится вокруг нескольких фундаментальных типов:

  • Geometry (геометрия) — описание формы объекта
  • Feature (объект) — геометрия + свойства
  • FeatureCollection (коллекция объектов) — набор Feature

Каждый из этих типов является JSON-объектом с фиксированными полями.


Геометрические типы (Geometry Objects)

Точка (Point)

Point представляет одну координату в пространстве.

{
  "type": "Point",
  "coordinates": [30.5, 50.5]
}

Важные особенности:

  • координаты задаются в порядке [долгота, широта]
  • может содержать третье значение — высоту: [lon, lat, alt]

Линия (LineString)

LineString описывает последовательность точек, соединённых линией.

{
  "type": "LineString",
  "coordinates": [
    [30.0, 50.0],
    [31.0, 51.0],
    [32.0, 52.0]
  ]
}

Особенности:

  • минимум две координаты
  • порядок точек критичен: он определяет форму линии

Многоугольник (Polygon)

Polygon задаёт замкнутую область.

{
  "type": "Polygon",
  "coordinates": [
    [
      [30.0, 50.0],
      [31.0, 50.0],
      [31.0, 51.0],
      [30.0, 51.0],
      [30.0, 50.0]
    ]
  ]
}

Ключевые правила:

  • первая и последняя координаты должны совпадать
  • внешний контур задаётся первым массивом
  • внутренние «дыры» (holes) добавляются дополнительными массивами

Мульти-геометрии

Для представления набора однотипных объектов используются мульти-типы.

MultiPoint

{
  "type": "MultiPoint",
  "coordinates": [
    [30.0, 50.0],
    [31.0, 51.0]
  ]
}

MultiLineString

{
  "type": "MultiLineString",
  "coordinates": [
    [
      [30.0, 50.0],
      [31.0, 51.0]
    ],
    [
      [32.0, 52.0],
      [33.0, 53.0]
    ]
  ]
}

MultiPolygon

{
  "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]
      ]
    ]
  ]
}

GeometryCollection

Позволяет объединять разные типы геометрий в одном объекте.

{
  "type": "GeometryCollection",
  "geometries": [
    {
      "type": "Point",
      "coordinates": [30.0, 50.0]
    },
    {
      "type": "LineString",
      "coordinates": [
        [30.0, 50.0],
        [31.0, 51.0]
      ]
    }
  ]
}

Feature: геометрия + свойства

Feature — основной строительный блок GeoJSON в прикладных задачах, включая Turf.js.

{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [30.5, 50.5]
  },
  "properties": {
    "name": "Объект A",
    "population": 12000
  }
}

Структура Feature

  • type — всегда "Feature"
  • geometry — объект геометрии или null
  • properties — произвольный набор атрибутов
  • id (опционально) — уникальный идентификатор

FeatureCollection: набор объектов

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"
      }
    }
  ]
}

Особенности:

  • является стандартным входным форматом для большинства функций Turf.js
  • упрощает пакетную обработку геоданных

Координатная система и порядок значений

GeoJSON использует фиксированную систему координат:

Порядок координат

[долгота, широта] (longitude, latitude)

Это критически важное правило, часто вызывающее ошибки при интеграции с картографическими системами.

Пример:

[37.6173, 55.7558]

Дополнительная координата

Допускается третье значение:

[lon, lat, elevation]

Отсутствие CRS в современном GeoJSON

Ранее GeoJSON поддерживал явное указание системы координат через поле crs. Однако в актуальной спецификации:

  • crs считается устаревшим
  • предполагается использование WGS84 (EPSG:4326) по умолчанию
  • системы координат должны управляться вне GeoJSON

Null-геометрии

GeoJSON допускает отсутствие геометрии:

{
  "type": "Feature",
  "geometry": null,
  "properties": {
    "name": "без координат"
  }
}

Это используется для:

  • временно неизвестных координат
  • атрибутивных записей без пространственного компонента

Особенности представления полигонов

Polygon имеет специфическую структуру вложенности:

  • первый уровень массива — набор колец
  • каждое кольцо — массив координат
  • первое кольцо — внешний контур
  • последующие — внутренние отверстия

Логика вложенности:

Polygon
 └── LinearRing (outer)
      └── coordinates[]
 └── LinearRing (hole)
      └── coordinates[]

Валидационные правила GeoJSON

При работе с GeoJSON важно соблюдать ряд строгих правил:

  • координаты должны быть числами
  • массив координат не должен быть пустым (кроме допустимых случаев)
  • Polygons должны быть замкнутыми
  • типы объектов строго фиксированы
  • свойства properties должны быть объектом или null

Связь GeoJSON и Turf.js

Turf.js строится вокруг строгого понимания GeoJSON как универсального контейнера данных.

Основные принципы взаимодействия:

  • каждая функция Turf.js принимает Feature или FeatureCollection
  • результат почти всегда возвращается в формате 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.


Типовые ошибки при работе с GeoJSON

Перепутанный порядок координат

Часто встречается ошибка:

[latitude, longitude]

вместо правильного:

[longitude, latitude]

Незамкнутые полигоны

[
  [30, 50],
  [31, 50],
  [31, 51]
]

Отсутствие замыкания приводит к некорректной геометрии.


Неверная вложенность MultiPolygon

Каждый уровень вложенности имеет строгую структуру. Ошибка в одном уровне ломает всю геометрию.


Использование GeoJSON в пространственных вычислениях

GeoJSON выступает универсальным форматом для:

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

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


Расширяемость формата

GeoJSON допускает расширение через:

  • properties (произвольные данные)
  • дополнительные поля на уровне Feature
  • пользовательские соглашения внутри атрибутов

При этом структура geometry остаётся неизменной, что гарантирует совместимость между библиотеками.