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:
- Filtro de tipo
node,area: utilizanodepara puntos,linepara líneas yareapara polígonos. Separa varios tipos con comas o utiliza*si el tipo no importa. - Filtro de zoom
z14-: indica los niveles en los que se aplica la regla. Puedes definir solo el mínimo, comoz8-, o un intervalo comoz3-9. En ese caso se aplicará desde el nivel 3 hasta el 8, ambos incluidos. - Filtros de etiquetas
[boundary=forest_compartment][ref]: seleccionan objetos cuya etiquetaboundaryvaleforest_compartmenty que contienen cualquier valor enref. Para seleccionar objetos sin la etiquetaref, 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.