Стиль карты
Файл стиля состоит из правил, которые применяются к каждому объекту сверху-вниз.
Например стиль:
node[natural=tree] {
icon-image: "tree.svg";
}
отобразит картинку tree.svg
для точек у которых тег natural
имеет значение tree
.
Каждое правило в стиле состоит из двух частей. Фильтра node[natural=tree]
и параметров прорисовки icon-image: "tree.svg";
. Фильтр выбирает к каким объектам надо применить параметры.
Правила могут быть вложенными и устанавливать параметры на каждом из уровней.
|z16- {
icon-scale: 0.50;
icon-tint: @color_icon_tint;
[amenity=bicycle_parking] {
icon-image: "bike_parking.svg";
}
[amenity=bicycle_rental] {
icon-image: "bike_rental.svg";
}
[amenity=bicycle_repair_station] {
icon-image: "bike_service.svg";
}
}
Вложенные правила делают стиль лаконичным, с четко видной структурой. Так общие параметры можно установить заранее и не копировать по нескольку раз.
Эта документация описывает стиль карты, используемый в приложении Guru Maps. Изначально он был похож на MapCSS, но по мере разработки приложения и усложнения стиля было решено добавить в него некоторые уникальные черты. Была добавлена вложенность правил, команды препроцессора для подстановки и условий, добавлены новые функций для вычисляемых операций. В то же время часть параметров прорисовки и функций из спецификации MapCSS не была реализована.
Стиль и иконки, используемые в Guru Maps, вы можете найти в публичном репозитории https://github.com/GuruMaps/MapStyle.
Фильтры
Рассмотрим сложный фильтр:
node,area|z14-[boundary=forest_compartment][ref]
Он состоит из:
- фильтра по типу
node,area
. Он может бытьnode
для точек,line
для линий,area
для полигонов. Если надо указать несколько типов они разделяются запятой. Так же можно использовать*
, если тип не важен. - фильтра масштаба
z14-
. Он указывает для каких масштабов должно срабатывать правило. Может быть только минимальным масштабомz8-
, или интерваломz3-9
. В таком случае правило будет применено для на масштабах с 3-го по 8 включительно. - фильтра параметров
[boundary=forest_compartment][ref]
. Такой фильтр оставит только объекты у которых тегboundary
имеет значениеforest_compartment
, а так же установлено любое значение для тегаref
.Чтобы оставить объекты у которых нет значения тегаref
можно написать[!ref]
.
Несколько фильтров можно перечислить через запятую. Например:
node,area|z14-[boundary=forest_compartment][ref],
node,area|z14-[boundary=forestry_compartment][ref]
Общие параметры можно вынести на отдельный уровень:
node,area|z14-[ref] {
[boundary=forest_compartment],
[boundary=forestry_compartment] {
}
}
Иногда бывает необходимо объединить несколько правил в группу. Она начинается скобкой (
и заканчивается скобкой )
. Группа объединит несколько фильтров и после группы не обязательно начинать блок с правилами.
node,area|z14-[ref](
[boundary=forest_compartment],
[boundary=forestry_compartment]) {
}
}
Препроцессор
Препроцессор подготавливает стиль к парсингу. Подставляет общие значения, включает или выключает какие-то блоки в зависимости от настроек.
Макросы подстановки
@import
Вставляет содержимое указанного файла.
@import "polygons.mapcss";
@{name}
Вставляет значение макроса, во все места где он использован.
// Define color using
@color_ground: #EAE3D3;
// then use it as
canvas {
fill-color: @color_ground;
}
Условия
@if
Проверяет параметр и включает или исключает блок из стиля:
@if Theme == Dark
@import "colors_dark.mapcss";
@else // Default colors
@import "colors.mapcss";
@endif
Guru Maps использует следующие параметры препроцессора:
- Theme {Light, Dark} - текущая тема,
- Style {Default, Outdoor} - текущий стиль карты,
- SubStyle {Car, Hike, Bike}:
- Car используется для навигации на машине,
- Hike и Bike для велосипедного и пешеходного стилей соответственно.
@else
Содержит блок, который надо выполнить если условие ложно.
@elif
Иногда, нужно проверить несколько вариантов условия. Для этого используется блок else if
.
@endif
Закрывает блок текущего условия.
Параметры прорисовки
Параметры управляют отображением объектов на карте. Guru Maps поддерживает следующий набор параметров:
Значения параметров
Толщина
Толщина линий может быть задана в пикселях 1px
, поинтах 2pt
, метрах 3m
или вычислена с помощью выражения eval( zlinear( 13, 1px,1pt,max(2pt, 4m) ) );
. О выражениях, читайте в отдельной секции.
Цвет
Цвет может быть задан следующими форматами: #RGB
, #RRGGBB
, #RRGGBBAA
или константой цвета из списка CSS.
Текст
Текстом считается любая последовательность символов между одиночными или двойными кавычками.
'string'
"another string"
Параметры порядка прорисовки
layer
Номер слоя нужен для разделения разных уровней на карте.
// for any object with tag 'layer', set it's 'layer' property, to the value of 'layer' tag
*|z9-[layer] {
layer: eval(tag(layer));
}
z-index
z-index
устанавливает порядок прорисовки объектов одного типа внутри одного слоя.
area|z10-[natural=wood] {
z-index: -3;
fill-color: @color_wood;
}
area[natural=oceanwater] {
z-index: -2;
fill-color: @color_water;
}
Параметры полигонов
fill-color
Цвет заливки полигона
area|z5-[natural=water] {
fill-color: @color_water;
}
fill-image
Картинка заливки
// fill image of military area desplayed on top of the other objects
area|z11- {
[landuse=military],
[military=danger_area] {
z-index: 2;
fill-image:"forbiddenArea.png";
}
}
fill-image
поддерживает загрузку base64 данных прямо из стиля.
// то же что и arrow.svg
fill-image: eval(data("PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTI2IDNoMTBWMWw1IDMtNSAzVjVIMjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii40Ii8+PC9zdmc+Cg=="))
color
и width
для полигона
Цвет и толщина обводки полигона
area|z15-[building] {
z-index: 3;
width: 1px;
color: @color_landuse_residential_stroke;
}
Параметры линии
color
и width
для линии
Цвет и толщина линии
line|z13-[natural=tree_row] {
width: 3pt;
color: @color_wood;
z-index: -10;
}
casing-color
и casing-width
Цвет и толщина обводки линии
line|z8-[highway=motorway],
line|z11-[highway=motorway_link] {
color: @color_motorway;
casing-color: @color_motorway_casing;
casing-width: 0.5pt;
}
dashes
Указывает длины закрашенных и пустых участков. Сумма цифр должна быть равна степени двойки. Величина цифры - это длинна участка линии в поинтах.
line|z15-[highway=cycleway] {
dashes: 2,2,2,2;
dashes-color: @color_cycleway_dashes;
}
dashes-color
и dashes-width
Цвет и толщина пунктира
line|z15-[highway=steps] {
dashes-color: @color_footway_dashes;
dashes-width: eval( zlinear( 16, 3pt, 4pt ) );
}
linecap
Форма краев линий. Возможные значения: none
, square
, round
.
linejoin
Форма соединения линий. Возможные значения round
, miter
, bevel
, auto
.
Параметры текста
text
Текст, который будет написан рядом с точкой, в центре линии или в центре полигона.
node,area|z2-8[place=country] {
text: eval(locTag('name'));
// other params skipped
}
font-weight
Толщина текста. Возможные значения: bolder
, bold
, normal
, light
, ligther
.
node,area|z9-[place=town],
node,area|z10-[place=village],
node,area|z12-[place=hamlet] {
font-weight:light;
font-size:11;
font-stroke-width:2px;
font-stroke-color: @color_label_stroke;
}
font-size
Размер шрифта.
font-stroke-width
and font-stroke-color
Толщина и цвет обводки текста.
text-color
Цвет текста
node,area|z2-8[place=country] {
text: eval(locTag('name'));
text-color: @color_name_text;
text-priority: 10;
// other tags skipped
}
text-priority
Когда много текста находится рядом, приоритет текста позволяет указать какой текст надо рисовать в первую очередь.
text-allow-overlap
Позволяет разрешить отображение текста с наложением. Несколько надписей одна поверх другой.
text-big-padding
Указывает, что этому тексту надо в 2 раза больше свободного места вокруг. Используется для названий населенных пунктов, чтобы они не заслоняли всю карту.
icon-image
Имя картинки которую надо показать в центре полигона или в точке.
node,area|z17-[amenity=library] {
icon-image: "library.svg";
icon-scale: 0.37;
icon-tint: @color_icon_tint;
}
icon-image
поддерживает загрузку base64 данных прямо из стиля.
// то же что и poi_circle_small.svg
icon-image: eval(data("PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgOCA4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNyA0QzcgNS42NTY4NSA1LjY1Njg1IDcgNCA3QzIuMzQzMTUgNyAxIDUuNjU2ODUgMSA0QzEgMi4zNDMxNSAyLjM0MzE1IDEgNCAxQzUuNjU2ODUgMSA3IDIuMzQzMTUgNyA0WiIgZmlsbD0iIzgwODA4MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTggNEM4IDYuMjA5MTQgNi4yMDkxNCA4IDQgOEMxLjc5MDg2IDggMCA2LjIwOTE0IDAgNEMwIDEuNzkwODYgMS43OTA4NiAwIDQgMEM2LjIwOTE0IDAgOCAxLjc5MDg2IDggNFpNNCA3QzUuNjU2ODUgNyA3IDUuNjU2ODUgNyA0QzcgMi4zNDMxNSA1LjY1Njg1IDEgNCAxQzIuMzQzMTUgMSAxIDIuMzQzMTUgMSA0QzEgNS42NTY4NSAyLjM0MzE1IDcgNCA3WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=="))
icon-scale
Масштаб картинки позволяет сделать картинку больше или меньше ее изначального размера.
icon-tint
Тинт позволяет перекрасить картинку в другой цвет. Цвета картинки меняются следующим образом. #FFF
белый цвет остается белым, #ССС
- станет осветленным tint-color
, #888
- станет идентичным цвету в tint-color
, #444
- затемненный tint-color
и #000
черный останется черным. На всех промежутках цвет будет плавно меняться между указанными цветами.
icon-offset-x
и icon-offset-y
Позволяет сдвинуть картинку относительно точки привязки. По умолчанию центр картинки совпадает с точкой на карте, для которой картинка была показана. icon-offset-y: 0;
позволяет показать пин на карте иголкой в точке, для которой он показан. Используются значения от 0 до 1. Где 0 это низ для icon-offset-y
и левая сторона для icon-offset-x
, а 1 - это верх и правая сторона соответственно.
image-allow-overlap
Разрешает наложение картинок одна на одну.
Параметры описания
details-text
и details-description
используются для установки имени и описания у GeoJSON объектов. Текст установленный в details-text
будет показн как имя, а текст установленный в details-description
будет показан как описание. Если details-text
или details-description
не заполнен, то нажатие по таким объектам не обрабатывается. В этих параметрых можно использовать выражения.
* {
details-text: eval(tag('name'));
details-description: eval(tag('description'));
}
Выражения
Не только фильтры, но и параметры объекта могут зависеть от внешних факторов, вычисляться по формуле или изменяться в зависимости от масштаба.
Если значение параметра должно быть вычислено, оно всегда начинается с функции eval()
.
Внутри выражения могут быть использованы следующие функции:
min
и max
Возвращает минимальное или максимальное значение из параметров. Число параметров не ограничено.
any
Возвращает первое не null
значение из параметров. Число параметров не ограничено.
data
Декодирует base64 строку. Может быть использована с icon-image
и fill-image
.
tag
Возвращает значение тега, указанного в параметре или null
, если значения нет.
locTag
Возвращает локализованное значения тега в зависимости от языковых настроек пользователя. Например если порядок порядок языков английский, русский, язык региона. Для locTag(name)
будут проверены значения тегов name:en
, name:ru
, name
и использованно первое найденное значение. Поддерживаемые языки: be
, cs
, da
, de
, en
, es
, fr
, it
, ja
, ko
, nl
, pl
, ru
, sv
, uk
, zh
. Перечисленные языки могут быть использованы в locTag. Другие языки должны быть написаны явно с помощью tag()
.
cond
Первый параметр содержит логическое выражение, второй будет возвращен, если выражение истинно, третий, если выражение ложно.
// Если уставновлен addr:housenumber,
// присоединим к нему следующее условие
text: eval( cond( tag('addr:housenumber'),
tag('addr:housenumber') . cond( any( locTag('name'), tag('addr:housename') ),
// Если установлен тег name или addr:housename добавим его между скобок
' (' . any( locTag('name'), tag('addr:housename') ) . ')',
// иначе ничего не будем добавлять
''),
// Если addr:housenumber не установлен,
// просто используем name или addr:housename
any( locTag('name'), tag('addr:housename') ) ) );
boolean
Переводит значение в булевый тип. Если нет значения или оно равно 0
, No
, Off
, False
без учета регистра - функция вернет false
. В остальных случаях true
.
zlinear
Плавно меняет значение по мере изменения масштаба. Первый параметр - начальный уровень масштаба. Далее любое число значений для всех масштабов начиная с начального.
line|z13-[highway=residential] {
width: eval( zlinear( 13, 1px, 1pt, max(2pt, 4m) ) );
color: @color_small_road;
linecap: round;
}
В этом примере толщина дороги на 13 зуме 1 пиксель, на 14 зуме 1 поинт, на 15+ будет использована большая из толщин 2 поинта или 4 метра.
metric
Число, переданное в эту функцию, считается в метрах.
line|z12-[highway=tertiary] {
width: eval( zlinear( 12, 1px, 1pt, 1pt, max(3pt, metric(any(tag(lanes),2)*2)) ));
}
В этом примере число полос умножается на 2 - результат умножения считается расстоянием в метрах. max(3pt, metric()) вернет большее значение, ширину в метрах или в поинтах.
Операторы выражений
В выражениях могут быть использованы следующие математические операторы: +
, -
, *
, \
, оператор слияния строк - .
, операторы сравнения <
- меньше,>
- больше, ==
- точное равенство, ~=
- наличие подстроки в строке.