Функция геолокации HTML5 позволяет вам узнать географические координаты (широту latitude и долготу longitude) текущего местоположения посетителя вашего сайта.

Эта функция полезна для обеспечения удобного просмотра посетителям сайта. Например, вы можете показать товары или объекты, которые физически близки к местоположению пользователя.

Поиск координат посетителя

Получить информацию о местоположении посетителя сайта с помощью API геолокации HTML5 довольно просто. Он использует три метода, которые упакованы в navigator.geolocation объект — getCurrentPosition(), watchPosition() и clearWatch().

Ниже приведен простой пример, отображающей ваше текущее положение. Но сначала вы должны согласиться позволить браузеру сообщить веб-серверу о вашей гео-позиции.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Текущее местоположение</title>
<script>
    function showPosition() {
        if(navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function(position) {
                var positionInfo = "Ваша текущая геолокация (" + "Latitude: " + position.coords.latitude + ", " + "Longitude: " + position.coords.longitude + ")";
                document.getElementById("result").innerHTML = positionInfo;
            });
        } else {
            alert("Извините, ваш браузер не поддерживает геолокацию HTML5.");
        }
    }
</script>
</head>
<body>
    <div id="result">
        <!--Информация о местоположении будет вставлена здесь-->
    </div>
    <button type="button" onclick="showPosition();">Показать гео-позицию</button>
</body>
</html>

Веб-браузер не даст местоположение посетителя, если пользователь не дает на это явного подтверждения. Стандарт геолокации устанавливает официальное правило получения разрешения пользователя для каждого веб-сайта, для которого требуются данные о местоположении.

Работа с ошибками Geolocation

Может возникнуть ситуация, когда пользователь не хочет делиться с вами данными о своем местоположении. Если это случится, вы можете дать пользователю два разных ответа при вызове функции getCurrentLocation().

Первая функция вызывается, если попытка определения геолокации успешна, а вторая, если попытка заканчивается неудачей. Давайте посмотрим на пример:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Обработка ошибок геолокации</title>
<script>
    // Set up global variable
    var result;
    
    function showPosition() {
        // Элемент в который выводим результат функции
        result = document.getElementById("result");
        
        // Если геолокация доступна, пробуем получить позицию посетителя
        if(navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
            result.innerHTML = "Получение информации о местоположении...";
        } else {
            alert("Извините, ваш браузер не поддерживает геолокацию HTML5.");
        }
    };
    
    // Определяем функцию обратного вызова для успешной попытки
    function successCallback(position) {
        result.innerHTML = "Ваша текущая геолокация (" + "Latitude: " + position.coords.latitude + ", " + "Longitude: " + position.coords.longitude + ")";
    }
    
    // Определяем функцию обратного вызова для неудачной попытки
    function errorCallback(error) {
        if(error.code == 1) {
            result.innerHTML = "Вы решили не делиться своей позицией, но все в порядке. Мы не будем спрашивать вас снова.";
        } else if(error.code == 2) {
            result.innerHTML = "Сеть не работает или услуга определения местоположения недоступна.";
        } else if(error.code == 3) {
            result.innerHTML = "Время ожидания до получения данных о местоположении истекло.";
        } else {
            result.innerHTML = "Определение геолокации не удалось из-за неизвестной ошибки.";
        }
    }
</script>
</head>
<body>
    <div id="result">
        <!--Информация о местоположении будет вставлена здесь-->
    </div>
    <button type="button" onclick="showPosition();">Показать гео-позицию</button>
</body>
</html>

Отображение местоположения на карте Google

С данными геолокации вы можете отображать местоположение пользователя на Google-картах. В следующем примере будет показано ваше текущее местоположение на карте Google на основе данных о широте и долготе, полученных с помощью функции геолокации HTML5.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Использование Google Maps</title>
<script>
    function showPosition() {
        navigator.geolocation.getCurrentPosition(showMap);
    }
    
    function showMap(position) {
        // Получаем данные о местоположении
        var latlong = position.coords.latitude + "," + position.coords.longitude;
        
        // Устанавливаем URL-адрес карты Google
        var mapLink = "https://maps.googleapis.com/maps/api/staticmap?center="+latlong+"&zoom=16&size=400x300&output=embed";
        
        // Создаем и вставляем Google карту
        document.getElementById("embedMap").innerHTML = "<img alt='Map Holder' src='"+ mapLink +"'>";
    }
</script>
</head>
<body>
    <button type="button" onclick="showPosition();">Показать мою позицию на Google картах</button>
    <div id="embedMap">
        <!--Google карта будет встроена сюда-->
    </div>
