Работа с загрузкой файлов в Mapbox GL JS строится вокруг концепции источников данных (sources) и ассетов карты, которые подгружаются в виде сетевых ресурсов или локальных файлов. Архитектура движка предполагает асинхронную загрузку любых внешних данных, что позволяет комбинировать геоданные, растровые изображения, тайлы и пользовательские файлы в едином визуальном слое.
Внутренняя модель данных в Mapbox GL JS основана на источниках,
подключаемых через map.addSource. Каждый источник
определяет способ загрузки и формат данных.
GeoJSON является наиболее часто используемым форматом для загрузки пользовательских файлов:
map.addSource('points', {
type: 'geojson',
data: 'https://example.com/data/points.geojson'
});
Возможны два основных сценария:
fetch('/data/polygons.geojson')
.then(r => r.json())
.then(data => {
map.addSource('polygons', {
type: 'geojson',
data
});
});
GeoJSON-источники поддерживают динамическое обновление без пересоздания слоя:
map.getSource('points').setData(newData);
Для работы с пользовательскими файлами используется стандартный браузерный File API.
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onl oad = (e) => {
const geojson = JSON.parse(e.target.result);
map.addSource('uploaded', {
type: 'geojson',
data: geojson
});
};
reader.readAsText(file);
});
Такой подход позволяет интегрировать локальные данные без серверной обработки.
Интерактивная загрузка файлов часто реализуется через drag-and-drop интерфейс:
const dropZone = document.getElementById('map');
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
const file = e.dataTransfer.files[0];
const reader = new FileReader();
reader.onl oad = (event) => {
const geojson = JSON.parse(event.target.result);
map.addSource('dropped', {
type: 'geojson',
data: geojson
});
};
reader.readAsText(file);
});
dropZone.addEventListener('dragover', (e) => {
e.preventDefault();
});
Такой механизм часто используется в GIS-инструментах для быстрого импорта данных.
Mapbox GL JS поддерживает работу с пользовательскими изображениями, которые можно добавлять как слои.
map.loadImage('/images/icon.png', (error, image) => {
if (error) throw error;
map.addImage('custom-icon', image);
map.addSource('image-source', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [30.5, 50.5]
}
}]
}
});
map.addLayer({
id: 'image-layer',
type: 'symbol',
source: 'image-source',
layout: {
'icon-image': 'custom-icon'
}
});
});
removeImage и addImageЗагрузка файлов в виде тайлов является базовым механизмом отображения больших данных.
map.addSource('vector-source', {
type: 'vector',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.pbf'
],
minzoom: 0,
maxzoom: 14
});
map.addSource('raster-source', {
type: 'raster',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.png'
],
tileSize: 256
});
При работе с динамически сформированными файлами используется
Blob:
const geojsonBlob = new Blob([JSON.stringify(data)], {
type: 'application/json'
});
const url = URL.createObjectURL(geojsonBlob);
map.addSource('blob-source', {
type: 'geojson',
data: url
});
Blob URL позволяет передавать данные как обычный файл без серверной загрузки.
Mapbox GL JS выполняет загрузку файлов через событийную модель:
style.load — стиль загруженsourcedata — источник начал или завершил загрузкуdata — обновление данныхerror — ошибки загрузки ресурсовmap.on('sourcedata', (e) => {
if (e.isSourceLoaded) {
console.log('Источник загружен');
}
});
Эта модель позволяет отслеживать состояние загрузки каждого файла в реальном времени.
Загрузка файлов оптимизируется через внутренний кэш:
map.removeSource('old-source');
Удаление источника освобождает память и GPU ресурсы.
При работе с крупными наборами данных применяются следующие подходы:
Разбиение данных на более мелкие файлы:
map.addSource('chunks', {
type: 'geojson',
data: '/data/chunk-1.geojson'
});
Предварительное сокращение данных до необходимого набора перед загрузкой в карту.
Стиль карты также является загружаемым файлом JSON:
map.setStyle('mapbox://styles/user/style-id');
или локальный стиль:
map.setStyle('/styles/custom-style.json');
Стиль включает:
Загрузка файлов в Mapbox GL JS происходит в несколько этапов:
Каждый этап может быть перехвачен через события карты, что позволяет синхронизировать внешние процессы (например, UI индикаторы или прогресс-бары).