В основе большинства веб-карт лежит тайловая система отображения данных. Вместо загрузки одной огромной карты браузер получает множество небольших изображений — тайлов. Каждый тайл представляет собой квадратное изображение определённого участка местности на конкретном уровне масштабирования.
Провайдером тайлов (Tile Provider) называется сервис, предоставляющий такие изображения по URL-шаблону. Leaflet не содержит собственных картографических данных и не поставляет тайлы. Библиотека отвечает только за отображение карты, а сами изображения загружаются со сторонних серверов.
Типичный адрес тайла выглядит следующим образом:
https://tile-server.com/{z}/{x}/{y}.png
Где:
{z} — уровень масштабирования (zoom);{x} — координата тайла по горизонтали;{y} — координата тайла по вертикали.Во время работы карты Leaflet автоматически подставляет необходимые значения и загружает нужные изображения.
Для работы с провайдерами используется класс L.TileLayer
или сокращённый метод L.tileLayer().
Простейший пример:
const map = L.map('map').setView([55.751244, 37.618423], 10);
L.tileLayer('https://tile-server.com/{z}/{x}/{y}.png', {
maxZoom: 19
}).addTo(map);
После добавления слоя Leaflet начинает запрашивать тайлы в соответствии с текущим положением карты.
Наиболее распространённым источником тайлов является проект OpenStreetMap.
Пример подключения:
const map = L.map('map').setView([55.751244, 37.618423], 10);
L.tileLayer(
'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
{
attribution: '© OpenStreetMap contributors'
}
).addTo(map);
Параметр attribution крайне важен. Большинство
поставщиков карт требуют отображения информации об авторстве данных.
Результат отображается автоматически в правом нижнем углу карты.
Практически все провайдеры устанавливают требования по указанию источника данных.
Пример:
L.tileLayer(url, {
attribution: '© OpenStreetMap contributors'
});
Сложная атрибуция может включать несколько источников:
attribution:
'© OpenStreetMap contributors | Imagery © Esri'
Игнорирование требований лицензии может привести к нарушению условий использования сервиса.
Определяет максимальный уровень масштабирования.
L.tileLayer(url, {
maxZoom: 18
});
Если пользователь попытается приблизить карту сильнее, масштабирование будет ограничено.
Определяет минимальный уровень масштабирования.
L.tileLayer(url, {
minZoom: 3
});
Размер тайла в пикселях.
Стандартное значение:
tileSize: 256
Некоторые современные сервисы используют тайлы 512×512:
tileSize: 512
Прозрачность слоя.
L.tileLayer(url, {
opacity: 0.6
});
Значение изменяется от 0 до 1.
Используется при несовпадении размеров тайлов и уровней масштабирования.
Пример для тайлов 512×512:
L.tileLayer(url, {
tileSize: 512,
zoomOffset: -1
});
Позволяет распределять запросы между несколькими поддоменами.
Шаблон URL:
'https://{s}.tile.server.com/{z}/{x}/{y}.png'
Настройка:
L.tileLayer(url, {
subdomains: ['a', 'b', 'c']
});
Leaflet будет автоматически чередовать адреса:
a.tile.server.com
b.tile.server.com
c.tile.server.com
Такой подход исторически использовался для обхода ограничений браузеров на количество одновременных соединений.
Leaflet использует схему XYZ.
Пример координат:
z = 10
x = 617
y = 320
Каждый уровень масштабирования увеличивает количество тайлов в два раза по каждой оси.
Количество тайлов на уровне:
2^z
Например:
| Zoom | Тайлов по оси |
|---|---|
| 0 | 1 |
| 1 | 2 |
| 2 | 4 |
| 3 | 8 |
| 10 | 1024 |
Поэтому на больших масштабах количество потенциально доступных тайлов исчисляется миллионами.
Один и тот же набор географических данных может отображаться по-разному.
Часто доступны следующие стили:
Leaflet позволяет переключать стили простым изменением URL слоя.
Пример:
const streets = L.tileLayer(streetUrl);
const dark = L.tileLayer(darkUrl);
const satellite = L.tileLayer(satelliteUrl);
Для выбора различных карт удобно использовать контрол слоёв.
const osm = L.tileLayer(osmUrl);
const satellite = L.tileLayer(satelliteUrl);
L.control.layers({
'OpenStreetMap': osm,
'Спутник': satellite
}).addTo(map);
Пользователь получает интерфейс переключения карт непосредственно на странице.
Carto предоставляет несколько популярных стилей.
Светлая карта:
L.tileLayer(
'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png',
{
attribution: '© OpenStreetMap contributors © CARTO'
}
);
Тёмная карта:
L.tileLayer(
'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',
{
attribution: '© OpenStreetMap contributors © CARTO'
}
);
Подобные стили часто используются в аналитических панелях и системах мониторинга.
Сервис Esri предоставляет различные картографические наборы данных.
Спутниковые снимки:
L.tileLayer(
'https://server.arcgisonline.com/ArcGIS/rest/services/' +
'World_Imagery/MapServer/tile/{z}/{y}/{x}',
{
attribution: 'Tiles © Esri'
}
);
Такие карты часто применяются для анализа местности и работы с геоданными.
Карты Stamen известны необычным дизайном.
Пример художественного оформления:
L.tileLayer(
'https://stamen-tiles.a.ssl.fastly.net/toner/{z}/{x}/{y}.png'
);
Другие стили включают:
Каждый стиль предназначен для различных визуальных задач.
Современные устройства обладают высокой плотностью пикселей.
Для повышения качества изображения используется параметр:
L.tileLayer(url, {
detectRetina: true
});
Leaflet автоматически загружает более детализированные тайлы для экранов Retina и аналогичных дисплеев.
Преимущества:
Недостаток — увеличение сетевого трафика.
Иногда требуется запретить отображение карты за пределами определённой территории.
Для этого используется параметр bounds.
const bounds = [
[40, 20],
[60, 60]
];
L.tileLayer(url, {
bounds: bounds
});
Тайлы вне заданной области загружаться не будут.
На некоторых уровнях масштабирования тайлы могут отсутствовать.
Для подстановки изображения-заглушки используется:
L.tileLayer(url, {
errorTileUrl: 'images/not-found.png'
});
Если сервер вернёт ошибку, пользователь увидит указанное изображение вместо пустой области.
Браузеры автоматически кэшируют полученные изображения.
Преимущества кэширования:
Leaflet напрямую не управляет кэшем браузера, однако корректно использует стандартные HTTP-заголовки, предоставляемые сервером тайлов.
Если имеется собственный сервер тайлов, подключение выполняется стандартным способом.
Предположим, сервер отдаёт изображения по адресу:
https://maps.example.com/tiles/{z}/{x}/{y}.png
Подключение:
L.tileLayer(
'https://maps.example.com/tiles/{z}/{x}/{y}.png',
{
maxZoom: 20
}
).addTo(map);
Для Leaflet не имеет значения происхождение тайлов, если сервер способен отдавать изображения по ожидаемому URL-шаблону.
Тайловые слои могут накладываться друг на друга.
Например:
const baseLayer = L.tileLayer(baseUrl);
const labelsLayer = L.tileLayer(labelsUrl);
baseLayer.addTo(map);
labelsLayer.addTo(map);
Подобный подход применяется для разделения:
Это позволяет гибко комбинировать различные источники информации.
На скорость отображения карты влияют:
Для повышения производительности обычно используются:
Грамотный выбор провайдера тайлов напрямую влияет на скорость
загрузки карты, стабильность работы приложения и качество визуализации
географических данных. Leaflet предоставляет универсальный механизм
подключения любых тайловых сервисов через класс
L.TileLayer, благодаря чему можно использовать как
общедоступные картографические платформы, так и собственные серверы с
индивидуальными стилями и наборами геоданных.