В библиотеке OpenLayers геометрические объекты представляют собой
фундаментальную основу работы с пространственными данными. Любая
визуализация на карте — маркеры, линии маршрутов, границы территорий,
полигоны объектов — опирается на строгую систему геометрических типов,
реализованных в модуле ol/geom. Эти классы описывают форму
объектов независимо от их отображения и служат промежуточным слоем между
сырыми координатами и визуальными слоями.
Все геометрические типы в OpenLayers наследуются от базового класса
Geometry. Он определяет общий интерфейс, который
включает:
getExtent)Геометрия не содержит информации о стиле отображения — она отвечает только за форму.
Координаты в OpenLayers обычно задаются в формате массива:
[x, y]
или для трёхмерных данных:
[x, y, z]
Точечная геометрия представляет единичную координату на карте. Это самый простой тип геометрии, используемый для маркеров, объектов интереса, событийных меток.
Создание точки:
import Point from 'ol/geom/Point';
const point = new Point([30.5, 50.45]);
Особенности:
setCoordinatesFeatureПример изменения позиции:
point.setCoordinates([31.0, 51.0]);
Линейная геометрия представляет последовательность точек, соединённых отрезками. Используется для маршрутов, дорог, траекторий движения.
Создание линии:
import LineString from 'ol/geom/LineString';
const line = new LineString([
[30, 50],
[31, 51],
[32, 50.5]
]);
Ключевые особенности:
Получение длины:
const length = line.getLength();
Полигональная геометрия описывает замкнутые области. Она используется для отображения границ стран, земельных участков, зон покрытия.
Создание полигона:
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]
]
]);
Полигон поддерживает вычисление:
Мульти-точечная геометрия объединяет несколько независимых точек в один объект. Применяется для групповых маркеров.
import MultiPoint from 'ol/geom/MultiPoint';
const multiPoint = new MultiPoint([
[30, 50],
[31, 51],
[32, 52]
]);
Особенности:
Представляет набор линий, объединённых в один объект.
import MultiLineString from 'ol/geom/MultiLineString';
const multiLine = new MultiLineString([
[
[30, 50],
[31, 51]
],
[
[32, 52],
[33, 53]
]
]);
Применение:
Сложный тип геометрии, объединяющий несколько полигонов.
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]
]
]
]);
Особенности:
Позволяет объединять различные типы геометрий в один объект.
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]
])
]);
Используется в случаях, когда один объект логически состоит из разных форм.
Ограничения:
Круговая геометрия задаётся центром и радиусом. В 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:
import Feature from 'ol/Feature';
const feature = new Feature({
geometry: new Point([30, 50])
});
Это разделяет:
Геометрии могут преобразовываться в стандартные форматы.
import GeoJSON from 'ol/format/GeoJSON';
const format = new GeoJSON();
const json = format.writeGeometry(geometry);
Поддерживается через дополнительные форматы расширений.
Сериализация важна для:
OpenLayers учитывает кривизну Земли при некоторых операциях.
Примеры:
Это особенно важно для:
При работе с большим количеством геометрий учитываются:
Сложные полигоны и коллекции могут существенно влиять на производительность рендеринга, особенно при интерактивном редактировании.
Геометрии могут изменяться интерактивно через взаимодействия:
Изменения автоматически отражаются в связанных Feature,
что делает систему реактивной к пространственным данным.