RU:MapCSS/0.2
Дата перевода 15.01.2026
MapCSS - это CSS-подобный язык для таблиц стилей карт.
На этой странице представлен второй вариант формата MapCSS. Смотрите MapCSS/0.1 для первого проекта, [[[Talk:MapCSS/0.2|страницe обсуждения]] и Предложения для предлагаемых улучшений. Существует список рассылки MapCSS.
Установите расширение VS Code, чтобы добавить визуальную подсветку для синтаксиса MapCSS и валидатора. Проверьте также BNF и грамматику antlr.
При вычислениях в MapCSS используется синтаксис оценки.
Структура языка
Таблица стилей MapCSS состоит из ряда правил, описывающих, как стилизовать элементы карты. Каждое правило состоит из двух частей:
- один или несколько селекторов, используемых для определения того, к каким элементам карты применима инструкция;
- одно или несколько объявлений, используемых для определения стиля, которын должны быть применены к соответствующим элементам.
Кроме того, можно добавлять комментарии, используя "//", чтобы закомментировать оставшуюся часть строки, или используя "/*" и "*/", чтобы закомментировать все, что находится между этими конечными точками.
Селекторы
Селекторы определяют, применимо ли правило к конкретному объекту или нет. Они могут проверять несколько параметров: тип объекта; уровень масштабирования при визуализации; теги, применяемые к объекту; псевдоклассы и классы, применяемые к объекту.
Типы
Типом селектора может быть любой из основных типов объектов OSM,
nodewayrelation
плюс еще несколько интересных кейсов,
area(способ, при котором начальная и конечная точка являются одной и той же точкой, или был установленarea=yes)line(способ, при котором начальная и конечная точка не являются одной и той же точкой, или был установленarea=no)canvas(фон для визуализации)*(любое из вышеперечисленных)
Тесты
Чтобы проверить, какие теги применяются к объекту, вы можете записать условие в квадратных скобках после типа объекта, в этих бинарных тестах может использоваться любой из этих операторов: =, !=, =~, >, <, >=, <=.
way[highway=primary] /* сопоставляется со всеми линиями с тегом highway' с установленным значением primary */ way[highway=~/.*ary/] /* сопоставляется со всеми линиями с тегом highway, соответствующими регулярному выражению .*ary */
Обратите внимание, что используемые здесь строки должны начинаться с буквы или символа '-' и содержать только буквы, цифры и символы '-'. Если вам нужно использовать имя тега или значение, содержащее какие-либо другие символы, строка должна быть заключена в кавычки:
way[highway="~/.*ary/"] /* сопоставляется со всеми линиями с тегом highway с установленным значениеь ~/.*ary/ (не является регулярным выражением). */ way[highway='a"b'] /* сопоставляется со всеми линиями с тегом highway с установленным значением a"b */ way[highway="a\"b"] /* сопоставляется со всеми линиями с тегом highway с установленным значением a"b */
Вы также можете использовать унарные тесты, чтобы узнать, установлен тег или нет:
way[highway] /* сопоставляется со всеми линиями с установленным тегом highway */ way[!highway] /* сопоставляется со всеми линиями, для которых не установлен тег highway (или установлено значение no/false). */ way.highway /* сопоставляется со всеми линиями с установленным классом тега highway */
Чтобы протестировать более одного условия для пути, просто добавьте дополнительные условия после типа. Для соответствия этому правилу должны быть выполнены все условия.
node[place=city][population<50000] /* сопоставляется со всеми точками, помеченными тегом place=city, значение тега population которых меньше 50000 */ node[place=city][population>=50000] /* сопоставляется со всеми точками, помеченными тегом place=city, значение тега population которых больше или равно 50000 */
Вы можете ограничить действие правил только теми элементами, которые отображаются при определенных уровнях масштабирования. Если это не указано, правило применяется ко всем уровням масштабирования:
way|z12[population<50000] /* сопоставляется со всеми линиями, у которых тег population имеет значение менее 50000, при условии, что средство визуализации в данный момент работает с уровнем масштабирования 12 */ way|z1-11[population>50000] /* сопоставляется со всеми линиями, у которых тег population имеет значение менее 50000, при условии, что средство визуализации в данный момент работает с любым уровнем масштабирования между 1 и 11 */
Теоретически это можно было бы расширить, чтобы использовать другие единицы измерения, например, way|s50000 для печатной карты формата 1:50000.
Комбинирование селекторов
Вы можете создать условие ИЛИ, сгруппировав селекторы через запятую:
way[highway=primary], way[highway=trunk] /* сопоставляется со всеми линиями с тегом highway, установленной в значение primary или trunk */
Группируя селекторы без запятой между ними, вы создаете селектор-потомок. Это соответствует последнему селектору, если и только если объект найден как часть другого объекта, соответствующего первому селектору:
way[highway=footpath] node[barrier=gate] /* сопоставляется с точкой с установленным barrier=gate, которые находятся на линиях с установленным highway=footpath */ relation[type=route] way[highway] /* сопоставляется с линиями с установленным тегом highway, которые находятся в отношении с установленным type=route */
При подобном объединении селекторов к элементам добавляются псевдотеги, позволяющие получить доступ к дополнительным данным. Здесь псевдотег role добавляется к объекту way, чтобы указать его роль в родительском отношении:
relation[type=route] way[role=proposed] /* сопоставляет линии внутри отношения с установленным type=route, с тегом role с установленным значением proposed */
(это пока не поддерживается Halcyon и Overpass Tubo. Также предлагается другой синтаксис, использующий дочерние селекторы ">" между элементом relation и дочерним элементом child, без добавления какого-либо псевдотега в дочерний элемент)
Синтаксические примечания
Пробелы в селекторах имеют большое значение
Вы можете быть снисходительны к тому, как мы относимся к пробелам. Количество пробелов не имеет значения (1 пробел по сравнению с тремя символами табуляции, CR и пробелом), но наличие или отсутствие пробелов в селекторах имеет значение. Это означает, что мы можем, например, записать приведенный выше селектор следующим образом:
relation[type=route] way[highway]
Но если бы мы написали его так (с пробелом между типом объекта и тестами), он бы не разобрался:
relation [type=route] way [highway]
Поддержка различных библиотек для вышеприведенных селекторов
| Selector-Part | Пример | JOSM | pgm |
|---|---|---|---|
| Type | node, way, relation, area, line, canvas, *
|
+[1] | + |
| Tag match | way[highway=primary]
|
+ | + |
| Tag match (quoted) | way["highway"="primary"]
|
+ | + |
| Tag regexp match | way[highway=~/.ary/]
|
+ | + |
| Tag is set? | way[highway]
|
+ | + |
| Tag is not set? | way[!highway]
|
+ | + |
| Class is set? | way.highway
|
+ | + |
| Numeric comparision | node[population<50000]
|
+ | + |
| Zoom selector | node|z12-
|
+ | + |
| Link selector, relation members | relation member
|
+ [2] | + |
| Link selector, way nodes | way node
|
+ [2] | + |
| Comment block style | /* ... */ | + | + |
| Comment inline style | // ... | - | + |
Декларация
Декларации записываются путем заключения набора спецификаторов стиля в фигурные скобки:
{
opacity: 0.5;
color: rgb(1.0, 0.0, 0.0);
}
Смотрите раздел #Vocabulary для получения списка всех доступных спецификаторов и того, какие средства визуализации их поддерживают.
Декларации также могут использоваться для установки значений определенных тегов для объекта:
{ set tag=value; } /* установить для tag */
{ set tag; } /* установить для tag значение yes */
Наконец, вы можете вычислить значения, используя инструкцию eval:
{ opacity: eval("tag('population')/100000"); }
{ set width_in_metres=eval("tag('lanes')*3"); }
Классы
Вы можете установить теги, начинающиеся с полной точки, для имитации классов:
{ set .minor_road; }
Затем вы можете использовать тест .minor_road (как указано выше) в селекторе:
way.minor_road
Это открывает новые возможности при использовании правила @import и типа носителя. У вас может быть набор правил для каждого носителя (например, непосредственно из базы данных OSM или из продукта osm2pgsql), каждое из которых устанавливает псевдоклассы. Затем к этим стилям применяется основная таблица стилей:
@import url("osmtags.css") osmtags;
@import url("osmpostgis.css") osmpostgis;
(Правило @import еще не поддерживается Halcyon.)
Псевдоклассы
Интерактивные клиенты могут поддерживать псевдоклассы :hover и :active.
Поддержка различных библиотек для различных деклараций
| Описание | Примеры | JOSM | pgm |
|---|---|---|---|
| Назначить свойство | opacity: 0.5;
|
+ | + |
| Установить tag в значение value | set tag=value;
|
- | + |
| Установить tag в значение yes | set tag;
|
-[1] | + |
| Назначить вычисление | width: eval(2*3)
|
+ | + |
| Установить класс | set .class;
|
+ | + |
Объявить @import |
@import url("tags.css");
|
- | + |
Псевдокласс из объявленого @import |
@import url("tags.css") osmtags;
|
- | - |
Псевдокласс :hover |
way:hover
|
- | - |
Псевдокласс :active |
way:active
|
- | - |
- ↑ устанавливает не tag, а класс вместо него
Лексика
Будут использоваться следующие сокращения:
- OSPad: OpenStreetPad
- pgm: pgmapcss
Свойства холста
| Описание | Пример | Halcyon | Kothic | Ceyx | OSPad | alaCarte | JOSM | pgm | |
|---|---|---|---|---|---|---|---|---|---|
antialiasing
|
Как отобразить сглаживание: full (по умолчанию), text (линии не ровные, текст есть), none (сглаживание не выполняется)
|
- | - | +* | - | - | - | - | |
fill-color
|
Цвет холста - либо 3-значное, либо 6-значное шестнадцатеричное значение, либо название цвета CSS, либо спецификатор цвета RGB. | fill-color: lightgreenfill-color: #8F8fill-color: #88FF88fill-color: rgb(0.53, 1, 0.53)
|
- | + | + | + | + | + [1] | + |
| Цвет холста с помощью альфа-компонента - 8-значного шестнадцатеричного значения или спецификатора цвета RGBA (уровень CSS 3) (альфа-компонент обычно сочетается с атрибутом прозрачности, если поддерживается одновременно). |
fill-color: #88FF8880fill-color: rgba(0.53, 1, 0.53, 0.5)
|
? | ? | ? | ? | + | ? | + | |
fill-opacity
|
Степень прозрачности заливки: от 0 (прозрачная) до 1 (непрозрачная) | fill-opacity: 0.2
|
- | + | + | + | - [2] | - | - [3] |
fill-image
|
URL-адрес (абсолютный или относительный) изображения, которым нужно заполнить холст | fill-image: url('fills/grass.png')
|
- | - | + | + | + | - | + |
- ↑ начиная с версии 7110, ранее называелся
background-color - ↑ Но непрозрачность поддерживается как альфа-компонент соответствующего атрибута цвета (например,
fill-color: #FF000080"подразумеваетfill-opacity: 0.5) - ↑ Вместо этого вы можете установить альфа-канал для
fill-colorнапример,fill-color: #FF000080"
Свойства линии
| Описание | Пример | Halcyon | Kothic | Ceyx | OSPad | alaCarte | JOSM | pgm | |
|---|---|---|---|---|---|---|---|---|---|
z-index
|
Определяет подуровень в слое OSM | +[1] | + | + | + | + | + | + | |
width
|
Ширина линии в пикселях | width: 5
|
+ | + | + | + | + | + | + |
color
|
Цвет линии - 3-значное или 6-значное шестнадцатеричное значение, название цвета CSS или спецификатор цвета RGB | color: bluecolor: #00Fcolor: #0000FFcolor: rgb(0.0, 0.0, 1.0)
|
+ | + | + | + | + | + | + |
| Цвет линии с альфа-компонентом - 8-значное шестнадцатеричное значение или спецификатор цвета RGBA (уровень CSS 3) (альфа-компонент обычно сочетается с атрибутом прозрачности, если поддерживается одновременно) |
color: #0000FF80color: rgba(0.0, 0.0, 1.0, 0.5)
|
? | ? | ? | ? | + | ? | ? | |
opacity
|
Насколько прозрачна линия, от 0 (прозрачная) до 1 (непрозрачная) | opacity: 0.5
|
+ | + | + | + | - [2] | + | + |
dashes
|
Массив чередующихся длин включения/выключения | dashes: 2,2,4,2
|
+ | + | + | + | + | + | + |
image
|
URL-адрес изображения, которое будет использоваться для заполнения линии | - | + | - | + | + | - | + | |
linecap
|
Стиль для конца строки: none (по умолчанию), round или square
|
+ | + | + | + | + | + | + | |
linejoin
|
Стиль для углов линий: round (по умолчанию), miter или bevel
|
+ | + | + | + | + | + | + | |
fill-color
|
Цвет, которым заполняется область, если она замкнута - шестнадцатеричное значение или цвет CSS | fill-color: lightgreen
|
+ | + | + | + | + | + | + |
fill-opacity
|
Степень прозрачности заливки: от 0 (прозрачная) до 1 (непрозрачная) | fill-opacity: 0.2
|
+ | + | + | + | - [2] | + | + |
fill-image
|
URL-адрес (абсолютный или относительный) изображения, которым нужно заполнить область | fill-image: url('fills/grass.png')
|
+ | + | + | + | + | + | + |
casing-width
|
Ширина обрамления (границы) линии. Например, обрамление шириной 1 пиксель с каждой стороны будет указано как casing-width:1 (изменение по сравнению с MapCSS 0.1)
|
casing-width: 3
|
- | + | + | + | + | + | + |
casing-color
|
Цвет (шестнадцатеричное или название CSS) корпуса | + | + | + | + | + | + | + | |
casing-opacity
|
Прозрачность корпуса | + | + | + | + | - [2] | + | + | |
casing-dashes
|
Массив чередующихся длин включения/выключения | + | + | + | + | + | + | + | |
casing-linecap
|
Стиль для конца линии корпуса (по умолчанию используется значение linecap)
|
- | + | + | + | + | + | + | |
casing-linejoin
|
Стиль углов линии корпуса (по умолчанию используется значение linejoin)
|
- | + | + | + | + | + | + | |
extrude
|
Высота выдавливаемой линии | extrude: eval('zmetric(tag("height"))')
|
- | + | - | - | - | - | - |
extrude-edge-color
|
Цвет рёбер трёхмерного объекта (по умолчанию используется значение color)
|
- | + | - | - | - | - | - | |
extrude-edge-opacity
|
Непрозрачность выдавливаемых рёбер (по умолчанию используется значение opacity)
|
- | + | - | - | - | - | - | |
extrude-face-color
|
Цвет выдавленных рёбер (по умолчанию используется значение fill-color)
|
- | + | - | - | - | - | - | |
extrude-face-opacity
|
Насколько прозрачны выдавливаемые рёбра (по умолчанию используется значение fill-opacity)
|
- | + | - | - | - | - | - |
Свойства точки/значка
Могут применяться к точкам или областям (замкнутым путям). В случае областей, решение о размещении значка в пределах области остается за разработчиком визуализации.
| Описание | Пример | Halcyon | Kothic | Ceyx | OSPad | alaCarte | JOSM | pgm | |
|---|---|---|---|---|---|---|---|---|---|
icon-image
|
URL-адрес (абсолютный или относительный) изображения, которое будет использоваться в качестве значка | icon-image: url('icons/pharmacy.png')
|
+ | - | +* | + | + | +[1] | + |
icon-width
|
Указывается либо единица измерения, либо коэффициент масштабирования в %. Если задано только одно из значений icon-width и icon-height, масштабирование с сохранением соотношения сторон применяется в обоих направлениях
|
icon-width: 25, icon-width: 70%
|
- | - | - | + | + | +[2] | - |
icon-height
|
Указывается либо единица измерения, либо коэффициент масштабирования в %. Если задано только одно из значений icon-width и icon-height, масштабирование с сохранением соотношения сторон применяется в обоих направлениях
|
icon-height: 25; icon-height: 70%
|
- | - | - | + | + | +[2] | - |
icon-opacity
|
Непрозрачность изображения значка | icon-opacity: 0.3
|
- | - | - | + | + | + | + |
- ↑ синтаксис немного отличается от показанного здесь, смотрите JOSM/Help/Styles/Images
- ↑ 2.0 2.1 только абсолютное количество пикселей, без процента
Свойства надписи
| Описание | Пример | Halcyon | Kothic | Ceyx | OSPad | alaCarte | JOSM | pgm | |
|---|---|---|---|---|---|---|---|---|---|
font-family
|
Название используемого шрифта | font-family: DejaVu
|
+ | - | + | + | + | + | +[1] |
font-size
|
Размер текста (целое число) | font-size: 12
|
+ | + | + | + | + | + | + |
font-weight
|
bold или normal
|
font-weight: bold
|
+ | - | + | + | + | + | + |
font-style
|
italic или normal
|
font-style: italic
|
+ | - | + | + | + | + | + |
font-variant
|
normal (по умолчанию) или small-caps (новое в MapCSS 0.2)
|
font-style: small-caps
|
- | - | +* | - | - | - | - |
text-decoration
|
none или underline
|
text-decoration: underline
|
+ | - | + | + | - | - | - |
text-transform
|
none, uppercase, lowercase или capitalize
|
text-transform: uppercase
|
+ | - | + | + | - | - | + |
text-color
|
Шестнадцатеричное значение или название цвета в CSS | text-color: #07CF20
|
+ | + | + | + | + | + | + |
text-opacity
|
Степень прозрачности текста - от 0 (прозрачный) до 1 (непрозрачный) | text-opacity: 0.75
|
- | - | - | + | - [2] | + | + |
text-position
|
Следует ли текст по контуру пути (line) или располагается по центру области (center)
|
text-position: center
|
+ | + | - | + | + | + | + |
text-offset
|
Смещение по вертикали от центра линии или точки. Смещение на 5 для линии шириной 3 означает, что текст будет располагаться "вдоль" линии, а не внутри нее. Аналогично, смещение на 8 в точке со значком высотой 16 пикселей приведет к размещению текста под значком | text-offset: -5
|
+ | - | + | + | + | + | + |
max-width
|
Максимальная ширина текстовой надписи для точки, после которой она должна переходить на следующую строку | max-width: 30
|
+ | - | +* | + | - | - | + |
text
|
Ключ тега, значение которого используется для надписи. Например, text: name будет отображать тег с именем
|
text: name
|
+ | + | + | + | + | + | + |
text-halo-color
|
Цвет (шестнадцатеричный или CSS) ореола (halo) или выдвижения (pull-out), используемого для выделения текста на фоне объектов под ним | text-halo-color: white
|
+ | + | + | + | + | + | + |
text-halo-radius
|
Радиус ореола | text-halo-radius: 2
|
+ | + | + | + | + | + | + |
Свойства обрамления
| definition | example | Halcyon | Kothic | Ceyx | alaCarte | JOSM | pgm | |
|---|---|---|---|---|---|---|---|---|
shield-color
|
Цвет обрамления - либо шестнадцатеричное значение, либо название цвета в CSS | shield-color: blueshield-color: #0000FF
|
- | - | - | + | - | - |
shield-opacity
|
Степень прозрачности обрамления - от 0 (прозрачный) до 1 (непрозрачный) | shield-opacity: 0.5
|
- | - | - | + | - | + |
shield-frame-color
|
Цвет рамки обрамления | - | - | - | + | - | - | |
shield-frame-width
|
Ширина рамки. Если значение равно 0, рамка не отображается | - | - | - | + | - | - | |
shield-casing-color
|
Цвет корпуса экранирования | - | - | - | + | - | - | |
shield-casing-width
|
Ширина корпуса обрамления | - | - | - | + | - | - | |
shield-text
|
Текст для отображения на экране | - | - | - | + | - | + | |
shield-image
|
URL-адрес (абсолютный или относительный) изображения, которое будет использоваться в качестве фона для текста. | fill-image: url('fills/grass.png')
|
- | - | - | + | - | + |
shield-shape
|
Форма обрамления. Может быть rounded или rectangular
|
- | - | - | + | - | - |
Применение стилей
Объекты визуализации
Отображать следует только точки и линии. Отношения следует использовать только для применения другого стиля к линии или точки. Например, чтобы окрасить маршрут в красный цвет, можно использовать следующий стиль:
relation[type=route] way[highway] { color: red; }
Но не этот стиль:
relation[type=route] { color: red; }
Единственным возможным исключением из этого правила являются многополигонные отношения, которые некоторые средства визуализации могут интерпретировать как примитивы областей.
Порядок визуализации
Объекты должны отображаться в следующем порядке (спереди назад):
- объекты нижнего слоя всегда должны отображаться первыми;
- внутри слоя сначала визуализируются все заливки, затем все контуры, затем все обводки, затем все значки и надписи;
- внутри каждой из этих категорий объекты упорядочены в соответствии с z-индексом;
- если все вышеперечисленное равно, то порядок не определен.
Поддержка различных библиотек для изменения порядка визуализации
| Описание | JOSM | pgm |
|---|---|---|
| Использовать слой объектов для упорядочения визуализации | - | + |
| Внутри слоя визуализируются заливки, затем контуры, затем обводки, затем значки и надписи | + | +[1] |
- ↑ pgmapcss игнорирует слой для значков и надписей и отображает их поверх всего остального
Порядок приложений
Таблица стилей описывает, как определить стиль для любой заданной точки или линии. Чтобы определить стиль, вы должны пошагово ознакомиться с правилами, чтобы определить, применимы ли они к какой-либо заданной линии или точке. Если более позднее правило предоставляет стиль, противоречащий предыдущему, более поздний стиль перезаписывает старый. Обратите внимание, что это означает, что недопустимо обрабатывать селекторы-потомки во время сопоставления родительского элемента, так как это может привести к созданию неправильного стиля, как показано ниже:
Возьмем, к примеру, следующую таблицу стилей:
node
{
width: 2;
color: blue;
}
way node
{
width: 2;
color: red;
}
Применяется к следующим объектам (большинство деталей опущено для краткости):
<way id="1"> <nd id="2" /> </way> <node id="2" />
Правильный стиль здесь заключается в том, чтобы линия не отображалась, а точка отображалась в виде красной точки шириной 2 пикселя. Если бы мы обрабатывали селекторы-потомки в то время, когда родительский селектор соответствовал бы родительскому, мы бы вместо этого обработали линию и добавили бы к точке стиль красной точки шириной 2 пикселя, затем обработали бы точку и неправильно заменили красный на синий.
