Приватный тайлсет (Private Tileset) — это набор картографических тайлов, доступ к которому ограничен определёнными пользователями, приложениями или токенами доступа. В экосистеме Mapbox приватные тайлсеты используются для публикации внутренних геоданных, корпоративной картографии, коммерческой информации и любых пространственных данных, которые не должны быть доступны публично.
Тайлсеты могут содержать:
Основное отличие приватного тайлсета от публичного заключается в необходимости авторизации при получении тайлов.
В процессе отображения карты участвуют несколько компонентов:
Схема работы выглядит следующим образом:
Mapbox GL JS
↓
Запрос тайла
↓
Mapbox API
↓
Проверка токена
↓
Проверка прав доступа
↓
Выдача тайла
Если токен обладает необходимыми правами, тайлы загружаются и отображаются на карте. В противном случае сервер возвращает ошибку авторизации.
После загрузки данных через Mapbox Studio или Tilesets API создаётся новый тайлсет.
Пример идентификатора:
company.private_buildings
Где:
company — имя владельца;private_buildings — имя тайлсета.По умолчанию многие тайлсеты создаются как приватные и требуют авторизации для использования.
Mapbox использует токены доступа для контроля безопасности.
Каждый запрос к тайлсету содержит токен:
mapboxgl.accessToken = 'pk.xxxxxxxxxxxxxxxxx';
Токен позволяет:
Без корректного токена приватный тайлсет недоступен.
Mapbox предоставляет два основных типа токенов.
Используется в браузере.
Пример:
pk.eyJ1IjoibXlhY2NvdW50IiwiYSI6ImFiY2RlZiJ9
Возможности:
Обычно используется в клиентских приложениях.
Используется на серверной стороне.
Пример:
sk.eyJ1IjoibXlhY2NvdW50IiwiYSI6ImFiY2RlZiJ9
Особенности:
Никогда не должен передаваться в браузер.
Неправильно:
mapboxgl.accessToken = 'sk.xxxxxxxxx';
Правильно:
mapboxgl.accessToken = 'pk.xxxxxxxxx';
После публикации тайлсета необходимо подключить его как источник данных.
Пример:
map.on('load', () => {
map.addSource('buildings', {
type: 'vector',
url: 'mapbox://company.private_buildings'
});
});
Mapbox GL JS автоматически использует текущий токен доступа для получения тайлов.
После подключения источника создаётся слой визуализации.
map.addLayer({
id: 'building-layer',
type: 'fill',
source: 'buildings',
'source-layer': 'buildings',
paint: {
'fill-color': '#4A90E2',
'fill-opacity': 0.7
}
});
Здесь:
source указывает на источник;source-layer определяет слой внутри векторного
тайлсета;paint отвечает за оформление.Для работы с приватным тайлсетом важно знать внутренние названия слоёв.
Получить их можно через:
Например:
console.log(map.getStyle());
Либо через сетевые запросы:
https://api.mapbox.com/v4/{tileset}.json
Ответ содержит сведения о слоях и метаданных.
Mapbox позволяет ограничивать использование токена конкретными доменами.
Пример списка разрешённых адресов:
https://company.com
https://maps.company.com
https://internal.company.com
Если злоумышленник скопирует токен и попытается использовать его на другом сайте, запросы будут отклонены.
Токен может быть ограничен определёнными сервисами.
Например:
Styles API
Tilesets API
Static Images API
Geocoding API
Для карты, работающей только с приватными тайлсетами, разумно оставить минимально необходимый набор разрешений.
Карта может использовать сразу несколько источников.
map.on('load', () => {
map.addSource('roads', {
type: 'vector',
url: 'mapbox://company.private_roads'
});
map.addSource('buildings', {
type: 'vector',
url: 'mapbox://company.private_buildings'
});
map.addSource('zones', {
type: 'vector',
url: 'mapbox://company.private_zones'
});
});
Такой подход часто используется в корпоративных ГИС-системах.
Приватными могут быть не только векторные данные.
Подключение растрового тайлсета:
map.addSource('imagery', {
type: 'raster',
url: 'mapbox://company.private_imagery',
tileSize: 256
});
Создание слоя:
map.addLayer({
id: 'imagery-layer',
type: 'raster',
source: 'imagery'
});
Подобным образом подключаются:
Приватный стиль может ссылаться на приватные тайлсеты.
Пример:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/company/custom-style'
});
Во время загрузки стиля Mapbox последовательно проверяет права доступа:
Ошибка хотя бы на одном этапе приведёт к проблемам отображения.
401 Unauthorized
Причины:
403 Forbidden
Причины:
Tileset not found
Причины:
Наиболее удобный инструмент — вкладка Network в DevTools браузера.
Следует проверять:
tile requests
style requests
sprite requests
glyph requests
Полезно фильтровать запросы по слову:
tiles
или:
vector
Ответы сервера позволяют быстро определить источник ошибки.
В корпоративных системах часто применяется промежуточный сервер.
Схема:
Browser
↓
Backend
↓
Mapbox API
Преимущества:
Такой подход особенно распространён при работе с коммерческими пространственными данными.
Для повышения безопасности сервер может генерировать временные токены.
Алгоритм работы:
Пользователь входит в систему
↓
Backend проверяет права
↓
Создаётся временный токен
↓
Токен передаётся клиенту
↓
Mapbox GL JS получает тайлы
Преимущества:
Mapbox GL JS автоматически кэширует загруженные тайлы.
Это позволяет:
При изменении данных рекомендуется публиковать новую версию тайлсета или обновлять стиль, чтобы избежать отображения устаревших данных.
Mapbox предоставляет статистику использования ресурсов.
Контролируются:
Мониторинг позволяет своевременно выявлять:
mapboxgl.accessToken = 'pk.xxxxxxxxxxxxx';
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/light-v11',
center: [69.24, 41.31],
zoom: 12
});
map.on('load', () => {
map.addSource('private-parcels', {
type: 'vector',
url: 'mapbox://company.private_parcels'
});
map.addLayer({
id: 'parcel-fill',
type: 'fill',
source: 'private-parcels',
'source-layer': 'parcels',
paint: {
'fill-color': '#2E8B57',
'fill-opacity': 0.5
}
});
map.addLayer({
id: 'parcel-outline',
type: 'line',
source: 'private-parcels',
'source-layer': 'parcels',
paint: {
'line-color': '#1B5E20',
'line-width': 2
}
});
});
В данном примере карта получает доступ к приватному векторному тайлсету, содержащему земельные участки, после чего поверх базовой карты отображаются полигоны и их границы. Основную роль в процессе играет токен доступа, через который Mapbox проверяет разрешения на чтение приватного ресурса.