Геолокация в веб-картах опирается на браузерный API
navigator.geolocation, который возвращает координаты
устройства при наличии разрешения пользователя и технической возможности
определения местоположения. В контексте картографических библиотек этот
процесс оборачивается дополнительным слоем абстракции, где ошибки могут
возникать на нескольких уровнях:
Основные причины сбоев:
Браузерный API стандартизирует ошибки через объект
PositionError, который содержит код и сообщение.
1 — PERMISSION_DENIED Геолокация запрещена
пользователем или политиками браузера
2 — POSITION_UNAVAILABLE Координаты недоступны
(например, нет сигнала GPS или сетевого определения)
3 — TIMEOUT Превышено время ожидания
запроса
Эти коды напрямую используются при обработке событий в картографических библиотеках.
В Leaflet геолокация реализуется через метод:
map.locate({ setView: true, maxZoom: 16 });
После вызова инициируется асинхронный процесс определения координат, результат которого обрабатывается через события:
locationfoundlocationerrormap.on('locationfound', function (e) {
const radius = e.accuracy;
L.marker(e.latlng).addTo(map);
L.circle(e.latlng, radius).addTo(map);
});
map.on('locationerror', function (e) {
console.log(e.message);
});
Объект ошибки e содержит:
code — числовой идентификатор ошибкиmessage — текстовое описаниеLeaflet не абстрагирует ошибки браузера, а транслирует их напрямую. Это означает, что обработка должна учитывать специфику каждого кода.
map.on('locationerror', function (e) {
if (e.code === 1) {
console.log('Доступ к геолокации запрещён');
}
});
Сценарии возникновения:
map.on('locationerror', function (e) {
if (e.code === 2) {
console.log('Координаты недоступны');
}
});
Причины:
map.on('locationerror', function (e) {
if (e.code === 3) {
console.log('Превышено время ожидания');
}
});
Факторы:
timeout в параметрах
map.locateМетод map.locate принимает конфигурацию, которая
напрямую влияет на поведение геолокации:
map.locate({
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 0,
setView: true
});
true — использование GPS и высокоточных источниковОпределяет максимальное время ожидания результата. Слишком малое
значение приводит к частым ошибкам TIMEOUT.
Определяет допустимость использования кешированных координат:
0 — всегда свежие данныеПри построении картографических интерфейсов используется единая точка обработки ошибок:
function handleLocationError(e) {
switch (e.code) {
case 1:
console.log('Нет разрешения');
break;
case 2:
console.log('Нет данных о местоположении');
break;
case 3:
console.log('Таймаут запроса');
break;
default:
console.log('Неизвестная ошибка');
}
}
map.on('locationerror', handleLocationError);
Такой подход позволяет изолировать логику обработки от основной карты.
Ошибки геолокации часто носят временный характер, поэтому используется механизм повторных запросов:
function locateWithRetry(attempt = 0) {
if (attempt > 2) return;
map.locate({
setView: true,
timeout: 8000
});
}
map.on('locationerror', function () {
locateWithRetry(1);
});
При этом важно учитывать:
Некоторые окружения не предоставляют
navigator.geolocation. В этом случае Leaflet не инициирует
успешное определение координат.
if (!navigator.geolocation) {
console.log('Геолокация не поддерживается');
}
Дополнительно может применяться fallback:
Leaflet передаёт ошибки без изменения структуры, но добавляет контекст карты. Это приводит к необходимости учитывать:
PositionError и Leaflet eventПример унифицированного объекта:
function normalizeError(e) {
return {
code: e.code,
message: e.message,
source: 'geolocation'
};
}
При разработке картографических систем геолокация требует детального логирования:
locatemap.on('locationerror', function (e) {
console.error({
code: e.code,
message: e.message,
timestamp: Date.now()
});
});
Такая информация используется для анализа причин нестабильного определения координат.
Мобильные устройства добавляют дополнительные источники нестабильности:
Это увеличивает вероятность:
Геолокация доступна только в защищённом контексте HTTPS. При отсутствии HTTPS:
locationerror может не инициироватьсяВ сложных приложениях используется разделение уровней:
Это позволяет избежать смешивания логики карты и логики состояния устройства.
При диагностике ошибок геолокации важны следующие параметры:
accuracy)Leaflet предоставляет только событийную модель, поэтому основная аналитика выполняется через внешние механизмы и консольные инструменты разработчика.