Фильтры в стиле MapLibre GL JS основаны на выражениях, которые вычисляются для каждого объекта слоя и определяют, должен ли этот объект быть отображён или нет. В рамках спецификации стилей ключевое место занимают экзистенциальные (existential) фильтры, позволяющие проверять наличие или отсутствие конкретных свойств в данных источника.
MapLibre GL JS использует фильтрационную систему, совместимую со спецификацией Mapbox Style Specification, где фильтры описываются в виде массивов. Экзистенциальные операторы относятся к базовому набору логики отбора объектов и работают на уровне наличия атрибутов, а не их значений.
Экзистенциальный фильтр отвечает на единственный вопрос: существует ли у объекта заданное поле (property) в его данных.
Векторные тайлы содержат объекты (features), каждый из которых может иметь набор атрибутов. Эти атрибуты не всегда полные: часть данных может отсутствовать в зависимости от источника, типа слоя или этапа обработки.
Экзистенциальные фильтры позволяют:
hasБазовый оператор экзистенциального фильтра — has.
["has", "property_name"]
Фильтр возвращает true, если у объекта присутствует
указанное свойство.
{
"id": "points-with-name",
"type": "circle",
"source": "places",
"filter": ["has", "name"],
"paint": {
"circle-radius": 6,
"circle-color": "#ff6600"
}
}
В данном случае на карте отображаются только те объекты, у которых
присутствует атрибут name.
property_name!hasПротивоположность has — фильтр отсутствия свойства.
["!has", "property_name"]
Фильтр возвращает true, если свойство отсутствует у
объекта или не определено.
{
"id": "unclassified-features",
"type": "circle",
"source": "places",
"filter": ["!has", "category"],
"paint": {
"circle-radius": 4,
"circle-color": "#999999"
}
}
Этот слой визуализирует объекты без категории, позволяя выделять «неразмеченные» данные.
Фильтры в MapLibre GL JS поддерживают композицию через логические операторы:
all (логическое И)any (логическое ИЛИ)none (логическое НЕ)Экзистенциальные проверки часто используются как базовые строительные блоки внутри сложных условий.
[
"all",
["has", "name"],
["!has", "temporary"],
[">=", ["get", "population"], 1000]
]
Здесь объект будет отображён только если:
Экзистенциальные проверки формируют первую ступень отбора, после которой применяются числовые и логические условия.
Экзистенциальные фильтры принципиально отличаются от сравнительных операторов.
| Тип проверки | Пример | Что проверяется |
|---|---|---|
| Экзистенциальная | ["has", "name"] |
существует ли поле |
| Сравнительная | [">", ["get","population"], 1000] |
значение поля |
Ключевой момент: has не анализирует содержимое, только
структуру объекта.
В реальных геоданных часто отсутствуют дополнительные атрибуты.
["has", "height"]
Используется для отображения только объектов с измеренной высотой (например, зданий).
["all",
["has", "name"],
["has", "type"]
]
Позволяет отделить «полноценные» объекты от базовых геометрий без описания.
["!has", "debug"]
Исключает служебные или тестовые объекты.
Экзистенциальные фильтры часто используются в нескольких слоях для создания визуальной иерархии.
// слой с полными данными
["has", "name"]
// слой с неполными данными
["!has", "name"]
Векторные источники MapLibre GL JS могут иметь разную структуру:
Экзистенциальные фильтры применяются на этапе рендеринга и зависят от наличия ключей в текущем feature.
Важно учитывать:
null часто эквивалентно отсутствию["get", ...]) не создают
свойства, а только читают ихgetЭкзистенциальные фильтры часто используются совместно с
get, но между ними есть различие:
has проверяет наличиеget извлекает значение[
"all",
["has", "population"],
[">", ["get", "population"], 5000]
]
Без has выражение может давать неожиданные результаты,
если поле отсутствует, так как get вернёт
undefined или null.
Экзистенциальные фильтры являются одними из самых дешёвых операций в системе фильтрации:
При этом они особенно полезны на больших наборах данных, где предварительная сегментация объектов снижает нагрузку на более сложные выражения.
Несмотря на простоту, поведение has и !has
зависит от источника данных:
Также важно учитывать, что:
0 или "" не равно отсутствию
свойства["has", "population", 1000]
Логическая ошибка: has не принимает значение для
сравнения.
["all",
["has", "name"],
["!has", "name"]
]
Такое выражение всегда возвращает false, так как условия
взаимоисключающие.
["has", "population"]
при фактической необходимости:
[">", ["get", "population"], 0]
Экзистенциальные фильтры часто применяются как первый уровень сегментации данных:
Такая последовательность уменьшает сложность выражений и повышает предсказуемость результата.
[
"all",
["has", "class"],
["in", ["get", "class"], "road", "path", "track"]
]
Здесь экзистенциальная проверка гарантирует, что поле существует до выполнения операции принадлежности к набору значений.
Экзистенциальные фильтры становятся критичными при работе с:
Они позволяют строить устойчивые стили, не зависящие от идеальной структуры входных данных.