Главная -> Статьи о HTML5 -> Определяем местоположение с Geolocation API

Определяем местоположение с Geolocation API

Geolocation API предоставляет метод определения точного (или не очень точного) местоположения пользователя. Это может пригодиться во многих случаях - например для обеспечения пользователя геозависимой информацией или для прокладывания маршрутов.

Хотя этот API не входит в HTML5 и был разработан W3C а не WHATWG - описание этого API было добавлено в книгу о HTML5 Реми Шарпа и Брюса Лавсона. Поэтому мы тоже решили рассказать о нем.

Этот API очень прост в использовании, поэтому целью данной статьи является показать читателю на сколько он просто.

Совместимость с браузерами

На данный момент W3C Geolocation API поддерживается следующими браузерами:

  • Firefox 3.5+
  • Chrome 5.0+
  • Safari 5.0+
  • Opera 10.60+
  • Internet Explorer 9.0+

Так же Geolocation API поддерживается следующими мобильными браузерами:

  • Android 2.0+
  • iPhone 3.0+
  • Opera Mobile 10.1+
  • Symbian (S60 3rd & 5th generation)
  • Blackberry OS 6
  • Maemo

Защита данных

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

Источники данных о местоположении 

Для определения местоположения пользователя могут быть использованы разные технологии. Естественно разные технологии позволяют достичь разных степеней точности. Настольные браузеры могут использовать WiFi (точность до 20 метров) или IP Geolocation, которое может назвать только город пользователя и иногда срабатывает не так как нужно. Мобильные устройства могут использовать тригонометрические техники, такие как GPS (точность до 10 метров), WiFi или GSM/CDMA идентификаторы (точность до 1000 метров).

Использование API

Перед тем как начать использовать Geolocation API, вам сначала нужно определить поддерживает ли браузер данную функцию. API определяет функцию для определения поддержки:

if (navigator.geolocation) {
 // do fancy stuff
}

Если функция возвращает false то Вам следует информировать пользователя о том, что у него неполноценный браузер и посмеяться ему в лицо (шутка).

Что касается самого API, то есть две функции для получения местоположения пользователя:

getCurrentPosition и watchPosition

Оба эти метода выполняются немедленно и асинхронно ждут получения текущего местоположения. Они принимают одинаковое количество аргументов, 2 из которых не обязательные:

  1. successCallback – функция вызываемая в случае успешного выполнения метода.
  2. [errorCallback] – функция вызываемая в случае если метод вызван с ошибкой.
  3. [options] - набор опций:
  • enableHighAccuracy - флаг, указывающий что требуется наилучшая точность. Указывание этого атрибута может вызвать большую  задержку, а так же более энергопотребление на мобильных устройствах, так как возможно будет задействован модуль GPS. Тип переменной - Boolean. По умолчанию false.
  • timeout - указывает максимальное время ожидания ответа. По умолчанию 0 - бесконечно.
  • maximumAge - указывает максимальное время хранения данных о местоположении в кэше. Указывается с миллисекундах, по умолчанию 0, т.е. каждый раз при вызове функции местоположении будет определяться заново.

Перед сравнением этих двух методов нужно рассказать еще об одном методе.

clearWatch

Этот метод принимает один аргумент watchID, который определяет процесс определения местоположения (этот ID возвращается функцией watchPosition).

А теперь рассмотрим главные отличия между getCurrentPosition и watchPosition. Разница в том, что watchPosition будет информировать код каждый раз, когда положение пользователя изменится. Это очень полезно если пользователи передвигаются и Вам нужно отслеживать траекторию их движения. getCurrentPosition определяет местоположение единожды. Этот метод так же возвращает watchID.

Когда местоположение пользователя определено, Вам становится доступен объект Position, который содержит несколько свойств:

Свойство

Описание

coords.latitude

Градусы по широте

coords.longitude

Градусы по долготе

coords.altitude

Высота в метрах над референц-эллипсоидом.

coords.accuracy

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

coords.altitudeAccuracy

Точность высоты над референц-эллипсоидом.

coords.heading

Направление движения устройства, измеряется по часовой стрелке от севера.

coords.speed

Текущая скорость предвижения устройства в метрах в секунду.

timestamp

Время, когда местоположение было получено.

Не все эти свойства обязательны. Всегда будут заданы только coords.latitude, coords.longitude и coords.accuracy, остальные могут быть null. Первые 2 свойства могут быть использованы, например, для указания местоположения на Google Maps.

Подробнее о объекте Position вы можете прочитать в спецификации. (http://www.w3.org/TR/geolocation-API/#coordinates_interface)

Собираем все вместе

Собирая все вместе мы получим примерно такой код:

if (navigator.geolocation) {
 var timeoutVal = 10 * 1000 * 1000;
 navigator.geolocation.getCurrentPosition(
  displayPosition,
  displayError,
  { enableHighAccuracy: true, timeout: timeoutVal, maximumAge: 0 }
 );
}
else {
 alert("Geolocation не поддерживается данным браузером");
}

function displayPosition(position) {
 alert("Широта: " + position.coords.latitude + ", Долгота: " + position.coords.longitude);
}

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

function displayError(error) {
 var errors = {
  1: 'Нет прав доступа',
  2: 'Местоположение невозможно определить',
  3: 'Таймаут соединения'
 };
 alert("Ошибка: " + errors[error.code]);
}

Заключение

Это всего лишь введение в Geolocation API и простейший пример его использования.

Конечно же API может быть использовано не просто для отображения координат широты и долготы во всплывающем окошке. Спецификация рекомендует использовать API в следующих целях:

  • Поиск и отрисовка достопримечательностей в области нахождения пользователя.
  • Аннотирование контента в соответствии с местоположением пользователя.
  • Составление маршрутов от точки до точки.
  • Обновление информации на странице по мере перемещения пользователя.