Saltar al contenido principal

Estilo del mapa

Un archivo de estilo MapCSS contiene reglas que se aplican a cada objeto de arriba abajo.

Por ejemplo, este estilo:

node[natural=tree] {
icon-image: "tree.svg";
}

muestra la imagen tree.svg en los puntos cuya etiqueta natural tenga el valor tree.

Cada regla tiene dos partes: el filtro node[natural=tree] y los parámetros de dibujo icon-image: tree.svg;. El filtro determina a qué objetos se aplican los parámetros.

Las reglas se pueden anidar y definir parámetros en cada nivel.

|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";
}
}

Las reglas anidadas mantienen el estilo conciso y ordenado: los parámetros comunes se definen una sola vez y no se repiten en varios bloques.

Esta documentación describe el dialecto de MapCSS utilizado por Guru Maps. Algunos parámetros del lenguaje original no están implementados, pero se admiten macros de preprocesamiento, reglas anidadas y nuevas funciones para operaciones calculadas. El estilo de Guru Maps está disponible en su repositorio.

Filtros

Veamos un filtro complejo:

node,area|z14-[boundary=forest_compartment][ref]

Se compone de:

  1. Filtro de tipo node,area: utiliza node para puntos, line para líneas y area para polígonos. Separa varios tipos con comas o utiliza * si el tipo no importa.
  2. Filtro de zoom z14-: indica los niveles en los que se aplica la regla. Puedes definir solo el mínimo, como z8-, o un intervalo como z3-9. En ese caso se aplicará desde el nivel 3 hasta el 8, ambos incluidos.
  3. Filtros de etiquetas [boundary=forest_compartment][ref]: seleccionan objetos cuya etiqueta boundary vale forest_compartment y que contienen cualquier valor en ref. Para seleccionar objetos sin la etiqueta ref, utiliza [!ref].

Se pueden separar varios filtros mediante comas:

node,area|z14-[boundary=forest_compartment][ref],
node,area|z14-[boundary=forestry_compartment][ref]

En este ejemplo, los parámetros comunes se pueden mover a un nivel superior:

node,area|z14-[ref] {
[boundary=forest_compartment],
[boundary=forestry_compartment] {

}
}

Para reunir varias reglas en un grupo, encierra los filtros entre paréntesis sin abrir todavía un bloque de reglas:

node,area|z14-[ref](
[boundary=forest_compartment],
[boundary=forestry_compartment]) {
}
}

Macros de preprocesamiento

El preprocesador prepara el estilo para su análisis: sustituye valores y activa o desactiva bloques según los ajustes.

Macros de sustitución

@import

Inserta el contenido del archivo indicado:

@import "polygons.mapcss";

@{name}

Inserta el valor de una macro donde se utilice:

// Define color using
@color_ground: #EAE3D3;

// then use it as
canvas
{
fill-color: @color_ground;
}

Condiciones

@if

Comprueba un parámetro e incluye o excluye un bloque del estilo:

@if Theme == Dark
@import "colors_dark.mapcss";
@else // Default colors
@import "colors.mapcss";
@endif

Guru Maps utiliza estos parámetros de preprocesamiento:

  • Theme {Light, Dark}: tema actual de la aplicación;
  • Style {Default, Outdoor}: estilo de mapa actual;
  • SubStyle {Car, Hike, Bike}:
    • Car para conducir;
    • Hike para senderismo;
    • Bike para bicicleta.

@else

Define el bloque que se ejecuta cuando la primera condición es falsa.

@elif

Contiene una condición que se evalúa si las anteriores no se han cumplido.

@endif

Cierra el bloque de la condición actual.

Parámetros de dibujo

Estos parámetros controlan cómo se dibujan los objetos en el mapa.

Valores de los parámetros

Anchura

El grosor de una línea, width, puede expresarse en píxeles 1px, puntos 2pt, metros 3m o mediante una expresión como eval( zlinear( 13, 1px,1pt,max(2pt, 4m)) );. Consulta la sección Expresiones.

Color

Utiliza #RGB, #RRGGBB, #RRGGBBAA o un nombre de la lista de colores CSS.

Texto

Cualquier secuencia entre comillas simples o dobles se considera texto.

'string'
"another string"

Orden de dibujo

layer

El número de capa separa los distintos niveles del mapa.

// for any object with tag 'layer', set its 'layer' property to the value of the tag
*|z9-[layer] {
layer: eval(tag(layer));
}

