В системе MapLibre GL JS источники данных являются фундаментальным слоем архитектуры стиля. Именно они определяют, откуда и в каком виде поступает географическая информация, которая затем визуализируется слоями (layers). Типизация источников строго определяет структуру данных, допустимые параметры и поведение при рендеринге.
В спецификации стилей MapLibre GL JS все источники описываются через
объединённый тип SourceSpecification, который представляет
собой дискриминированное объединение нескольких конкретных типов.
Ключевым полем выступает type, определяющее формат данных и
набор поддерживаемых опций.
Каждый источник в MapLibre GL JS определяется объектом следующего общего вида:
{
id: "unique-source-id",
type: "vector | raster | geojson | image | video | raster-dem",
...options
}
В TypeScript-терминах это соответствует:
type SourceSpecification =
| VectorSourceSpecification
| RasterSourceSpecification
| GeoJSONSourceSpecification
| ImageSourceSpecification
| VideoSourceSpecification
| RasterDemSourceSpecification;
Общее поле type является дискриминатором объединения и
определяет, какой именно набор свойств будет допустим.
Векторные источники являются наиболее гибким и производительным способом работы с геоданными. Они основаны на тайлах Mapbox Vector Tiles (MVT) и позволяют хранить геометрию в компактном бинарном формате.
type VectorSourceSpecification = {
type: "vector";
url?: string;
tiles?: string[];
bounds?: number[];
minzoom?: number;
maxzoom?: number;
scheme?: "xyz" | "tms";
};
[west, south, east, north].xyz
используется по умолчанию).Векторные источники не содержат финальной визуализации. Они
предоставляют геометрию и свойства объектов, а отображение определяется
стилями слоёв (fill, line,
circle, symbol).
Растровые источники представляют собой набор изображений, разбитых на тайлы. Используются для базовых карт, спутниковых снимков, аэрофотосъёмки.
type RasterSourceSpecification = {
type: "raster";
url?: string;
tiles?: string[];
tileSize?: number;
bounds?: number[];
minzoom?: number;
maxzoom?: number;
scheme?: "xyz" | "tms";
};
Растровые источники не поддерживают семантические данные. Каждый тайл — это готовое изображение, которое просто накладывается на карту без возможности фильтрации объектов внутри него.
GeoJSON является одним из наиболее популярных форматов для
динамических данных. MapLibre GL JS поддерживает его напрямую через
источник типа geojson.
type GeoJSONSourceSpecification = {
type: "geojson";
dat a: string | GeoJSON.FeatureCollection | GeoJSON.Feature;
maxzoom?: number;
buffer?: number;
tolerance?: number;
cluster?: boolean;
clusterRadius?: number;
clusterMaxZoom?: number;
};
При включённой кластеризации GeoJSON источник группирует точки на стороне клиента:
{
type: "geojson",
data: points,
cluster: true,
clusterRadius: 40,
clusterMaxZoom: 14
}
Кластеры становятся отдельными объектами с собственными свойствами:
point_countcluster_idImageSource используется для наложения одиночного изображения на географическую область.
type ImageSourceSpecification = {
type: "image";
url: string;
coordinates: number[][];
};
Поле coordinates представляет собой массив из четырёх
углов изображения:
coordinates: [
[-77.0369, 38.9072],
[-77.0090, 38.9072],
[-77.0090, 38.8895],
[-77.0369, 38.8895]
]
Порядок фиксирован и соответствует углам изображения по часовой стрелке.
Изображение растягивается и трансформируется в соответствии с указанными координатами, позволяя накладывать карты, схемы или локальные визуализации.
VideoSource позволяет отображать видеопоток как геопривязанный слой.
type VideoSourceSpecification = {
type: "video";
urls: string[];
coordinates: number[][];
};
Видео синхронизируется с картой и масштабируется в зависимости от текущего viewport. Используется для динамических наблюдений, временных данных и симуляций.
Raster DEM источники применяются для работы с высотами и 3D-террейном.
type RasterDemSourceSpecification = {
type: "raster-dem";
url?: string;
tiles?: string[];
encoding?: "terrarium" | "mapbox";
tileSize?: number;
bounds?: number[];
minzoom?: number;
maxzoom?: number;
};
Raster DEM источники используются вместе с:
terrain конфигурацией картыMapLibre GL JS предоставляет runtime API для управления источниками:
map.addSource("cities", {
type: "geojson",
data: "/data/cities.geojson"
});
Получение источника:
const source = map.getSource("cities");
Удаление:
map.removeSource("cities");
После добавления в карту источники становятся экземплярами классов, а не только конфигурационными объектами.
Обобщённый тип:
type Source =
| GeoJSONSource
| VectorTileSource
| RasterTileSource
| ImageSource
| VideoSource
| RasterDEMTileSource;
Каждый тип имеет собственный набор методов.
interface GeoJSONSource {
setData(data: GeoJSON.FeatureCollection | GeoJSON.Feature): void;
}
Используется для динамического обновления данных без пересоздания источника.
Тип источника влияет на стратегию загрузки данных:
Источник не существует изолированно. Его тип определяет совместимость с типами слоёв:
vector → fill, line, circle, symbol,
fill-extrusionraster → rastergeojson → любой векторный слой (после тайлизации)image → raster-like overlayvideo → raster-like animated overlayraster-dem → terrain, hillshadeТипизация источников в MapLibre GL JS отражает WebGL-ориентированную архитектуру:
Это приводит к строгому разделению:
| Тип источника | Данные | Формат хранения | Динамическое обновление |
|---|---|---|---|
| vector | геометрия + атрибуты | MVT | ограничено |
| raster | изображения | PNG/JPEG tiles | нет |
| geojson | JSON геометрия | объект или URL | да |
| image | одиночное изображение | bitmap | замена координат |
| video | видеопоток | media stream | замена источника |
| raster-dem | высоты | encoded RGB | частично |
Тип источника напрямую влияет на доступные выражения (expressions) в слоях:
Векторные источники поддерживают фильтрацию по атрибутам:
["==", ["get", "type"], "city"]Raster источники не поддерживают feature-state.
GeoJSON позволяет использовать feature-state и runtime mutation.
DEM источники используются только через terrain API.
При использовании TypeScript ключевым моментом является дискриминация
по полю type:
function isVectorSource(
source: SourceSpecification
): source is VectorSourceSpecification {
return source.type === "vector";
}
Это позволяет безопасно работать с конкретными типами источников без приведения типов вручную.
Некорректная конфигурация источника приводит к следующим классам ошибок:
typeurl и tilesMapLibre GL JS выполняет частичную валидацию на этапе добавления источника и продолжает асинхронную проверку при загрузке тайлов.
Архитектура допускает появление новых типов источников через расширение спецификации. Однако на уровне runtime система опирается на фиксированный набор типов, определяющих: