Использование геолокации

Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.

API геолокации позволяет пользователю предоставлять их местоположение web-приложению, если они пожелают этого. Из соображений конфиденциальности, пользователя спрашивают разрешение на предоставление информации о местоположении.

Объект геолокации

API геолокации публикуется через navigator.geolocation объект.

Если объект существует, сервисы геолокации доступны. Вы можете протестировать наличие сервиса геолокации следующим образом:

if ("geolocation" in navigator) {
  /* геолокация доступна */
} else {
  /* геолокация НЕдоступна */
}

Note: В Firefox 24 и более ранних версиях, "geolocation" в navigator всегда возвращало true, даже если API был отключен. Это было исправлено в Firefox 25 согласно спецификации. (баг 884921).

Получение текущего местоположения

Чтобы получить текущее местоположение пользователя, вы должны вызвать метод getCurrentPosition(). Это инициирует асихронный запрос для обнаружения местоположения пользователя, и запрашивает аппаратные средства позиционирования, чтобы получить последнюю актуальную информацию. Когда местоположение обнаружено, запускается определенная функция с ответом на запрос (callback function). По желанию вы можете реализовать второй вызов функции ответа, которая запустится в случае ошибки. Третий, опциональный, параметр - объект с опциями, где вы можете настроить максимальное значение возвращаемых данных, время ожидания ответа на запрос, и, при желании, получение данных высокой точности.

Note: По умолчанию, getCurrentPosition() пытается ответить как можно быстрее, используя при этом низкую точность. Это полезно, если вам нужен быстрый ответ и не важна точность. Устройства с GPS, например, могут потребовать минуту и даже больше, чтобы исправить данные GPS, поэтому сначала могут быть возвращены менее точные данные (месторасположение IP или wifi) getCurrentPosition().

navigator.geolocation.getCurrentPosition(function(position) {
  do_something(position.coords.latitude, position.coords.longitude);
});

В приведенном выше примере вызывается функция the do_something(), как только получены данные о локации.

Наблюдение за текущим местоположением

Если данные о местоположении меняются (либо устройство находится в движении, либо пришли более точные данные о геопозиции), вы можете настроить функцию, которая вызывается при любом обновлении данных о местоположении. Это делается с использованием функции watchPosition(), которая имеет несколько входных параметров: getCurrentPosition(). Эта функция вызывается много раз, позволяя браузеру либо обновлять данные о текущей локации во время движения, либо получать более точную информацию о местоположении, так как для его определения используются различные технические приемы. Функция, которая вызывается при ошибке, для getCurrentPosition(), при желании, может быть вызвана неоднократно.

Note: Вы можете использовать watchPosition() без начального вызова getCurrentPosition().

var watchID = navigator.geolocation.watchPosition(function(position) {
  do_something(position.coords.latitude, position.coords.longitude);
});

Метод watchPosition() возвращает номер ID, который может быть использован для однозначной идентификации запрашиваемой позиции наблюдателя; вы используете это значение в тандеме с методом clearWatch(), чтобы прекратить просмотр местоположения пользователя.

navigator.geolocation.clearWatch(watchID);

Точная настройка отклика

И getCurrentPosition() и watchPosition() принимают успешный ответ на запрос, и, при желании, на неуспешный (error callback), а также, опционально, PositionOptions object.

Вызов к watchPosition может выглядеть так:

function geo_success(position) {
  do_something(position.coords.latitude, position.coords.longitude);
}

function geo_error() {
  alert("Sorry, no position available.");
}

var geo_options = {
  enableHighAccuracy: true, 
  maximumAge        : 30000, 
  timeout           : 27000
};

var wpid = navigator.geolocation.watchPosition(geo_success, geo_error, geo_options);

Демонстрация watchPosition в действии: http://www.thedotproduct.org/experiments/geo/


Описание позиции

Местоположение пользователя описывается, используя Position object, привязанного к Coordinates object.

Обработка ошибок

Функция обработки ошибок, при условии, когда вызывается getCurrentPosition() или watchPosition(), ожидает PositionError object в качестве своего первого параметра.

function errorCallback(error) {
  alert('ERROR(' + error.code + '): ' + error.message);
};

Geolocation Live Example

HTML Content

