Структура GeoJSON

GeoJSON представляет собой формат обмена геопространственными данными, основанный на JSON и предназначенный для описания геометрии объектов, их свойств и группировки в коллекции. Формат используется в веб-картографии и является одним из ключевых способов передачи данных в библиотеки визуализации карт, включая MapLibre GL JS.


Любой GeoJSON-документ представляет собой JSON-объект, содержащий строго определённые поля верхнего уровня. Основные типы объектов:

  • FeatureCollection — коллекция объектов
  • Feature — географический объект с геометрией и свойствами
  • Geometry — описание геометрии без дополнительных атрибутов

Обязательное поле type определяет тип структуры.


FeatureCollection

FeatureCollection является контейнером для набора географических объектов.

{
  "type": "FeatureCollection",
  "features": []
}

Ключевым элементом является массив features, содержащий объекты Feature.

Особенности структуры:

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

Feature

Feature объединяет геометрию и набор свойств, описывающих объект.

{
  "type": "Feature",
  "geometry": {},
  "properties": {},
  "id": "unique-id"
}

geometry

Содержит геометрический объект одного из поддерживаемых типов.

properties

Произвольный объект JSON, описывающий атрибуты:

  • название объекта
  • категории
  • числовые параметры
  • стилистические признаки (в некоторых системах)

Пример:

"properties": {
  "name": "Park",
  "area": 1200,
  "type": "recreation"
}

id

Идентификатор объекта используется для обновления данных и связывания с внешними системами.


Geometry

Геометрия описывает форму объекта в пространстве. Все координаты задаются в формате WGS84 (EPSG:4326) и используют порядок:

[долгота, широта]


Point

Одиночная точка:

{
  "type": "Point",
  "coordinates": [76.886, 43.238]
}

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

  • маркеров
  • отдельных объектов инфраструктуры
  • точечных событий

LineString

Ломаная линия, состоящая из упорядоченного набора точек:

{
  "type": "LineString",
  "coordinates": [
    [76.88, 43.23],
    [76.89, 43.24]
  ]
}

Применение:

  • маршруты
  • дороги
  • треки движения

Polygon

Полигон задаётся массивом линейных колец. Первое кольцо — внешний контур, последующие — отверстия.

{
  "type": "Polygon",
  "coordinates": [
    [
      [76.88, 43.23],
      [76.89, 43.23],
      [76.89, 43.24],
      [76.88, 43.24],
      [76.88, 43.23]
    ]
  ]
}

Правила:

  • замыкание кольца обязательно (первая и последняя координаты совпадают)
  • направление обхода не строго фиксировано, но часто используется для различения внешних и внутренних колец

MultiPoint, MultiLineString, MultiPolygon

Мультигеометрии позволяют объединять несколько однотипных объектов:

MultiPoint

{
  "type": "MultiPoint",
  "coordinates": [
    [76.88, 43.23],
    [76.89, 43.24]
  ]
}

MultiLineString

{
  "type": "MultiLineString",
  "coordinates": [
    [
      [76.88, 43.23],
      [76.89, 43.24]
    ],
    [
      [76.90, 43.25],
      [76.91, 43.26]
    ]
  ]
}

MultiPolygon

{
  "type": "MultiPolygon",
  "coordinates": [
    [
      [
        [76.88, 43.23],
        [76.89, 43.23],
        [76.89, 43.24],
        [76.88, 43.24],
        [76.88, 43.23]
      ]
    ]
  ]
}

GeometryCollection

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

{
  "type": "GeometryCollection",
  "geometries": [
    {
      "type": "Point",
      "coordinates": [76.88, 43.23]
    },
    {
      "type": "LineString",
      "coordinates": [
        [76.88, 43.23],
        [76.89, 43.24]
      ]
    }
  ]
}

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

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

  • стандарт: WGS84
  • порядок: [longitude, latitude]
  • при необходимости третьего значения используется высота

Пример 3D:

"coordinates": [76.88, 43.23, 500]

Высота интерпретируется по-разному в зависимости от движка визуализации.


Дополнительные поля GeoJSON

bbox

Bounding box описывает ограничивающий прямоугольник объекта:

"bbox": [76.88, 43.23, 76.91, 43.26]

Формат:

[minLon, minLat, maxLon, maxLat]

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

  • оптимизации отображения
  • ускорения пространственных запросов
  • предварительного вычисления области данных

CRS (Coordinate Reference System)

Ранее GeoJSON поддерживал описание системы координат через поле crs, однако спецификация устарела, и большинство современных библиотек игнорируют его.


Взаимодействие с MapLibre GL JS

В контексте MapLibre GL JS GeoJSON является основным форматом источников данных (sources).

Типичная интеграция осуществляется через geojson source:

map.addSource("points", {
  type: "geojson",
  data: {
    type: "FeatureCollection",
    features: [
      {
        type: "Feature",
        geometry: {
          type: "Point",
          coordinates: [76.886, 43.238]
        },
        properties: {
          title: "Object A"
        }
      }
    ]
  }
});

Данные GeoJSON используются для:

  • рендеринга символов (symbol layers)
  • линий (line layers)
  • заливок (fill layers)
  • кластеризации точек

Связь Feature properties и стилизации

В MapLibre GL JS свойства properties напрямую используются в стилях через выражения:

  • get
  • match
  • case
  • interpolate

Пример условного окрашивания:

paint: {
  "circle-color": [
    "match",
    ["get", "type"],
    "park", "#00ff00",
    "water", "#0000ff",
    "#ff0000"
  ]
}

Ограничения структуры GeoJSON

  • обязательный порядок координат [lon, lat]
  • отсутствие встроенной топологии
  • большие объёмы данных могут быть неэффективны без оптимизации
  • отсутствие строгой схемы properties

Частые паттерны использования

Точечные данные

Используются для отображения объектов на карте:

  • магазины
  • остановки
  • события

Линейные данные

Используются для:

  • маршрутов транспорта
  • дорожных сетей
  • навигации

Полигональные данные

Используются для:

  • административных границ
  • зданий
  • зон покрытия

Кластеризация GeoJSON

При большом количестве точек MapLibre GL JS поддерживает кластеризацию:

map.addSource("clusters", {
  type: "geojson",
  data: geojsonData,
  cluster: true,
  clusterMaxZoom: 14,
  clusterRadius: 50
});

Кластеры формируются на основе пространственной близости точек и уменьшают нагрузку на рендеринг.


Обработка динамических данных

GeoJSON допускает обновление через замену объекта data:

source.setData(newGeojson);

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

  • потоковых данных
  • интерактивных карт
  • обновления состояния объектов в реальном времени