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

В библиотеке OpenLayers геометрические объекты представляют собой фундаментальную основу работы с пространственными данными. Любая визуализация на карте — маркеры, линии маршрутов, границы территорий, полигоны объектов — опирается на строгую систему геометрических типов, реализованных в модуле ol/geom. Эти классы описывают форму объектов независимо от их отображения и служат промежуточным слоем между сырыми координатами и визуальными слоями.

Все геометрические типы в OpenLayers наследуются от базового класса Geometry. Он определяет общий интерфейс, который включает:

  • получение экстента (getExtent)
  • трансформации координат
  • клонирование геометрии
  • сериализацию и десериализацию
  • вычисление расстояний и площадей (для некоторых типов)

Геометрия не содержит информации о стиле отображения — она отвечает только за форму.

Координаты в OpenLayers обычно задаются в формате массива:

[x, y]

или для трёхмерных данных:

[x, y, z]

Точка (Point)

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

Создание точки:

import Point from 'ol/geom/Point';

const point = new Point([30.5, 50.45]);

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

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

Пример изменения позиции:

point.setCoordinates([31.0, 51.0]);

Линия (LineString)

Линейная геометрия представляет последовательность точек, соединённых отрезками. Используется для маршрутов, дорог, траекторий движения.

Создание линии:

import LineString from 'ol/geom/LineString';

const line = new LineString([
  [30, 50],
  [31, 51],
  [32, 50.5]
]);

Ключевые особенности:

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

Получение длины:

const length = line.getLength();

Полигон (Polygon)

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

Создание полигона:

import Polygon from 'ol/geom/Polygon';

const polygon = new Polygon([[
  [30, 50],
  [31, 50],
  [31, 51],
  [30, 51],
  [30, 50]
]]);

Структура координат:

  • внешний контур (обязательный)
  • внутренние кольца (дырки) — опционально

Пример полигона с вырезом:

const polygon = new Polygon([
  [
    [30, 50],
    [32, 50],
    [32, 52],
    [30, 52],
    [30, 50]
  ],
  [
    [30.5, 50.5],
    [31.5, 50.5],
    [31.5, 51.5],
    [30.5, 51.5],
    [30.5, 50.5]
  ]
]);

Полигон поддерживает вычисление:

  • площади
  • экстента
  • внутренних и внешних колец

Мульти-точка (MultiPoint)

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

import MultiPoint from 'ol/geom/MultiPoint';

const multiPoint = new MultiPoint([
  [30, 50],
  [31, 51],
  [32, 52]
]);

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

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

Мульти-линия (MultiLineString)

Представляет набор линий, объединённых в один объект.

import MultiLineString from 'ol/geom/MultiLineString';

const multiLine = new MultiLineString([
  [
    [30, 50],
    [31, 51]
  ],
  [
    [32, 52],
    [33, 53]
  ]
]);

Применение:

  • дорожные сети
  • маршруты с альтернативами
  • разрозненные линии одного типа

Мульти-полигон (MultiPolygon)

Сложный тип геометрии, объединяющий несколько полигонов.

import MultiPolygon from 'ol/geom/MultiPolygon';

const multiPolygon = new MultiPolygon([
  [
    [
      [30, 50],
      [31, 50],
      [31, 51],
      [30, 51],
      [30, 50]
    ]
  ],
  [
    [
      [32, 52],
      [33, 52],
      [33, 53],
      [32, 53],
      [32, 52]
    ]
  ]
]);

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

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

Геометрическая коллекция (GeometryCollection)

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

import GeometryCollection from 'ol/geom/GeometryCollection';
import Point from 'ol/geom/Point';
import LineString from 'ol/geom/LineString';

const collection = new GeometryCollection([
  new Point([30, 50]),
  new LineString([
    [30, 50],
    [31, 51]
  ])
]);

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

Ограничения:

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

Круг (Circle)

Круговая геометрия задаётся центром и радиусом. В OpenLayers она является отдельным типом, хотя в рендеринге может преобразовываться в полигон.

import Circle from 'ol/geom/Circle';

const circle = new Circle([30, 50], 1000);

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

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

Координатные системы и геометрии

Геометрии в OpenLayers не привязаны к конкретной проекции, но интерпретация координат зависит от контекста слоя и карты.

Часто используется преобразование:

import { transform } from 'ol/proj';

const coord = transform([30, 50], 'EPSG:4326', 'EPSG:3857');

Важные аспекты:

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

Методы трансформации геометрий

Все геометрии поддерживают набор операций:

Клонирование

const copy = geometry.clone();

Смещение

geometry.translate(10, 20);

Масштабирование

geometry.scale(2);

Поворот

geometry.rotate(Math.PI / 4, [30, 50]);

Эти операции применяются ко всей структуре координат.

Экстенты геометрий

Экстент — это минимальный ограничивающий прямоугольник:

const extent = geometry.getExtent();

Формат:

[minX, minY, maxX, maxY]

Экстенты используются для:

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

Взаимодействие с Feature

Геометрии почти всегда используются внутри объектов Feature:

import Feature from 'ol/Feature';

const feature = new Feature({
  geometry: new Point([30, 50])
});

Это разделяет:

  • геометрию (форма)
  • свойства (атрибуты)
  • стиль (визуализация)

Сериализация и форматы обмена

Геометрии могут преобразовываться в стандартные форматы.

GeoJSON

import GeoJSON from 'ol/format/GeoJSON';

const format = new GeoJSON();

const json = format.writeGeometry(geometry);

WKT

Поддерживается через дополнительные форматы расширений.

Сериализация важна для:

  • хранения данных
  • передачи через API
  • интеграции с GIS-системами

Сферическая геометрия

OpenLayers учитывает кривизну Земли при некоторых операциях.

Примеры:

  • вычисление расстояний по дуге
  • корректные площади на сфере
  • геодезические измерения

Это особенно важно для:

  • глобальных карт
  • GPS-данных
  • навигационных приложений

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

При работе с большим количеством геометрий учитываются:

  • упрощение геометрии (simplification)
  • кэширование экстентов
  • использование индексов
  • минимизация пересчётов координат

Сложные полигоны и коллекции могут существенно влиять на производительность рендеринга, особенно при интерактивном редактировании.

Редактирование геометрий

Геометрии могут изменяться интерактивно через взаимодействия:

  • добавление точек
  • перемещение вершин
  • разбиение линий
  • редактирование полигонов

Изменения автоматически отражаются в связанных Feature, что делает систему реактивной к пространственным данным.