Expresiones MapLibre GL JS
Expresiones Data-Driven Básicas
Operadores de acceso a datos
Son expresiones que acceden a los datos de los elementos (features).
-
get→ obtiene un campo de propiedades. -
properties→ obtiene el objeto completo de propiedades. -
geometry-type→ tipo de geometría del feature. -
id→ obtiene el feature id.
Ejemplo:
"paint": {
"circle-radius": [
"to-number",
["get", "population"]
]
}
Expresiones condicionales o de decisión
Condicional lógico case
Permite evaluar condiciones encadenadas.
Ejemplo:
"circle-opacity": [
"case",
[">", ["get", "population"], 1000], 1,
0.3
]
Significa:
-
Si
population > 1000→ opacidad 1 -
Sino → opacidad 0.3
Clasificación por rangos con step
step — saltos discretos
"circle-radius": [
"step", ["get", "density"],
2, // valor base
50, 4,
150, 6
]
Si density<50 → 2px; <150 → 4px; >150 → 6px.
Crear un mapa donde la contaminación se clasifica en rangos discretos.
paint: {
'circle-radius': 8,
'circle-color': [
'step',
['get','pm10'],
'#2ecc71',
20, '#f1c40f',
40, '#e67e22',
80, '#e74c3c'
]
}
Mapa continuo con interpolate
Produce resultados continuos y suaves mediante la interpolación entre pares de valores de entrada y salida ("paradas")
"circle-radius": [
"interpolate", ["linear"],
["get", "density"],
0, 2,
100, 10
]
Altera el tamaño de 2px a 10px entre density=0 y 100.
Crear un mapa donde el color del punto depende del valor de PM10.
paint: {
'circle-radius': 8,
'circle-color': [
'interpolate',
['linear'],
['get','pm10'],
0, '#2ecc71',
40, '#f1c40f',
80, '#e67e22',
120, '#e74c3c'
]
}
Categorías con match
Mostrar estaciones según su tipo.
paint: {
'circle-radius': 8,
'circle-color': [
'match',
['get','type'],
'traffic', '#e63946',
'urban', '#457b9d',
'background', '#2a9d8f',
'#999999'
]
}
Ejercicio práctico
Example
Añadir también:
'circle-stroke-color': '#ffffff',
'circle-stroke-width': 1
Mapa temático de usos del suelo (categorías)
map.addSource("landuse", {
type: "geojson",
data: "https://gss-mtig.github.io/geo-web-mgeo/data/landuse.geojson",
});
map.addLayer({
id: "landuse-fill",
type: "fill",
source: "landuse",
paint: {
"fill-color": [
"match",
["get", "class"],
"residential",
"#f2c9a1",
"industrial",
"#d1b3ff",
"commercial",
"#a1d99b",
"#cccccc",
],
"fill-opacity": 0.7,
},
});
Ejercicio práctico
Ejercicio práctico
Example
Usar los datos de cities.geojson para hacer una clasificacion de color por categoría
- Usar la expresión
match - Usar la propiedad
category
Normalizar datos
Calcular dinámicamente la tasa con una expresión de MapLibre:
["*", ["/", ["get", "crimes"], ["get", "population"]], 100000]
Ejercicio práctico
Example
Usar los datos de cities.geojson para:
- Crear un mapa de número total de crímenes (
crimes) - Crear un mapa de crímenes por 100000 habitantes (
crime_rate)
Usar coalesce para valores faltantes
Si la propiedad puede estar ausente:
"circle-color": [
"coalesce",
["get", "color"],
"#888888"
]
Esto usa color si existe, sino gris.
Mezcla de zoom y datos
Podemos combinar zoom y datos:
"circle-radius": [
"interpolate", ["linear"], ["zoom"],
5, ["get", "pop"],
15, ["*", 2, ["get", "pop"]]
]
Esto cambia tamaño según zoom y atributo.
Manejo de valores nulos
"circle-color": [
"case",
["==", ["get", "pm10"], null], "#999999",
["interpolate", ["linear"], ["get", "pm10"],
0, "#2c7bb6",
50, "#d7191c"
]
]
Ejercicio práctico
Example
Usar los datos de stations.geojson para:
- Mostrar solo estaciones activas
- Representar contaminación
- Estilo neutro para datos faltantes
Etiquetado (Symbol layer)
map.addLayer({
id: "cities-labels",
type: "symbol",
source: "cities",
layout: {
"text-field": ["get", "name"],
"text-size": 14,
"text-offset": [0, 1.2],
"text-anchor": "top",
},
paint: {
"text-color": "#333",
"text-halo-color": "#ffffff",
"text-halo-width": 2,
},
});
Ejercicio práctico
Tamaño de etiquetas según población
'text-size': [
'interpolate',
['linear'],
['get', 'population'],
0, 10,
500000, 14,
2000000, 22
]
Ejercicio práctico
Example
Usar los datos de cities.geojson para:
- ciudades pequeñas → texto gris
- ciudades grandes → text negro
Etiquetas solo a cierto nivel de zoom
'text-size': [
'interpolate',
['linear'],
['zoom'],
5, 10,
10, 18
]
Ejercicio práctico
Uso de iconos con sprite (icon-image)
Primero se carga el icono:
map.loadImage("icon-station.png", (error, image) => {
if (error) throw error;
map.addImage("station-icon", image);
});
Luego se usa en una symbol layer:
map.addSource("stations", {
type: "geojson",
data: "https://gss-mtig.github.io/geo-web-mgeo/data/stations.geojson",
});
map.addLayer({
id: "stations-icons",
type: "symbol",
source: "stations",
layout: {
"icon-image": "station-icon",
"icon-size": 0.5,
"icon-anchor": "bottom",
},
});
Ejercicio práctico
Iconos diferentes según atributo (data-driven icons)
'icon-image': [
'match',
['get', 'type'],
'train', 'train-icon',
'metro', 'metro-icon',
'bus', 'bus-icon',
'default-icon'
]
Ejercicio práctico
Example
Usar los datos de stations.geojson para:
- Añadir un icono distinto para cada tipo de estación.
Simbolizar estaciones con iconos del sprite
Representar estaciones con iconos diferentes según el tipo de estación.
map.addLayer({
id: "stations-icons",
type: "symbol",
source: "stations",
layout: {
"icon-image": [
"match",
["get", "type"],
"traffic",
"car",
"urban",
"town",
"background",
"tree",
"marker",
],
"icon-size": 0.8,
"icon-allow-overlap": true,
},
});
Ejercicio práctico
Example
Usar los datos de stations.geojson para:
- muestre icono según type
- muestre nombre de estación
- cambie tamaño según
pm10