z-index

z-index establece el orden de dibujo de los objetos del mismo tipo dentro de una capa.

area|z10-[natural=wood] {
z-index: -3;
fill-color: @color_wood;
}

area[natural=oceanwater] {
z-index: -2;
fill-color: @color_water;
}

Parámetros de polígonos

fill-color

Color de relleno del polígono.

area|z5-[natural=water] {
fill-color: @color_water;
}

fill-image

Imagen de relleno del polígono.

// fill image of a military area displayed on top of other objects
area|z11- {
[landuse=military],
[military=danger_area] {
z-index: 2;
fill-image:"forbiddenArea.png";
}
}

fill-image admite estilos incrustados con datos base64.

// same as arrow.svg
fill-image: eval(data("PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTI2IDNoMTBWMWw1IDMtNSAzVjVIMjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii40Ii8+PC9zdmc+Cg=="))

color y width para polígonos

Color y anchura del borde.

area|z15-[building] {
z-index: 3;
width: 1px;
color: @color_landuse_residential_stroke;
}

Parámetros de líneas

color y width para líneas

Color y anchura de la línea.

line|z13-[natural=tree_row] {
width: 3pt;
color: @color_wood;
z-index: -10;
}

casing-color y casing-width

Color y anchura del contorno de una línea, utilizados principalmente para carreteras.

line|z8-[highway=motorway],
line|z11-[highway=motorway_link] {
color: @color_motorway;
casing-color: @color_motorway_casing;
casing-width: 0.5pt;
}

dashes

Longitudes de los segmentos pintados y vacíos. La suma debe ser una potencia de 2 —4, 8, 16, 32, 64, etc.— y cada número representa la longitud en puntos.

line|z15-[highway=cycleway] {
dashes: 2,2,2,2;
dashes-color: @color_cycleway_dashes;
}

dashes-color y dashes-width

Color y anchura de los trazos usados para senderos, caminos, escaleras y límites.

line|z15-[highway=steps] {
dashes-color: @color_footway_dashes;
dashes-width: eval( zlinear( 16, 3pt, 4pt ) );
}

linecap

Forma de los extremos de la línea. Valores posibles: none, square, round.

linejoin

Forma de las uniones. Valores posibles: round, miter, bevel, auto.

Parámetros de texto

text

Texto que se dibuja junto a un punto o centrado sobre una línea o un polígono.

node,area|z2-8[place=country] {
text: eval(locTag('name'));
// other params skipped
}

font-weight

Peso de la fuente. Valores posibles: bolder, bold, normal, light, lighter.

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

Tamaño de la fuente.

font-stroke-width y font-stroke-color

Anchura y color del contorno de la fuente.

text-color

Color del texto.

node,area|z2-8[place=country] {
text: eval(locTag('name'));
text-color: @color_name_text;
text-priority: 10;
// other tags skipped
}

text-priority

Cuando varias etiquetas compiten por el mismo espacio, determina cuál se muestra primero.

text-allow-overlap

Permite que las etiquetas se superpongan.

text-big-padding

Reserva el doble de espacio alrededor del texto. Úsalo para núcleos importantes —ciudades, pueblos, barrios, etc.— y evita que las etiquetas oculten el mapa.

icon-image

Nombre de la imagen que se muestra en un punto o en el centro de un polígono.

node,area|z17-[amenity=library] {
icon-image: "library.svg";
icon-scale: 0.37;
icon-tint: @color_icon_tint;
}

icon-image admite estilos incrustados con datos base64.

// same as poi_circle_small.svg
icon-image: eval(data("PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgOCA4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNyA0QzcgNS42NTY4NSA1LjY1Njg1IDcgNCA3QzIuMzQzMTUgNyAxIDUuNjU2ODUgMSA0QzEgMi4zNDMxNSAyLjM0MzE1IDEgNCAxQzUuNjU2ODUgMSA3IDIuMzQzMTUgNyA0WiIgZmlsbD0iIzgwODA4MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTggNEM4IDYuMjA5MTQgNi4yMDkxNCA4IDQgOEMxLjc5MDg2IDggMCA2LjIwOTE0IDAgNEMwIDEuNzkwODYgMS43OTA4NiAwIDQgMEM2LjIwOTE0IDAgOCAxLjc5MDg2IDggNFpNNCA3QzUuNjU2ODUgNyA3IDUuNjU2ODUgNyA0QzcgMi4zNDMxNSA1LjY1Njg1IDEgNCAxQzIuMzQzMTUgMSAxIDIuMzQzMTUgMSA0QzEgNS42NTY4NSAyLjM0MzE1IDcgNCA3WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=="))

