PolygonLayer — один из ключевых слоёв для работы с полигональной геометрией в экосистеме deck.gl, предназначенный для визуализации областей на карте и в произвольных координатных пространствах. Он используется для отображения границ регионов, геозон, административных делений, пользовательских областей, а также для построения трёхмерных экструдированных объектов на основе полигонов.
Основная концепция слоя заключается в преобразовании массива полигональных данных в набор WebGL-примитивов с последующей стилизацией через атрибуты цвета, высоты и интерактивности.
PolygonLayer принимает данные в различных форматах, но ключевым является GeoJSON-подобная структура или массив координат.
Типичная форма входных данных:
const data = [
{
polygon: [
[37.78, -122.4],
[37.79, -122.41],
[37.77, -122.42]
],
population: 1200
}
];
Поддерживаются также:
FeatureCollectionКлючевая особенность слоя — полная гибкость извлечения геометрии
через функции getPolygon.
PolygonLayer создаётся как экземпляр слоя deck.gl и включается в массив layers.
import {Deck} from '@deck.gl/core';
import {PolygonLayer} from '@deck.gl/layers';
const layer = new PolygonLayer({
id: 'polygon-layer',
data,
getPolygon: d => d.polygon,
getFillColor: [255, 140, 0, 180],
getLineColor: [0, 0, 0],
lineWidthMinPixels: 1
});
const deck = new Deck({
initialViewState: {
longitude: -122.4,
latitude: 37.78,
zoom: 12
},
controller: true,
layers: [layer]
});
PolygonLayer работает с триангулированными представлениями полигонов. На входе принимаются:
Внутренне геометрия преобразуется в набор треугольников для рендеринга в WebGL. Это позволяет эффективно отображать сложные формы без потери производительности.
Формат полигона с отверстиями:
const polygon = [
// внешний контур
[
[0, 0],
[10, 0],
[10, 10],
[0, 10]
],
// отверстие
[
[3, 3],
[7, 3],
[7, 7],
[3, 7]
]
];
PolygonLayer обладает большим набором параметров, влияющих на визуализацию и поведение.
Функция извлечения геометрии из объекта данных.
getPolygon: d => d.geometry.coordinates
Используется для адаптации любых структур данных.
Определяет цвет заливки полигона.
getFillColor: d => [200, 0, 80, 180]
Поддерживается:
Определяет цвет границ полигона.
getLineColor: [0, 0, 0, 255]
Используется для визуального выделения контуров.
Задаёт толщину линии границы.
getLineWidth: 2
Также поддерживает функции-аксессоры.
Одной из ключевых возможностей PolygonLayer является поддержка трёхмерной экструзии.
Включает режим подъёма полигонов в 3D.
extruded: true
Определяет высоту экструдированного полигона.
getElevation: d => d.value
Часто используется для построения:
Позволяет задать материал для освещения.
material: {
ambient: 0.35,
diffuse: 0.6,
shininess: 32
}
Поддержка освещения делает возможной реалистичную визуализацию зданий и территорий.
PolygonLayer нативно поддерживает GeoJSON FeatureCollection.
const geojson = {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Polygon',
coordinates: [
[
[-122.4, 37.78],
[-122.41, 37.79],
[-122.42, 37.77],
[-122.4, 37.78]
]
]
},
properties: {
name: 'zone-a',
height: 100
}
}
]
};
Использование:
new PolygonLayer({
data: geojson,
getPolygon: f => f.geometry.coordinates,
getElevation: f => f.properties.height
});
PolygonLayer поддерживает MultiPolygon структуры, что важно для стран, регионов и сложных территорий.
const multiPolygon = [
[
[[0, 0], [10, 0], [10, 10], [0, 0]]
],
[
[[20, 20], [30, 20], [30, 30], [20, 20]]
]
];
Внутренне каждая часть обрабатывается как независимая геометрия, но рендерится в одном слое.
PolygonLayer поддерживает механизм picking — определение объекта под курсором.
pickable: true
onHover: info => {
console.log(info.object);
}
onClick: info => {
console.log('clicked polygon', info.object);
}
Информация info содержит:
x, y — координаты курсораobject — объект данныхcoordinate — географические координатыPolygonLayer оптимизирован для работы с большими наборами данных благодаря:
Ключевые практики оптимизации:
PolygonLayer поддерживает различные системы координат через
coordinateSystem.
coordinateSystem: COORDINATE_SYSTEM.LNGLAT
Также возможны:
Это делает слой универсальным не только для карт, но и для абстрактной 2D/3D визуализации.
PolygonLayer эффективно обрабатывает обновления данных через diffing props.
Пример обновления:
layer.setProps({
data: newData,
getFillColor: d => d.color
});
Изменяются только затронутые атрибуты, без полной перерасчётной геометрии.
PolygonLayer часто используется совместно с:
Пример композиции:
layers: [
new PolygonLayer({...}),
new ScatterplotLayer({...}),
new TextLayer({...})
]
Это позволяет строить многослойные геовизуализации.
PolygonLayer применяется в задачах:
Экструзия превращает числовые данные в высотные модели, что особенно полезно для сравнительного анализа территорий.
Гибкость PolygonLayer заключается в использовании accessor-функций:
getFillColor: d => {
if (d.value > 1000) return [255, 0, 0, 200];
return [0, 255, 0, 200];
}
Аналогично можно управлять:
PolygonLayer использует WebGL pipeline:
Контуры рендерятся отдельным проходом, что позволяет сохранять чёткие границы даже при масштабировании.
При работе с очень сложными полигонами:
Рекомендуется: