Векторные объекты в OpenLayers отображаются через систему стилей, где
текст является отдельным компонентом ol/style/Text. Он
применяется для подписей объектов карты: названий улиц, точек интереса,
меток слоёв и динамических данных.
Текстовый стиль может использоваться совместно с геометрическими стилями (заливка, обводка, иконки), либо самостоятельно.
Основной объект для работы с текстом — ol/style/Text,
который передаётся в ol/style/Style:
import Style from 'ol/style/Style';
import Text from 'ol/style/Text';
import Fill from 'ol/style/Fill';
import Stroke from 'ol/style/Stroke';
const textStyle = new Text({
text: 'Объект',
font: '14px Arial',
fill: new Fill({
color: '#333'
}),
stroke: new Stroke({
color: '#ffffff',
width: 3
})
});
const style = new Style({
text: textStyle
});
Ключевая особенность заключается в том, что текст всегда рендерится как часть стиля объекта, а не как отдельный слой.
text: статические и динамические значенияПоле text определяет содержимое подписи. Оно может
быть:
Пример динамической привязки:
text: feature => feature.get('name')
При использовании функций стиль становится вычисляемым при каждом рендере, что позволяет адаптировать подписи к данным.
Свойство font задаёт CSS-подобное описание:
font: 'bold 16px "Roboto", sans-serif'
Поддерживаются:
bold, italic)Шрифт влияет только на визуализацию текста, но не участвует в геометрии объекта.
Два ключевых элемента визуального контроля:
fill: new Fill({
color: '#000'
})
stroke: new Stroke({
color: '#fff',
width: 4
})
Обводка часто используется для повышения читаемости на насыщенных подложках. Комбинация fill + stroke является стандартом для картографических подписей.
textAlignОпределяет горизонтальное выравнивание:
leftrightcenterendstarttextAlign: 'center'
justifyИспользуется для многострочного текста:
justify: true
textBaselineОпределяет вертикальную привязку:
topmiddlebottomalphabeticПараметры смещения позволяют управлять положением подписи относительно геометрии:
offsetX: 10,
offsetY: -10
Применяется для предотвращения перекрытия текста с символами маркеров или геометрией.
rotationrotation: Math.PI / 4
Позволяет поворачивать текст, например, вдоль направления линии.
scalescale: 1.2
Используется для адаптивного изменения размера без изменения шрифта.
maxAngleОграничивает отображение текста на кривых:
maxAngle: 0.5
Если угол изгиба линии превышает значение, текст не рисуется.
overflowoverflow: true
Позволяет тексту выходить за пределы геометрии объекта. Используется для коротких подписей, которые иначе не помещаются.
backgroundFill и
backgroundStrokeДобавляют фон под текст:
backgroundFill: new Fill({
color: 'rgba(255,255,255,0.7)'
}),
backgroundStroke: new Stroke({
color: '#000',
width: 1
})
Применяется для повышения читаемости поверх сложных картографических слоёв.
paddingpadding: [5, 5, 5, 5]
Порядок: верх, право, низ, лево.
Используется для создания визуального «воздуха» вокруг подписи.
placementpoint — фиксированное положениеline — вдоль линииline-center — центр линииplacement: 'line'
При использовании линий текст автоматически ориентируется вдоль направления сегментов.
В плотных слоях подписи могут перекрывать друг друга. OpenLayers применяет алгоритмы разрешения конфликтов:
Дополнительно используется:
declutter: true
Этот режим снижает количество отображаемых подписей при перегрузке карты.
Наиболее гибкий подход — функция стиля:
const styleFunction = feature => {
const name = feature.get('name');
const type = feature.get('type');
return new Style({
text: new Text({
text: `${name} (${type})`,
font: '13px Arial',
fill: new Fill({ color: '#111' }),
stroke: new Stroke({ color: '#fff', width: 3 }),
overflow: true
})
});
};
Такой подход позволяет формировать подписи на основе атрибутов и состояния данных.
Перенос строки задаётся символом \n:
text: 'Город\nЦентр'
Каждая строка может иметь собственное выравнивание через
textAlign и justify.
При большом числе объектов текстовая отрисовка становится ресурсоёмкой. Основные факторы оптимизации:
declutterresolutionol/style/Text часто используется вместе с
ol/style/Icon:
image: new Icon({
src: 'marker.png'
}),
text: new Text({
text: 'Точка',
offsetY: -20
})
Такой подход применяется для маркеров с подписями, где текст визуально отделяется от пиктограммы.
Текст в OpenLayers рендерится на canvas, поэтому:
При масштабировании карты текст перерассчитывается в зависимости от текущего разрешения слоя.
Текст может зависеть не только от свойств объекта, но и от контекста слоя:
text: feature => {
const population = feature.get('pop');
return population > 100000 ? feature.get('name') : '';
}
Пустая строка предотвращает отображение подписи.
Условное отображение реализуется через:
'' в textvisible слояtext: feature => {
const zoom = feature.get('zoomLevel');
return zoom > 10 ? feature.get('name') : '';
}
Текстовые стили формируют семантический слой карты, связывая геометрию с именованной информацией. Они являются основным инструментом подписывания пространственных данных и обеспечивают читаемость карты без необходимости интерактивных всплывающих элементов.