Модель XYZ представляет собой наиболее распространённый способ
разбиения карты на набор квадратных растровых тайлов, каждый из которых
имеет координаты x, y и уровень масштаба
z. Эта схема лежит в основе большинства веб-карт, включая
стандартные подложки, предоставляемые OpenStreetMap и коммерческими
провайдерами.
В экосистеме OpenLayers работа с XYZ реализована через
ol/source/XYZ, который инкапсулирует логику формирования
URL, загрузки тайлов, кэширования и интеграции с системой слоёв
ol/layer/Tile.
Каждый тайл в XYZ-схеме идентифицируется тройкой координат:
При этом координаты формируются в проекции Web Mercator (EPSG:3857), где карта делится на квадратную сетку.
Формат URL обычно выглядит так:
https://tile.server/{z}/{x}/{y}.png
Именно эта шаблонная структура делает XYZ максимально простой для интеграции.
ol/source/XYZ в OpenLayersВ OpenLayers XYZ-источник создаётся следующим образом:
import XYZ from 'ol/source/XYZ';
import TileLayer from 'ol/layer/Tile';
const source = new XYZ({
url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'
});
const layer = new TileLayer({
source: source
});
Здесь ключевым элементом является параметр url, который
поддерживает шаблонные переменные:
{z} — уровень масштаба{x} — координата по X{y} — координата по Y{a-c} — выбор поддомена для балансировки нагрузкиМногие тайловые серверы используют поддомены для распределения запросов:
https://a.tile.server/{z}/{x}/{y}.png
https://b.tile.server/{z}/{x}/{y}.png
https://c.tile.server/{z}/{x}/{y}.png
OpenLayers поддерживает автоматическую подстановку:
const source = new XYZ({
url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
});
Механизм распределяет запросы между поддоменами, снижая нагрузку на отдельные серверы и ускоряя параллельную загрузку тайлов.
XYZ-тайлы по своей природе статичны, поэтому эффективно кешируются как на уровне браузера, так и внутри OpenLayers.
Внутренний кэш ol/source/Tile:
Поведение загрузчика регулируется параметрами:
const source = new XYZ({
url: 'https://tile.server/{z}/{x}/{y}.png',
cacheSize: 512,
transition: 0
});
cacheSize определяет количество тайлов в памятиtransition управляет анимацией появления тайловХотя XYZ-источник часто используется «из коробки», его работа
опирается на TileGrid, определяющий геометрию разбиения
карты.
import TileGrid from 'ol/tilegrid/TileGrid';
import {get as getProjection} from 'ol/proj';
const grid = new TileGrid({
extent: getProjection('EPSG:3857').getExtent(),
resolutions: [156543.0339, 78271.5169, 39135.7584],
tileSize: 256
});
Использование собственного tileGrid позволяет:
XYZ почти всегда работает в EPSG:3857, что обусловлено особенностями веб-картографии:
Любое отклонение от этой системы требует дополнительной трансформации координат, что может влиять на производительность.
XYZ-источник поддерживает различные форматы изображений:
Пример:
const source = new XYZ({
url: 'https://tile.server/{z}/{x}/{y}.webp',
crossOrigin: 'anonymous'
});
Параметр crossOrigin критичен при работе с внешними
доменами, чтобы избежать ограничений CORS при рендеринге canvas.
При работе с сетевыми источниками неизбежны ошибки:
OpenLayers позволяет обрабатывать такие случаи:
const source = new XYZ({
url: 'https://tile.server/{z}/{x}/{y}.png',
tileLoadFunction: function(tile, src) {
const img = tile.getImage();
img.src = src;
img.oner ror = function() {
img.src = 'fallback.png';
};
}
});
Такой подход позволяет подменять недоступные тайлы заглушками.
XYZ часто путают с WMTS (Web Map Tile Service), однако различия принципиальны:
| Параметр | XYZ | WMTS |
|---|---|---|
| Структура URL | простая | стандартизированная |
| Метаданные | отсутствуют | обязательны |
| Гибкость | высокая | ограниченная |
| Поддержка сеток | фиксированная | описываемая |
WMTS требует описания GetCapabilities, тогда как XYZ
опирается на соглашение URL-шаблона.
XYZ-источник позволяет подключать собственные генераторы тайлов, например серверы на базе:
Пример интеграции:
const source = new XYZ({
url: 'https://maps.custom-server.com/tiles/{z}/{x}/{y}.png'
});
При этом важно соблюдать:
Для экранов с высокой плотностью пикселей применяются тайлы увеличенного разрешения:
const source = new XYZ({
url: 'https://tile.server/{z}/{x}/{y}@2x.png',
tilePixelRatio: 2
});
tilePixelRatio сообщает системе рендеринга, что
изображение содержит больше пикселей, чем стандартный тайл.
Это позволяет:
XYZ-серверы обычно ограничивают диапазон zoom-уровней. OpenLayers позволяет явно задавать границы:
const source = new XYZ({
url: 'https://tile.server/{z}/{x}/{y}.png',
minZoom: 3,
maxZoom: 18
});
При выходе за пределы диапазона тайлы не запрашиваются, что снижает нагрузку и предотвращает ошибки 404.
OpenLayers использует стратегию предзагрузки соседних тайлов:
Это обеспечивает плавность навигации даже при медленном соединении.
Иногда требуется динамическая логика генерации тайлового URL:
const source = new XYZ({
tileUrlFunction: function(tileCoord) {
const z = tileCoord[0];
const x = tileCoord[1];
const y = tileCoord[2];
return `https://server/tiles/${z}/${x}/${y}.png`;
}
});
Этот механизм используется при:
XYZ-слои часто комбинируются с:
VectorLayer)Типичная структура карты:
Такая архитектура разделяет визуальную подложку и семантические данные.
Ключевые факторы производительности XYZ в OpenLayers:
Дополнительно важна правильная настройка заголовков HTTP:
Cache-ControlETagExpiresЭти параметры определяют эффективность повторного использования тайлов.
Несмотря на простоту, XYZ имеет ряд ограничений:
Эти ограничения компенсируются высокой скоростью и универсальностью интеграции в веб-среде.