Polygon в OpenLayers представляет собой замкнутую область на карте, задаваемую набором координат. Внутренняя модель построена вокруг концепции линий (rings):
Формально структура Polygon:
Polygon = [ outerRing, hole1, hole2, ... ]
Каждый ring — это массив координат вида:
[x, y]
или в географических координатах:
[longitude, latitude]
Базовый способ создания полигона:
import Polygon from 'ol/geom/Polygon.js';
const polygon = new Polygon([
[
[30.0, 50.0],
[31.0, 50.0],
[31.0, 51.0],
[30.0, 51.0],
[30.0, 50.0]
]
]);
Ключевое требование: первая и последняя точка должны совпадать, обеспечивая замыкание контура.
OpenLayers поддерживает вложенные области, которые вырезаются из основной геометрии:
const polygonWithHole = new Polygon([
[
[0, 0],
[10, 0],
[10, 10],
[0, 10],
[0, 0]
],
[
[3, 3],
[7, 3],
[7, 7],
[3, 7],
[3, 3]
]
]);
Внутренний ring интерпретируется как «дырка», не входящая в область полигона.
OpenLayers не привязывает координаты к конкретной системе координат внутри Geometry. Однако стандартом считается:
При необходимости преобразование выполняется через
ol/proj:
import { fromLonLat } from 'ol/proj';
const polygon = new Polygon([[
fromLonLat([30, 50]),
fromLonLat([31, 50]),
fromLonLat([31, 51]),
fromLonLat([30, 51]),
fromLonLat([30, 50])
]]);
Возвращает текущую структуру координат:
const coords = polygon.getCoordinates();
Результат всегда соответствует формату:
[number[][][]]
Полностью заменяет геометрию:
polygon.setCoordinates([
[
[0, 0],
[5, 0],
[5, 5],
[0, 5],
[0, 0]
]
]);
Добавляет точку в последний ring:
polygon.appendCoordinate([6, 6]);
Используется редко, так как требует корректного замыкания контура вручную.
Чтобы Polygon появился на карте, он должен быть частью Feature и VectorLayer.
import Feature from 'ol/Feature.js';
import VectorSource from 'ol/source/Vector.js';
import VectorLayer from 'ol/layer/Vector.js';
const feature = new Feature({
geometry: polygon
});
const source = new VectorSource({
features: [feature]
});
const layer = new VectorLayer({
source: source
});
Стили определяются через ol/style:
import Style from 'ol/style/Style.js';
import Fill from 'ol/style/Fill.js';
import Stroke from 'ol/style/Stroke.js';
const style = new Style({
fill: new Fill({
color: 'rgba(0, 150, 255, 0.3)'
}),
stroke: new Stroke({
color: '#3399CC',
width: 2
})
});
feature.setStyle(style);
Ключевые компоненты:
Для интерактивного создания используется Draw
interaction:
import Draw from 'ol/interaction/Draw.js';
const draw = new Draw({
source: source,
type: 'Polygon'
});
map.addInteraction(draw);
Особенности поведения:
Для изменения геометрии применяется Modify:
import Modify from 'ol/interaction/Modify.js';
const modify = new Modify({
source: source
});
map.addInteraction(modify);
Поддерживаемые операции:
OpenLayers не всегда автоматически валидирует полигоны. Самопересекающиеся формы могут:
Для вычислений используется:
import { getArea } from 'ol/sphere.js';
const area = getArea(polygon);
Polygon напрямую совместим с GeoJSON форматом:
import GeoJSON from 'ol/format/GeoJSON.js';
const geojson = new GeoJSON();
const json = geojson.writeFeature(feature);
Структура GeoJSON:
{
"type": "Polygon",
"coordinates": [
[[30, 50], [31, 50], [31, 51], [30, 51], [30, 50]]
]
}
Polygon — одна область.
MultiPolygon — набор независимых областей:
import MultiPolygon from 'ol/geom/MultiPolygon.js';
const multi = new MultiPolygon([
[
[
[0, 0],
[5, 0],
[5, 5],
[0, 5],
[0, 0]
]
],
[
[
[10, 10],
[15, 10],
[15, 15],
[10, 15],
[10, 10]
]
]
]);
Используется при работе с разрозненными территориями одного объекта.
При большом количестве вершин критичны:
Рекомендации:
setCoordinates вместо создания новых
Feature при обновленииOpenLayers преобразует Polygon в набор экранных координат:
Особенно важно: