В OpenLayers составные геометрии используются для представления наборов однотипных простых объектов в рамках одной сущности. Они позволяют работать с группами координат как с единым геометрическим объектом, сохраняя при этом структурную независимость каждого элемента.
К таким типам относятся:
Все они наследуют поведение базового класса геометрий и поддерживают стандартные операции: трансформации, сериализацию, взаимодействие с проекциями и отрисовку через стили.
Многоточечная геометрия представляет собой массив точек, где каждая точка задаётся координатами:
import MultiPoint from 'ol/geom/MultiPoint';
const multiPoint = new MultiPoint([
[30, 10],
[40, 40],
[50, 20]
]);
Каждый вложенный массив — это координаты одной точки в пространстве карты.
MultiPoint не создаёт отдельных геометрий для каждой точки. Вместо этого используется единая сущность, которая хранит массив координат и обрабатывает их совместно.
Ключевые особенности:
const coords = multiPoint.getCoordinates();
multiPoint.setCoordinates([
[10, 10],
[20, 20]
]);
Изменение координат полностью заменяет набор точек.
MultiPoint используется в задачах:
Многолинейная геометрия представляет собой массив линий, каждая из которых — это массив координат точек:
import MultiLineString from 'ol/geom/MultiLineString';
const multiLine = new MultiLineString([
[
[10, 10],
[20, 20],
[30, 30]
],
[
[40, 40],
[50, 50],
[60, 40]
]
]);
Каждый вложенный массив координат представляет отдельную линию.
MultiLineString объединяет несколько независимых линий в одну геометрию:
const lines = multiLine.getCoordinates();
multiLine.setCoordinates([
[
[0, 0],
[10, 10]
]
]);
Также возможно обновление отдельных линий через получение массива, его модификацию и повторную установку.
MultiLineString применяется для:
Многополигональная геометрия представляет собой массив полигонов, каждый из которых задаётся массивом контуров:
import MultiPolygon from 'ol/geom/MultiPolygon';
const multiPolygon = new MultiPolygon([
[
[
[10, 10],
[20, 10],
[20, 20],
[10, 20],
[10, 10]
]
],
[
[
[30, 30],
[40, 30],
[40, 40],
[30, 40],
[30, 30]
]
]
]);
Структура включает три уровня:
Каждый полигон может содержать:
Пример полигона с отверстием:
const polygonWithHole = new MultiPolygon([
[
[
[0, 0],
[100, 0],
[100, 100],
[0, 100],
[0, 0]
],
[
[20, 20],
[80, 20],
[80, 80],
[20, 80],
[20, 20]
]
]
]);
Внутренний контур вырезает область внутри внешнего полигона.
MultiPolygon объединяет несколько независимых областей:
const polygons = multiPolygon.getCoordinates();
multiPolygon.setCoordinates([
[
[
[0, 0],
[50, 0],
[50, 50],
[0, 50],
[0, 0]
]
]
]);
При изменении координат структура должна строго соответствовать формату вложенности.
MultiPolygon используется для:
Все составные геометрии в OpenLayers используют одинаковую модель координат, что позволяет:
Использование Multi*-геометрий снижает нагрузку при большом количестве объектов:
Однако при необходимости индивидуальной стилизации каждого элемента предпочтительнее использовать набор отдельных геометрий.
Все составные геометрии поддерживают:
Пример работы через GeoJSON:
import GeoJSON from 'ol/format/GeoJSON';
const format = new GeoJSON();
const feature = format.writeFeatureObject({
geometry: multiPolygon
});
Для MultiPoint, MultiLineString и MultiPolygon применяется единый стиль на всю геометрию. При необходимости дифференциации используется:
Составные геометрии поддерживают стандартные операции:
Особенность заключается в том, что операции применяются ко всему набору элементов одновременно, без разделения на отдельные компоненты.