</body>
</html>

Приведенный выше пример просто покажет местоположение на Google-карте, используя статическое изображение. Однако вы также можете создавать интерактивные Google-карты с помощью перетаскивания, увеличения/уменьшения масштаба и других функций, с которыми вы сталкивались в своей реальной жизни. Давайте посмотрим на следующий пример:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Использование Google Maps</title>
<script src="https://maps.google.com/maps/api/js?sensor=false"></script>
<script>
function showPosition() {
    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showMap, showError);
    } else {
        alert("Извините, ваш браузер не поддерживает геолокацию HTML5.");
    }
}
 
// Определяем функцию обратного вызова для успешной попытки
function showMap(position) {
    // Получаем данные о местоположении
    lat = position.coords.latitude;
    long = position.coords.longitude;
    var latlong = new google.maps.LatLng(lat, long);
    
    var myOptions = {
        center: latlong,
        zoom: 16,
        mapTypeControl: true,
        navigationControlOptions: {
            style:google.maps.NavigationControlStyle.SMALL
        }
    }
    
    var map = new google.maps.Map(document.getElementById("embedMap"), myOptions);
    var marker = new google.maps.Marker({ position:latlong, map:map, title:"Вы находитесь здесь!" });
}
 
// Определяем функцию обратного вызова для неудачной попытки
function showError(error) {
    if(error.code == 1) {
        result.innerHTML = "Вы решили не делиться своей позицией, но все в порядке. Мы не будем спрашивать вас снова.";
    } else if(error.code == 2) {
        result.innerHTML = "Сеть не работает или услуга определения местоположения недоступна.";
    } else if(error.code == 3) {
        result.innerHTML = "Время ожидания до получения данных о местоположении истекло.";
    } else {
        result.innerHTML = "Определение геолокации не удалось из-за неизвестной ошибки.";
    }
}
</script>
</head>
<body>
    <button type="button" onclick="showPosition();">Показать мою позицию на Google-карте</button>
    <div id="embedMap" style="width: 400px; height: 300px;">
        <!--Google-карта будет встроена сюда-->
    </div>
</body>
</html>

Подробнее о Google Map API по ссылке: developers.google.com/maps/documentation/javascript/reference.

Мониторинг движения посетителей

Все примеры, которые мы использовали до сих пор, основывались на методе getCurrentPosition(). Однако у объекта геолокации есть другой метод watchPosition(), который позволяет отслеживать движение посетителя, возвращая обновленную позицию при изменении местоположения.

watchPosition() имеет те же входные параметры, что и getCurrentPosition(). Однако watchPosition() может запускать функцию несколько раз — когда она получает местоположение в первый раз, и снова, когда обнаруживает новую позицию. Давайте посмотрим, как это работает:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Отслеживание гео-позиции</title>
<script>
    // Устанавливаем глобальную переменную
    var watchID;

    function showPosition() {
        if(navigator.geolocation) {
            watchID = navigator.geolocation.watchPosition(successCallback);
        } else {
            alert("Извините, ваш браузер не поддерживает геолокацию HTML5.");
        }
    }

    function successCallback(position) {
        toggleWatchBtn.innerHTML = "Stop Watching";
        
        // Проверяем было ли изменено положение или нет, прежде чем что-либо делать
        if(prevLat != position.coords.latitude || prevLong != position.coords.longitude){
            
            // Устанавливаем предыдущее местоположение
            var prevLat = position.coords.latitude;
            var prevLong = position.coords.longitude;
            
            // Получаем текущее положение
            var positionInfo = "Ваша текущая геолокация (" + "Latitude: " + position.coords.latitude + ", " + "Longitude: " + position.coords.longitude + ")";
            document.getElementById("result").innerHTML = positionInfo;
            
        }
        
    }

    function startWatch() {
        var result = document.getElementById("result");
        
        var toggleWatchBtn = document.getElementById("toggleWatchBtn");
        
        toggleWatchBtn.onclick = function() {
            if(watchID) {
                toggleWatchBtn.innerHTML = "Start Watching";
                navigator.geolocation.clearWatch(watchID);
                watchID = false;
            } else {
                toggleWatchBtn.innerHTML = "Новое положение...";
                showPosition();
            }
        }
    }
    
    // Инициализируем всю систему выше
    window.onload = startWatch;
</script>
</head>
<body>
    <button type="button" id="toggleWatchBtn">Начать просмотр</button>
    <div id="result">
        <!--Информация о местоположении будет вставлена здесь-->
    </div>   
</body>
</html>

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 5 / 5. Количество оценок: 1

Оценок пока нет. Поставьте оценку первым.