OpenLayers строится вокруг строгой геометрической модели, в которой пространственные объекты представлены как набор базовых геометрий и операций над ними. Геометрическая подсистема включает точки, линии, полигоны и коллекции геометрий, а также набор методов для трансформации, анализа и вычисления метрик.
Основой служит абстрактный класс Geometry, от которого
наследуются конкретные реализации:
Point — точечные объектыLineString — ломаные линииPolygon — замкнутые областиMultiPoint, MultiLineString,
MultiPolygon — коллекции однотипных геометрийGeometryCollection — произвольные наборы геометрийКаждая геометрия хранит координаты в формате массива, согласованного с системой координат карты (обычно EPSG:3857 или EPSG:4326).
import Point from 'ol/geom/Point';
const point = new Point([30.31413, 59.93863]);
Геометрии в OpenLayers являются изменяемыми объектами, что позволяет динамически обновлять координаты без пересоздания слоя.
Геометрические операции в веб-картографии напрямую зависят от системы
координат. OpenLayers использует модуль ol/proj для
преобразований между системами координат.
import { fromLonLat, toLonLat } from 'ol/proj';
const mercatorCoord = fromLonLat([30.31413, 59.93863]);
const lonLat = toLonLat(mercatorCoord);
Ключевая особенность: большинство операций визуализации выполняется в проекции Web Mercator, тогда как анализ часто требует географических координат (EPSG:4326).
Модуль ol/extent предоставляет набор функций для работы
с прямоугольными границами (bounding box), которые часто используются
как упрощённая модель геометрии.
Основные операции:
import * as extent from 'ol/extent';
const a = [0, 0, 10, 10];
const b = [5, 5, 15, 15];
const intersection = extent.getIntersection(a, b);
const union = extent.getIntersection(a, b);
const contains = extent.containsExtent(a, b);
Extent-операции применяются для:
Особенно важна операция расширения границ:
const expanded = extent.buffer(a, 2);
Она позволяет учитывать “зону влияния” объекта при поиске пересечений.
Базовые трансформации включают перенос, масштабирование и вращение. В OpenLayers они реализуются через методы геометрии и вспомогательные функции.
geometry.translate(10, 20);
geometry.scale(2);
geometry.rotate(Math.PI / 4);
Каждая операция изменяет координаты in-place, что важно учитывать при работе с реактивными слоями.
Для оптимизации отображения сложных объектов используется метод
simplify, основанный на алгоритме Дугласа–Пекера.
const simplified = geometry.simplify(0.001);
Параметр точности определяет допустимое отклонение от исходной формы. Упрощение особенно критично при:
Геометрические вычисления в плоской проекции дают искажения, поэтому
OpenLayers предоставляет модуль ol/sphere.
import { getArea, getLength } from 'ol/sphere';
const area = getArea(polygonGeometry);
const length = getLength(lineStringGeometry);
Особенности:
Для полигона с отверстиями учитывается вклад внешнего контура и вычитание внутренних.
В базовой поставке OpenLayers отсутствует полноценный набор булевых операций (union, intersection, difference) как в GIS-системах уровня PostGIS. Однако такие операции реализуются через внешние библиотеки или комбинирование подходов.
Типовой подход:
import GeoJSON from 'ol/format/GeoJSON';
import union from '@turf/union';
const format = new GeoJSON();
const aGeoJSON = format.writeGeometryObject(geomA);
const bGeoJSON = format.writeGeometryObject(geomB);
const result = union(aGeoJSON, bGeoJSON);
const mergedGeometry = format.readGeometry(result.geometry);
Булевы операции используются для:
OpenLayers предоставляет базовые проверки топологических отношений через extent и геометрические методы:
intersectsExtent)containsXY,
intersectsCoordinate)geometry.intersectsCoordinate([30.31, 59.93]);
Для сложных проверок используется комбинированный подход:
if (extent.intersects(extA, extB)) {
if (geometryA.intersectsExtent(extB)) {
// точная обработка
}
}
Такой двухуровневый подход снижает вычислительную нагрузку при большом количестве объектов.
GeometryCollection позволяет объединять разнородные
объекты в единый контейнер.
import GeometryCollection from 'ol/geom/GeometryCollection';
const collection = new GeometryCollection([
point,
line,
polygon
]);
Коллекции применяются в случаях:
При этом многие операции необходимо выполнять рекурсивно по всем вложенным геометриям.
Перед выполнением операций часто требуется нормализация структуры координат:
polygon.getLinearRing(0).close();
Некоторые алгоритмы требуют согласованной ориентации:
Хотя OpenLayers не предоставляет полноценный R-tree как встроенную
часть геометрии, он активно использует индексирование через
ol/source/Vector и кэширование extent.
Стратегия оптимизации включает:
Это особенно важно при работе с тысячами объектов в одном слое.
При использовании взаимодействий (ol/interaction/Draw,
Modify) геометрические операции происходят в реальном
времени:
LineStringimport Draw from 'ol/interaction/Draw';
const draw = new Draw({
source: vectorSource,
type: 'Polygon'
});
Каждое изменение триггерит пересчёт геометрических характеристик и перерисовку слоя.
В реальных задачах геометрические операции редко используются изолированно. Типичный пайплайн включает:
import { simplify } from 'ol/geom/Geometry';
import { getArea } from 'ol/sphere';
const simplified = geometry.simplify(0.0005);
const area = getArea(simplified);
Буферизация позволяет создавать геометрии расширенной области вокруг объекта. В OpenLayers нет полноценного встроенного buffer для всех типов, но он часто реализуется через дополнительные библиотеки или аппроксимацию.
Применения:
Буферизация тесно связана с масштабированием и аппроксимацией кривых линий при малом количестве вершин.
Важным аспектом является баланс между точностью и производительностью:
Поэтому геометрическая подсистема OpenLayers рассматривается как многоуровневая модель, где разные операции применяются на разных этапах обработки данных.