<p><button onclick="geoFindMe()">Show my location</button></p>
<div id="out"></div>

JavaScript Content

function geoFindMe() {
  var output = document.getElementById("out");

  if (!navigator.geolocation){
    output.innerHTML = "<p>Geolocation is not supported by your browser</p>";
    return;
  }

  function success(position) {
    var latitude  = position.coords.latitude;
    var longitude = position.coords.longitude;

    output.innerHTML = '<p>Latitude is ' + latitude + '° <br>Longitude is ' + longitude + '°</p>';

    var img = new Image();
    img.src = "http://maps.googleapis.com/maps/api/staticmap?center=" + latitude + "," + longitude + "&zoom=13&size=300x300&sensor=false";

    output.appendChild(img);
  };

  function error() {
    output.innerHTML = "Unable to retrieve your location";
  };

  output.innerHTML = "<p>Locating…</p>";

  navigator.geolocation.getCurrentPosition(success, error);
}

Live Result

Запрос на доступ к данным

Любые дополнения, размещенные на addons.mozilla.org, которые предполагают использование геопозиции, должны явно перед этим запросить разрешение на это. Следующая функция запрашивает разрешение в манере, похожей на всплывающее окно prompt на веб-страницах. Ответ пользователя будет сохранен в pref parameter, если это применимо. Функция, предусмотренная в параметре ответной функции (callback), будет вызвана со значением false или true, указанном в ответе пользователя. Если это true, дополнение сможет получить доступ к данным геолокации.

function prompt(window, pref, message, callback) {
    let branch = Components.classes["@mozilla.org/preferences-service;1"]
                           .getService(Components.interfaces.nsIPrefBranch);

    if (branch.getPrefType(pref) === branch.PREF_STRING) {
        switch (branch.getCharPref(pref)) {
        case "always":
            return callback(true);
        case "never":
            return callback(false);
        }
    }

    let done = false;

    function remember(value, result) {
        return function() {
            done = true;
            branch.setCharPref(pref, value);
            callback(result);
        }
    }

    let self = window.PopupNotifications.show(
        window.gBrowser.selectedBrowser,
        "geolocation",
        message,
        "geo-notification-icon",
        {
            label: "Share Location",
            accessKey: "S",
            callback: function(notification) {
                done = true;
                callback(true);
            }
        }, [
            {
                label: "Always Share",
                accessKey: "A",
                callback: remember("always", true)
            },
            {
                label: "Never Share",
                accessKey: "N",
                callback: remember("never", false)
            }
        ], {
            eventCallback: function(event) {
                if (event === "dismissed") {
                    if (!done) callback(false);
                    done = true;
                    window.PopupNotifications.remove(self);
                }
            },
            persistWhileVisible: true
        });
}

prompt(window,
       "extensions.foo-addon.allowGeolocation",
       "Foo Add-on wants to know your location.",
       function callback(allowed) { alert(allowed); });

Кроссбраузерность

 
Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка 5 3.5 (1.9.1) 9 10.60
Удалено в 15.0
Пересмотрено в 16.0
5
Feature Android Chrome for Android Firefox Mobile (Gecko) Firefox OS IE Mobile Opera Mobile Safari Mobile
Базовая поддержка ? ? 4.0 (4) 1.0.1 ? 10.60
Удалено в 15.0
Пересмотрено в 16.0
?

Дополнения по Gecko

Firefox включает поддержку обнаружения вашего местонахождения на основании информации о вашем WiFi, используя Google Location Services. В соглашении между Firefox и Google утвержден обмен данными, включая точку доступа WiFi, токен доступа (что-то похожее на 2-недельные cookie), и пользовательский IP адрес. Для дополнительной информации, пожалуйста, ознакомьтесь с Политикой Конфиденциальности Mozilla и Политикой Конфиденциальности Google, которые подробно объясняют, как эти данные могут быть использованы.

Firefox 3.6 (Gecko 1.9.2) добавили поддержку для использования сервиса GPSD (GPS daemon) для геолокации на Linux.

Смотри также

Метки документа и участники

 Внесли вклад в эту страницу: rootacat, kevich, Aleksej, Almatbek, Zaw00
 Обновлялась последний раз: rootacat,