TileLayer является одним из базовых классов Leaflet и
отвечает за отображение тайловых слоёв карты. Тайловый слой представляет
собой набор изображений фиксированного размера, которые загружаются с
сервера по координатам {x, y, z} (где z —
уровень масштабирования, x и y — координаты
тайла).
В Leaflet данный класс реализован как L.TileLayer и чаще
всего создаётся через фабричную функцию L.tileLayer.
Базовая форма создания тайлового слоя:
L.tileLayer(urlTemplate, options)
URL содержит плейсхолдеры:
{z} — уровень масштаба{x} — координата тайла по оси X{y} — координата тайла по оси Y{s} — поддомены (если используются)Пример:
const layer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
subdomains: 'abc',
maxZoom: 19
});
minZoom и
maxZoomОграничивают диапазон масштабирования, при котором слой активен.
L.tileLayer(url, {
minZoom: 0,
maxZoom: 18
});
tileSizeРазмер тайла в пикселях. Стандартное значение — 256.
tileSize: 256
При нестандартных серверах возможно использование 512:
tileSize: 512
opacityУстанавливает прозрачность слоя.
opacity: 0.7
Используется для наложения нескольких слоёв.
attributionТекст атрибуции источника данных карты.
attribution: '© OpenStreetMap contributors'
subdomainsПозволяет распределить загрузку тайлов между несколькими поддоменами.
subdomains: 'abc'
или массив:
subdomains: ['a', 'b', 'c']
errorTileUrlURL изображения, которое подставляется при ошибке загрузки тайла.
errorTileUrl: '/images/tile-error.png'
zoomOffsetСмещение уровня масштабирования для серверов с нестандартной нумерацией тайлов.
zoomOffset: 1
tmsИспользуется при TMS-схеме тайлинга, где ось Y инвертирована.
tms: true
detectRetinaАвтоматически загружает тайлы высокого разрешения для Retina-экранов.
detectRetina: true
crossOriginНастройка CORS для загрузки изображений.
crossOrigin: true
или
crossOrigin: 'anonymous'
Слой подключается к карте через метод addTo:
const map = L.map('map');
const tiles = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19
});
tiles.addTo(map);
Эквивалентная запись:
L.tileLayer(url, options).addTo(map);
map.removeLayer(tiles);
или:
tiles.remove();
Позволяет динамически переключать источник тайлов.
tiles.setUrl('https://{s}.tile.example.com/{z}/{x}/{y}.png');
tiles.setOpacity(0.5);
Определяет порядок наложения слоёв.
tiles.setZIndex(1000);
tiles.bringToFront();
tiles.bringToBack();
TileLayer реализует ленивую загрузку: тайлы
запрашиваются только при необходимости в текущей области видимости
карты.
Механизм включает:
TileLayerloadingСрабатывает при начале загрузки тайлов.
tiles.on('loading', () => {
console.log('началась загрузка тайлов');
});
loadСрабатывает, когда все тайлы текущего вида загружены.
tiles.on('load', () => {
console.log('все тайлы загружены');
});
tileloadСрабатывает при загрузке отдельного тайла.
tiles.on('tileload', (event) => {
console.log(event.tile.src);
});
tileerrorВозникает при ошибке загрузки тайла.
tiles.on('tileerror', (event) => {
console.log('ошибка тайла', event.coords);
});
Каждый тайл представляет собой DOM-элемент <img>,
который:
Координаты тайла рассчитываются по формуле привязки к Web Mercator проекции.
При включённой опции detectRetina происходит:
TileLayer использует встроенный кэш DOM:
Оптимизация включает:
Хотя Leaflet по умолчанию использует Web Mercator,
TileLayer может адаптироваться через:
tms: true — инверсия оси YzoomOffsetconst highResTiles = L.tileLayer('https://tiles.server.com/{z}/{x}/{y}.png', {
tileSize: 512,
zoomOffset: -1,
detectRetina: true,
maxZoom: 20,
attribution: 'Map data source'
});
const base = L.tileLayer(url1, { maxZoom: 18 });
const labels = L.tileLayer(url2, { maxZoom: 18, opacity: 0.8 });
base.addTo(map);
labels.addTo(map);
Слои накладываются в порядке добавления или через
zIndex.
function switchLayer(type) {
tiles.setUrl(
type === 'satellite'
? 'https://sat.tiles/{z}/{x}/{y}.jpg'
: 'https://map.tiles/{z}/{x}/{y}.png'
);
}
tileSize вызывает смещение картыTileLayer создаёт собственный DOM-контейнер внутри
панели карты:
<img> элементы тайловПри zoom:
Комбинация нескольких слоёв часто опирается на
opacity:
base.setOpacity(1.0);
overlay.setOpacity(0.4);
Это позволяет формировать гибридные визуализации (карта + спутник + подписи).