GeoJSON

Работа с геоданными в веб-картах почти всегда опирается на единый обменный формат, позволяющий описывать геометрию, свойства объектов и их структуру без привязки к конкретной библиотеке. В экосистеме OpenLayers таким форматом выступает GeoJSON, который используется для загрузки, отображения и анализа пространственных данных.

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

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

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

Минимальный пример точки:

{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [71.44598, 51.1694]
  },
  "properties": {
    "name": "Пример точки"
  }
}

Ключевые элементы:

  • type определяет тип объекта
  • geometry содержит пространственные данные
  • coordinates задаёт координаты в порядке [долгота, широта]
  • properties хранит произвольные атрибуты

Геометрические типы

GeoJSON поддерживает несколько базовых типов геометрии:

Point

Используется для одиночных координат.

{
  "type": "Point",
  "coordinates": [71.44598, 51.1694]
}

LineString

Последовательность точек, образующих линию.

{
  "type": "LineString",
  "coordinates": [
    [71.44, 51.16],
    [71.45, 51.17],
    [71.46, 51.18]
  ]
}

Polygon

Замкнутая область.

{
  "type": "Polygon",
  "coordinates": [
    [
      [71.44, 51.16],
      [71.46, 51.16],
      [71.46, 51.18],
      [71.44, 51.18],
      [71.44, 51.16]
    ]
  ]
}

MultiPoint, MultiLineString, MultiPolygon

Используются для групп однотипных геометрий, объединённых в один объект.

Принципы координатной системы

GeoJSON использует стандарт WGS84 (EPSG:4326). Это означает:

  • первая координата — долгота
  • вторая координата — широта
  • значения задаются в градусах

В OpenLayers это важно учитывать, так как многие слои используют проекцию EPSG:3857, и требуется преобразование координат.

Интеграция GeoJSON в OpenLayers

В OpenLayers работа с GeoJSON осуществляется через класс ol/format/GeoJSON, который отвечает за:

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

Чтение GeoJSON

import GeoJSON from 'ol/format/GeoJSON';

const format = new GeoJSON();

const features = format.readFeatures(geojsonObject, {
  featureProjection: 'EPSG:3857'
});

Здесь происходит ключевой процесс:

  • GeoJSON интерпретируется как входные данные
  • координаты автоматически преобразуются в проекцию карты
  • возвращается массив объектов Feature

Запись GeoJSON

const geojson = format.writeFeatures(features, {
  featureProjection: 'EPSG:3857'
});

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

  • сохранении данных пользователя
  • отправке геометрии на сервер
  • экспорте слоёв

Работа с FeatureCollection

Наиболее распространённый формат загрузки — коллекция объектов:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [71.44, 51.16]
      },
      "properties": {
        "id": 1
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [71.45, 51.17]
      },
      "properties": {
        "id": 2
      }
    }
  ]
}

В OpenLayers такая структура напрямую преобразуется в набор объектов слоя:

const source = vectorLayer.getSource();
source.addFeatures(features);

Свойства объектов (properties)

Поле properties играет ключевую роль в прикладных задачах:

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

Пример:

"properties": {
  "type": "restaurant",
  "rating": 4.5,
  "name": "Cafe Central"
}

Использование в стиле OpenLayers:

import Style from 'ol/style/Style';
import Circle from 'ol/style/Circle';
import Fill from 'ol/style/Fill';

const styleFunction = (feature) => {
  const rating = feature.get('rating');

  return new Style({
    image: new Circle({
      radius: rating * 2,
      fill: new Fill({ color: 'blue' })
    })
  });
};

Преобразование координат

При работе с GeoJSON часто возникает необходимость преобразования систем координат:

  • GeoJSON → EPSG:3857 (для отображения на карте)
  • EPSG:3857 → GeoJSON (для сохранения)

OpenLayers решает это автоматически при указании featureProjection.

Пример явного контроля:

const format = new GeoJSON();

const features = format.readFeatures(data, {
  dataProjection: 'EPSG:4326',
  featureProjection: 'EPSG:3857'
});
  • dataProjection — исходная система координат
  • featureProjection — целевая система карты

Использование GeoJSON с удалёнными API

GeoJSON часто поступает с серверов:

fetch('/api/points')
  .then(response => response.json())
  .then(data => {
    const features = format.readFeatures(data, {
      featureProjection: 'EPSG:3857'
    });
    source.addFeatures(features);
  });

Типичный сценарий:

  • сервер возвращает FeatureCollection
  • клиент преобразует в Features
  • данные отображаются на векторном слое

Векторные источники и GeoJSON

В OpenLayers GeoJSON часто используется совместно с VectorSource:

import VectorSource from 'ol/source/Vector';

const source = new VectorSource({
  features: new GeoJSON().readFeatures(geojsonData, {
    featureProjection: 'EPSG:3857'
  })
});

Такой подход позволяет:

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

Обновление и сериализация данных

GeoJSON удобен для двустороннего обмена:

  1. загрузка данных на карту
  2. редактирование объектов
  3. экспорт обратно в GeoJSON

Пример сохранения:

const updatedGeoJSON = new GeoJSON().writeFeatures(source.getFeatures(), {
  featureProjection: 'EPSG:3857',
  dataProjection: 'EPSG:4326'
});

Это позволяет сохранять данные в стандартном формате, совместимом с любыми GIS-системами.

Ограничения формата

Несмотря на универсальность, GeoJSON имеет особенности:

  • отсутствие встроенной поддержки 3D (кроме расширений)
  • избыточность для больших наборов данных
  • отсутствие топологических связей
  • строгость структуры

В задачах с большими объёмами данных часто применяются альтернативы (TopoJSON, векторные тайлы), однако GeoJSON остаётся базовым обменным форматом.

Особенности производительности в OpenLayers

При работе с большими GeoJSON-файлами важно учитывать:

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

Оптимизационные подходы:

  • использование кластеризации
  • фильтрация на сервере
  • разбиение данных на тайлы
  • lazy loading

Пример кластеризации:

import Cluster from 'ol/source/Cluster';

const clusterSource = new Cluster({
  distance: 40,
  source: vectorSource
});

GeoJSON при этом остаётся источником данных, но визуализация становится более эффективной.

Практическая модель работы

Типичный цикл использования GeoJSON в OpenLayers выглядит следующим образом:

  • получение данных (API или файл)
  • чтение через GeoJSON
  • преобразование координат
  • добавление в VectorSource
  • отображение на карте
  • редактирование пользователем
  • экспорт обратно в GeoJSON

Эта модель делает формат универсальным связующим звеном между сервером, клиентом и картографической визуализацией.