Геолокация в веб-приложениях обычно реализуется через
navigator.geolocation, который предоставляет асинхронные
методы getCurrentPosition и watchPosition. В
контексте картографических библиотек этот API интегрируется с
компонентами управления местоположением, включая
GeolocateControl в MapLibre GL JS.
Ошибки возникают на нескольких уровнях:
Каждый тип ошибки требует отдельной стратегии обработки, поскольку поведение API не унифицировано между устройствами и браузерами.
Объект ошибки, передаваемый в callback error, содержит
поле code, которое определяет тип сбоя:
1 (PERMISSION_DENIED) — пользователь запретил доступ к
геолокации2 (POSITION_UNAVAILABLE) — координаты недоступны3 (TIMEOUT) — превышено время ожиданияДополнительно присутствует поле message, которое может
отличаться по браузерам и не подходит для логической обработки.
getCurrentPositionБазовый подход к обработке ошибок заключается в явной передаче error-callback:
navigator.geolocation.getCurrentPosition(
(position) => {
const { latitude, longitude } = position.coords;
console.log('Позиция:', latitude, longitude);
},
(error) => {
switch (error.code) {
case error.PERMISSION_DENIED:
console.error('Доступ к геолокации запрещён пользователем');
break;
case error.POSITION_UNAVAILABLE:
console.error('Координаты недоступны');
break;
case error.TIMEOUT:
console.error('Превышено время получения позиции');
break;
default:
console.error('Неизвестная ошибка геолокации');
}
},
{
enableHighAccuracy: true,
timeout: 8000,
maximumAge: 0
}
);
Ключевой аспект — параметры опций:
enableHighAccuracy увеличивает точность, но повышает
вероятность таймаутовtimeout определяет предел ожидания ответаmaximumAge управляет кэшированием предыдущих
координатВ MapLibre GL JS геолокация часто используется через контрол:
const geolocate = new maplibregl.GeolocateControl({
positionOptions: {
enableHighAccuracy: true,
timeout: 6000
},
trackUserLocation: true,
showAccuracyCircle: true
});
map.addControl(geolocate);
Контрол генерирует события, позволяющие централизованно обрабатывать ошибки:
geolocateerrortrackuserlocationstarttrackuserlocationendОбработка ошибок выполняется через событие error:
geolocate.on('error', (error) => {
console.error('Ошибка геолокации:', error);
});
В отличие от чистого navigator.geolocation, здесь ошибка
приходит как событие, что требует иной архитектуры обработки.
Наиболее частая ошибка — PERMISSION_DENIED. Она
возникает при:
Стратегия обработки должна учитывать необратимость некоторых состояний. Например, браузеры не позволяют повторно запрашивать разрешение без пользовательского действия.
Типовой подход — перевод интерфейса в режим деградации:
Ошибка TIMEOUT часто возникает при:
enableHighAccuracyПрактика обработки включает:
maximumAge > 0)Пример адаптивной стратегии:
function requestLocation(retry = 0) {
navigator.geolocation.getCurrentPosition(
handleSuccess,
(error) => {
if (error.code === error.TIMEOUT && retry < 2) {
requestLocation(retry + 1);
} else {
handleGeoError(error);
}
},
{
enableHighAccuracy: retry === 0,
timeout: 5000 + retry * 3000,
maximumAge: retry > 0 ? 60000 : 0
}
);
}
Ошибка POSITION_UNAVAILABLE связана с невозможностью
определить координаты. Причины включают:
Реакция системы должна включать fallback:
Метод watchPosition создаёт постоянный поток обновлений.
В этом режиме ошибки могут приходить неоднократно, что требует
фильтрации:
const watchId = navigator.geolocation.watchPosition(
updatePosition,
(error) => {
if (error.code === error.PERMISSION_DENIED) {
navigator.geolocation.clearWatch(watchId);
}
logGeoError(error);
}
);
Особенность этого режима — необходимость предотвращения спама ошибок. Часто применяется throttling или debounce на уровне обработки событий.
Для стабильных картографических приложений критично собирать телеметрию:
Пример структуры логов:
function logGeoError(error) {
const payload = {
code: error.code,
message: error.message,
timestamp: Date.now(),
userAgent: navigator.userAgent
};
sendToServer('/geo-errors', payload);
}
Диагностика позволяет выявлять системные проблемы, например массовые
TIMEOUT на определённых устройствах или регионах.
Обработка ошибок не ограничивается техническим уровнем. В интерфейсной логике выделяются устойчивые состояния:
Важно избегать блокирующих сценариев, когда карта становится полностью недоступной.
Практика включает:
Мобильные среды добавляют дополнительные факторы:
В результате ошибки могут носить временный характер и требовать повторной синхронизации состояния карты с устройством.
Geolocation API доступен только в secure context. Это означает:
file://Ошибка в этом случае не всегда явно кодируется через
error.code, что требует дополнительной проверки:
if (!navigator.geolocation) {
console.error('Geolocation API недоступен в этом контексте');
}
В MapLibre-проектах важно синхронизировать визуальное состояние карты с состоянием геолокации:
Такая синхронизация предотвращает деградацию UX при нестабильных данных.