icon-scale

Cambia la escala de la imagen para mostrarla más grande o más pequeña que su tamaño original.

icon-tint

icon-tint vuelve a colorear una imagen. #FFF permanece blanco; #CCC se convierte en una versión clara del color elegido; #888 coincide con ese color; #444 adopta una versión más oscura; y #000 permanece negro. Los colores se mezclan suavemente entre esos puntos.

icon-offset-x y icon-offset-y

Desplazan la imagen respecto a su punto de anclaje. De forma predeterminada, queda centrada sobre el punto del mapa. Por ejemplo, icon-offset-y: 0; alinea la parte inferior de un icono de alfiler con el punto de destino. Los valores van de 0 a 1: 0 representa el borde inferior o izquierdo y 1, el superior o derecho.

image-allow-overlap

Permite que los iconos se superpongan.

Parámetros de detalles

Utiliza details-text y details-description para definir el nombre y la descripción de los objetos GeoJSON. details-text aparece como título y details-description, como descripción. Si ambos están vacíos, se ignoran los toques sobre el objeto. Estos parámetros admiten expresiones.

* {
details-text: eval(tag('name'));
details-description: eval(tag('description'));
}

Expresiones

Los filtros y parámetros de dibujo pueden depender de factores externos, calcularse mediante fórmulas o variar según el nivel de zoom.

Los valores calculados siempre deben comenzar con eval().

Dentro se pueden utilizar estas funciones:

min y max

Devuelven el valor mínimo o máximo de sus parámetros. No hay límite en el número de parámetros.

any

Devuelve el primer valor que no sea null. Admite cualquier número de argumentos.

data

Decodifica una cadena base64. Se puede utilizar en icon-image y fill-image.

tag

Devuelve el valor de la etiqueta indicada o null si no existe.

locTag

Devuelve el valor localizado de una etiqueta según los idiomas preferidos del usuario. Por ejemplo, si la lista contiene inglés, ruso y el idioma local, locTag('name') comprueba name:en, después name:ru y por último name, y utiliza la primera coincidencia. Guru Maps admite be, cs, da, de, en, es, fr, it, ja, ko, nl, pl, ru, sv, uk y zh. Utiliza locTag() para esos idiomas y llama explícitamente a tag() para los demás.

cond

Evalúa una expresión lógica. Si el primer argumento es verdadero, devuelve el segundo; de lo contrario, devuelve el tercero.

// check addr:housenumber
text: eval( cond( tag('addr:housenumber'),
// if there is addr:housenumber, then concatenate next condition
tag('addr:housenumber') . cond( any( locTag('name'), tag('addr:housename') ),
// if there is name or addr:housename - put them between ()
' (' . any( locTag('name'), tag('addr:housename') ) . ')',
// empty line otherwise
''),
// if there is no housenumber just use any from name or addr:housename
any( locTag('name'), tag('addr:housename') ) ) );

boolean

Convierte el valor en booleano. Si falta o equivale a 0, No, Off o False, sin distinguir mayúsculas, devuelve false; en cualquier otro caso devuelve true.

zlinear

Cambia el valor suavemente según el zoom. El primer parámetro es el nivel inicial y a continuación se indican los valores de cada nivel posterior.

line|z13-[highway=residential] {
width: eval( zlinear( 13, 1px, 1pt, max(2pt, 4m) ) );
color: @color_small_road;
linecap: round;
}

En el ejemplo, la carretera mide 1 píxel en el nivel 13, 1 punto en el 14 y, desde el nivel 15, el mayor valor entre 2 puntos y 4 metros.

metric

Convierte el parámetro numérico a metros.

line|z12-[highway=tertiary] {
width: eval( zlinear( 12, 1px, 1pt, 1pt, max(3pt, metric(any(tag(lanes),2)*2)) ));
}

Aquí, el número de carriles se multiplica por 2 para obtener una distancia en metros. max(3pt, metric()) devuelve la mayor de las dos anchuras.

Operadores de expresiones

Las expresiones admiten los operadores matemáticos +, -, *, /, el operador . para concatenar cadenas y los operadores de comparación <, >, == y ~= para buscar subcadenas.