Control.Attribution в Leaflet отвечает за отображение строки атрибуции карты и источников данных, используемых в слоях. Атрибуция является обязательным элементом большинства картографических проектов, поскольку фиксирует авторство тайлов, геоданных и картографических сервисов, а также выполняет требования лицензирования.
Контрол атрибуции выполняет несколько функций:
Контрол размещается на карте как UI-элемент и обычно располагается в нижнем правом углу.
При создании карты атрибуция обычно добавляется автоматически, если используются стандартные слои:
const map = L.map('map', {
attributionControl: true
});
Либо контрол может быть создан явно:
const attribution = L.control.attribution().addTo(map);
При этом Leaflet автоматически добавляет базовый префикс:
Leaflet | © ...
Контрол поддерживает настройки при создании:
L.control.attribution({
position: 'bottomright',
prefix: 'Custom prefix'
});
Определяет положение элемента на карте:
toplefttoprightbottomleftbottomrightПо умолчанию используется bottomright.
Строка, отображаемая перед всеми атрибуциями. Может быть:
Примеры:
L.control.attribution({
prefix: false
});
Отключение префикса убирает стандартную подпись Leaflet.
L.control.attribution({
prefix: 'Map system'
});
Большинство слоёв Leaflet автоматически регистрируют атрибуцию через
параметр attribution.
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
Эта строка автоматически передаётся в Control.Attribution.
При подключении нескольких слоёв их атрибуции объединяются:
L.tileLayer(url1, {
attribution: 'Provider A'
});
L.tileLayer(url2, {
attribution: 'Provider B'
});
В контроле будет отображено:
Provider A | Provider B
Добавляет строку атрибуции вручную:
map.attributionControl.addAttribution('Custom data source');
Используется для динамических данных, не привязанных к слоям.
Удаляет ранее добавленную строку:
map.attributionControl.removeAttribution('Custom data source');
Важно: строка должна совпадать полностью.
Изменяет префикс после инициализации:
map.attributionControl.setPrefix('New prefix text');
Отключение:
map.attributionControl.setPrefix(false);
Leaflet допускает использование HTML в строках атрибуции:
L.tileLayer(url, {
attribution: '<a href="https://openstreetmap.org">OSM</a> contributors'
});
Это позволяет добавлять кликабельные ссылки и структурированные подписи.
При сложных картах атрибуция формируется из множества источников:
Пример:
const roads = L.geoJSON(data, {
attribution: 'Road data © Government'
}).addTo(map);
const buildings = L.geoJSON(buildingsData, {
attribution: 'Buildings dataset © City GIS'
}).addTo(map);
В результате Control.Attribution автоматически объединяет все источники.
Leaflet отслеживает привязанные атрибуции и корректно обновляет контрол:
map.removeLayer(roads);
После удаления слоя соответствующая строка исчезает из атрибуции, если она больше не используется другими слоями.
Можно полностью переопределить поведение контроллера:
const CustomAttribution = L.Control.Attribution.extend({
addAttribution: function (text) {
console.log('Добавлена атрибуция:', text);
return L.Control.Attribution.prototype.addAttribution.call(this, text);
}
});
const attribution = new CustomAttribution().addTo(map);
Такой подход используется для логирования или синхронизации с внешними UI-компонентами.
Контрол атрибуции имеет стандартную структуру DOM:
<div class="leaflet-control-attribution leaflet-control">
<a href="...">Leaflet</a> | © OpenStreetMap contributors
</div>
Можно стилизовать через CSS:
.leaflet-control-attribution {
font-size: 11px;
background: rgba(255, 255, 255, 0.7);
padding: 2px 6px;
}
Control.Attribution входит в группу control-container и подчиняется общей системе слоёв UI:
Некоторые провайдеры требуют строгого соблюдения атрибуции. В таких случаях строка должна включать:
Пример:
L.tileLayer(url, {
attribution: 'Map data © Provider Name, Terms apply'
});
При использовании данных, загружаемых асинхронно:
fetch('/geo.json')
.then(r => r.json())
.then(data => {
L.geoJSON(data, {
attribution: 'Dynamic dataset © API service'
}).addTo(map);
});
Атрибуция добавляется только после загрузки слоя и автоматически включается в контрол.
Leaflet использует внутренний механизм Set для хранения атрибуций, что обеспечивает:
При повторной добавлении одной и той же строки она не дублируется.
Полное отключение контроллера:
const map = L.map('map', {
attributionControl: false
});
Используется при создании кастомного интерфейса или при интеграции с внешними системами отображения лицензий.
Control.Attribution не конфликтует с:
Все контролы размещаются независимо и управляются контейнером
.leaflet-control-container.