Система стилей в MapLibre GL JS опирается на строго структурированную спецификацию, заимствованную из подхода декларативного описания картографических сцен. Основой служит JSON-описание, которое формально описывается набором типов, определяющих допустимые структуры данных, их взаимосвязи и правила валидации. В TypeScript-обвязке библиотеки эти структуры представлены как набор интерфейсов и объединений (union types), обеспечивающих строгую типизацию при разработке.
Центральным типом является StyleSpecification,
описывающий полный стиль карты.
interface StyleSpecification {
version: number;
name?: string;
metadata?: unknown;
center?: [number, number];
zoom?: number;
bearing?: number;
pitch?: number;
sources: { [key: string]: SourceSpecification };
sprite?: string;
glyphs?: string;
layers: LayerSpecification[];
light?: LightSpecification;
}
version
sources
layers
sprite и glyphs
Источники данных описываются через объединение различных типов
SourceSpecification.
type SourceSpecification =
| VectorSourceSpecification
| RasterSourceSpecification
| GeoJSONSourceSpecification
| ImageSourceSpecification
| VideoSourceSpecification;
interface VectorSourceSpecification {
type: "vector";
url?: string;
tiles?: string[];
minzoom?: number;
maxzoom?: number;
}
Используются для тайловых наборов векторных данных.
Особенности:
interface GeoJSONSourceSpecification {
type: "geojson";
dat a: GeoJSON.FeatureCollection | string;
buffer?: number;
tolerance?: number;
}
Используются для динамических или локальных данных.
interface RasterSourceSpecification {
type: "raster";
tiles: string[];
tileSize?: number;
}
Подходят для тайлов изображений (например, спутниковые снимки).
Слои представляют ключевой механизм визуализации. Каждый слой
описывается через LayerSpecification.
type LayerSpecification =
| BackgroundLayerSpecification
| FillLayerSpecification
| LineLayerSpecification
| SymbolLayerSpecification
| RasterLayerSpecification
| CircleLayerSpecification
| HeatmapLayerSpecification
| FillExtrusionLayerSpecification;
interface BaseLayerSpecification {
id: string;
type: string;
source?: string;
minzoom?: number;
maxzoom?: number;
filter?: ExpressionSpecification;
layout?: unknown;
paint?: unknown;
}
interface FillLayerSpecification extends BaseLayerSpecification {
type: "fill";
paint?: {
"fill-color"?: string | ExpressionSpecification;
"fill-opacity"?: number;
};
}
Используется для полигонов.
interface LineLayerSpecification extends BaseLayerSpecification {
type: "line";
paint?: {
"line-color"?: string | ExpressionSpecification;
"line-width"?: number | ExpressionSpecification;
};
}
Применяется для линейных объектов: дорог, границ, маршрутов.
interface SymbolLayerSpecification extends BaseLayerSpecification {
type: "symbol";
layout?: {
"text-field"?: string | ExpressionSpecification;
"icon-image"?: string | ExpressionSpecification;
};
}
Отвечает за текст и иконки.
Одним из наиболее сложных элементов системы стилей является система выражений. Она позволяет задавать динамическое поведение свойств.
type ExpressionSpecification =
| ["get", string]
| ["interpolate", ...any[]]
| ["case", ...any[]]
| ["match", ...any[]]
| ["+", any, any]
| ["-", any, any]
| ["*", any, any]
| ["/", any, any];
[
"interpolate",
["linear"],
["zoom"],
5,
1,
10,
2
]
Данный тип выражения используется для плавного изменения значений при масштабировании.
Каждый слой делится на две категории свойств:
Определяет структуру отображения:
Определяет внешний вид:
interface LightSpecification {
anchor: "map" | "viewport";
color?: string;
intensity?: number;
}
Используется для 3D-эффектов и освещения экструзий.
Система типов в MapLibre GL JS активно использует discriminated
unions. Поле type выступает дискриминатором.
type LayerSpecification =
| { type: "fill"; ... }
| { type: "line"; ... }
| { type: "symbol"; ... };
Такой подход позволяет TypeScript:
Типы выполняют роль контрактов между JSON-стилем и рендерером.
Основные проверки:
id, type)Система типов напрямую отражает структуру спецификации стилей, известной как Mapbox Style Specification, на которой базируется MapLibre GL JS.
Каждое поле JSON-стиля соответствует строго определённому TypeScript-типу, что позволяет:
Типы не являются статичными. Возможны расширения:
interface CustomLayerSpecification extends BaseLayerSpecification {
type: "custom";
render: (context: unknown) => void;
}
Расширение SourceSpecification позволяет подключать
новые типы данных без изменения ядра рендера.
Типовая система разделена на несколько уровней:
Такое разделение позволяет поддерживать масштабируемость архитектуры и независимость компонентов.