Стилизация слоёв в Mapbox GL JS может опираться не только на фиксированные значения, но и на свойства геообъектов, поступающих из источника данных. Такой подход позволяет связывать визуальное представление карты с содержимым данных, превращая стиль в динамическую систему правил.
Каждый объект, загруженный в слой geojson,
vector tile source или другой источник, может содержать
набор свойств. Эти свойства становятся доступными внутри выражений через
оператор получения значения:
["get", "property_name"]
Пример использования в цвете заливки:
paint: {
"fill-color": ["get", "color"]
}
В этом случае значение свойства color каждого объекта
напрямую определяет цвет полигона.
Если свойство отсутствует, результат выражения становится
null, и применяется значение по умолчанию или
fallback-логика через case.
Конструкция match используется для сопоставления
значения свойства с набором вариантов. Это аналог switch-case в
классических языках программирования.
paint: {
"circle-color": [
"match",
["get", "type"],
"park", "#2ecc71",
"water", "#3498db",
"industrial", "#95a5a6",
"#cccccc"
]
}
Логика выражения:
typeТакой подход часто применяется для тематических карт, где категории объектов определяют визуальный стиль.
Для числовых свойств используется ступенчатая функция
step. Она позволяет разбивать значения на интервалы.
paint: {
"circle-radius": [
"step",
["get", "population"],
5,
1000, 8,
10000, 12,
50000, 20
]
}
Интерпретация:
population >= 1000 радиус становится 8>= 10000 — 12>= 50000 — 20Такая схема широко применяется для масштабирования символов по величине показателя.
В отличие от step, interpolate создаёт
непрерывное изменение значений. Это особенно важно для визуально гладких
переходов.
paint: {
"circle-radius": [
"interpolate",
["linear"],
["get", "population"],
0, 2,
1000, 6,
10000, 18,
50000, 40
]
}
Здесь радиус изменяется плавно в зависимости от значения
population, без резких скачков.
Часто используется вместе с масштабом карты:
paint: {
"line-width": [
"interpolate",
["linear"],
["zoom"],
5, 1,
10, 3,
15, 8
]
}
Для сложной логики применяется case, позволяющий
задавать последовательные условия.
paint: {
"fill-color": [
"case",
["==", ["get", "status"], "active"], "#2ecc71",
["==", ["get", "status"], "inactive"], "#e74c3c",
["==", ["get", "status"], "pending"], "#f1c40f",
"#bdc3c7"
]
}
Каждое условие проверяется последовательно, и возвращается первое истинное значение.
Стилизация часто опирается не на одно поле, а на комбинацию нескольких свойств через логические операторы.
paint: {
"circle-color": [
"case",
["all",
["==", ["get", "type"], "restaurant"],
[">", ["get", "rating"], 4]
],
"#e67e22",
"#95a5a6"
]
}
В данном случае цвет зависит одновременно от типа объекта и рейтинга.
Операторы логики:
all — все условия истинныany — хотя бы одно условие истинно! — отрицаниеСвойства объектов часто управляют не только цветом, но и геометрическими параметрами.
layout: {},
paint: {
"line-width": ["get", "stroke_width"]
}
или с масштабированием:
paint: {
"line-width": [
"interpolate",
["linear"],
["get", "importance"],
1, 1,
10, 10
]
}
Такой подход позволяет визуально отражать значимость объектов.
Свойства объектов могут быть строками, числами или булевыми значениями. В выражениях важно учитывать тип данных.
Строковые значения:
["get", "category"]
Числовые значения:
["to-number", ["get", "value"]]
Приведение типов необходимо при работе с внешними источниками данных, где формат может быть неоднородным.
При отсутствии свойства применяется оператор coalesce,
позволяющий задать цепочку значений по приоритету.
paint: {
"text-color": [
"coalesce",
["get", "text_color"],
"#333333"
]
}
Если text_color отсутствует, используется значение по
умолчанию.
GeoJSON допускает вложенные объекты, доступ к которым осуществляется
последовательным использованием get.
["get", "properties"]
или
["get", "address", ["get", "metadata"]]
Такая конструкция позволяет извлекать данные из сложных структур, но требует аккуратности при проектировании источника данных.
Связка свойств объектов и масштабов карты позволяет создавать адаптивные визуализации:
paint: {
"circle-radius": [
"interpolate",
["linear"],
["zoom"],
3, ["*", ["get", "weight"], 0.5],
10, ["*", ["get", "weight"], 2]
]
}
Здесь визуальный размер зависит одновременно от масштаба и значения
свойства weight.
Эффективность стилизации напрямую зависит от структуры данных:
Оптимальная структура позволяет выражениям оставаться простыми и предсказуемыми.
Использование свойств объектов связано с рядом ограничений:
nullcase усложняют поддержкуПоэтому логика стилизации должна балансировать между гибкостью и простотой выражений.