Полигон в API представляет собой замкнутую геометрическую фигуру,
задаваемую набором координат. Внутренняя модель хранения основана на
массиве контуров, где каждый контур — это последовательность точек типа
LatLngLiteral или LatLng.
Ключевая особенность полигона — поддержка многоконтурной структуры, позволяющей описывать как внешнюю границу, так и внутренние вырезы (holes).
Полигон создаётся через конструктор google.maps.Polygon,
которому передаётся объект конфигурации:
const polygon = new google.maps.Polygon({
paths: [
{ lat: 55.75, lng: 37.61 },
{ lat: 55.76, lng: 37.62 },
{ lat: 55.75, lng: 37.63 }
],
strokeColor: "#FF0000",
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: "#FF0000",
fillOpacity: 0.35
});
polygon.setMap(map);
В этом примере используется один контур. Он автоматически замыкается между последней и первой точкой.
Поддерживаются два уровня вложенности:
Структура paths принимает следующий вид:
paths: [
[ /* внешний контур */ ],
[ /* отверстие 1 */ ],
[ /* отверстие 2 */ ]
]
Каждый элемент — массив координат.
Отверстия внутри полигона реализуются через добавление внутренних контуров. Эти контуры автоматически вычитаются из области внешнего полигона.
const polygonWithHole = new google.maps.Polygon({
paths: [
// Внешний контур
[
{ lat: 55.80, lng: 37.60 },
{ lat: 55.80, lng: 37.70 },
{ lat: 55.70, lng: 37.70 },
{ lat: 55.70, lng: 37.60 }
],
// Внутренний контур (отверстие)
[
{ lat: 55.78, lng: 37.63 },
{ lat: 55.78, lng: 37.67 },
{ lat: 55.74, lng: 37.67 },
{ lat: 55.74, lng: 37.63 }
]
],
strokeColor: "#0000FF",
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: "#0000FF",
fillOpacity: 0.2
});
polygonWithHole.setMap(map);
Механизм обработки внутренних контуров основан на правилах заполнения области:
Это позволяет строить сложные геометрические формы без ручного вычисления разности множеств.
Хотя API во многих случаях автоматически нормализует направление обхода, в сложных сценариях (особенно при ручной генерации геометрии) учитывается ориентация:
При некорректной ориентации возможны артефакты отображения или неверное вычитание областей.
Полигоны с отверстиями можно изменять после создания:
const paths = polygonWithHole.getPaths();
// изменение внешнего контура
paths.getAt(0).push(new google.maps.LatLng(55.79, 37.65));
// изменение отверстия
paths.getAt(1).push(new google.maps.LatLng(55.76, 37.66));
Метод getPaths() возвращает MVCArray,
позволяющий реактивно обновлять геометрию.
Внутренняя структура полигона основана на MVCArray, что
обеспечивает реактивное обновление на карте:
setMapconst outerPath = new google.maps.MVCArray([
new google.maps.LatLng(55.80, 37.60),
new google.maps.LatLng(55.80, 37.70),
new google.maps.LatLng(55.70, 37.70),
new google.maps.LatLng(55.70, 37.60)
]);
const holePath = new google.maps.MVCArray([
new google.maps.LatLng(55.78, 37.63),
new google.maps.LatLng(55.78, 37.67),
new google.maps.LatLng(55.74, 37.67),
new google.maps.LatLng(55.74, 37.63)
]);
const polygon = new google.maps.Polygon({
paths: new google.maps.MVCArray([outerPath, holePath])
});
polygon.setMap(map);
API допускает несколько уровней внутренней геометрии:
Для таких случаев геометрия должна быть приведена к набору независимых контуров.
Каждый полигон поддерживает независимую настройку визуальных параметров:
strokeColor — цвет границыstrokeOpacity — прозрачность границыstrokeWeight — толщина линииfillColor — цвет заливкиfillOpacity — прозрачность заливкиОтверстия наследуют заливку внешнего полигона, но визуально вычитаются из области отображения.
Полигон с отверстиями сохраняет стандартную модель событий:
polygon.addListener("click", (event) => {
console.log(event.latLng);
});
Клики внутри отверстий не считаются попаданием в полигон, так как координаты исключаются из области покрытия.
Для вычисления попадания точки в полигон используется алгоритм ray casting с учётом внутренних контуров:
Это поведение полностью согласовано с визуальной моделью отображения.
Частые проблемы при работе с многоконтурными полигонами:
Такие ошибки приводят к некорректной отрисовке или исчезновению части геометрии.
Рост числа контуров и вершин напрямую влияет на:
Оптимизация обычно достигается: