Книга: JavaScript. Подробное руководство, 6-е издание
22.1. Геопозиционирование
22.1. Геопозиционирование
Прикладной интерфейс объекта Geolocation
(іhttp://www.iv3.org/TR/geolocation-API/) позволяет программам на языке JavaScript запрашивать у броузера географическое местонахождение пользователя. Такие приложения могут отображать карты, маршруты и другую информацию, связанную с текущим местонахождением пользователя. При этом, конечно, возникает важная проблема соблюдения тайны частной информации, поэтому броузеры, поддерживающие прикладной интерфейс Geolocation
, всегда запрашивают у пользователя подтверждение, прежде чем передать JavaScript-программе информацию о физическом местонахождении пользователя.
Броузеры с поддержкой интерфейса Geolocation
определяют свойство navigator.geolocation
. Это свойство ссылается на объект с тремя методами:
navigator.geolocation.getCurrentPosition()
Запрашивает текущее географическое местонахождение пользователя.
navigator.geolocation.watchPosition()
Не только запрашивает текущее местонахождение, но и продолжает следить за координатами, вызывая указанную функцию обратного вызова при изменении местонахождения пользователя.
navigator.geolocation.clearWatch()
Останавливает слежение за местонахождением пользователя. В аргументе этому методу следует передавать число, возвращаемое соответствующим вызовом метода watchPosition()
.
В устройствах, включающих аппаратную поддержку GPS, имеется возможность определять местонахождение с высокой степенью точности с помощью устройства GPS. Однако чаще информация о местонахождении поступает из Всемирной паутины. Если броузер отправит ІР-адрес специализированной веб-службе, она в большинстве случаев сможет определить (на основе информации о поставщиках услуг Интернета), в каком городе находится пользователь (и рекламодатели часто пользуются этой возможностью, реализуя определение местонахождения на стороне сервера). Броузер часто в состоянии получить еще более точную информацию о местонахождении, запросив у операционной системы список ближайших беспроводных сетей и силы их сигналов. Затем эта информация отправляется веб-службе, которая позволяет вычислить местонахождение с большой точностью (обычно с точностью до микрорайона в городе).
Эти технологии определения географического местонахождения связаны либо с обменом данными по сети, либо с взаимодействием с несколькими спутниками, поэтому прикладной интерфейс объекта Geolocation
является асинхронным: методы getCurrentPosition()
и watchPosition()
возвращают управление немедленно, но они принимают функцию, которая будет вызвана броузером, когда он определит местонахождение пользователя (или когда местонахождение изменится). В простейшем случае запрос местонахождения выглядит так:
navigator.geolocation.getCurrentPosition(function(pos) {
var latitude = pos.coords.latitude;
var longitude = pos.coords.longitude;
alert("Ваши координаты: " + latitude + ", + longitude);
});
В дополнение к широте и долготе в ответ на каждый успешный запрос возвращается также значение (в метрах), указывающее точность определения местонахождения. Пример 22.1 демонстрирует получение информации о местонахождении: он вызывает метод getCurrentPosition(),
чтобы определить текущее местонахождение, и использует полученную информацию для отображения карты (полученной от службы Google Maps) текущего местонахождения в масштабе, примерно соответствующем точности определения местонахождения.
Пример 22.1. Использование информации о местонахождении для отображения карты
// Возвращает вновь созданный элемент <img>, настроенный (в случае успешного
// определения местонахождения) на отображение карты для текущего местонахождения.
// Обратите внимание, что вызывающая программа сама должна вставить возвращаемый
// элемент в документ, чтобы отобразить его. Возбуждает исключение, если возможность
// определения местонахождения не поддерживается броузером,
function getmap() {
// Проверить поддержку объекта geolocation
if (!navigator.geolocation)
throw "Определение местонахождения не поддерживается";
// Создать новый элемент <img>, отправить запрос определения местонахождения,
// чтобы в img отобразить карту местонахождения и вернуть изображение,
var image = document.createElement("img");
navigator.geolocation.getCurrentPosition(setMapURL);
return image;
// Эта функция будет вызвана после того, как вызывающая программа получит объект
// изображения, в случае успешного выполнения запроса определения местонахождения,
function setMapURL(pos) {
// Получить информацию о местонахождении из объекта аргумента
var latitude = pos.coords.latitude; // Градусы к северу от экватора
var longitude = pos.coords.longitude; // Градусы к востоку от Гринвича
var accuracy = pos.coords.accuracy; // Метры
// Сконструировать URL для получения статического изображения карты
// от службы Google Мар для этого местонахождения
var url = "http://maps.google.com/maps/api/staticmap" +
"?center=" + latitude + + longitude +
"&size=640x640&sensor=t rue";
// Установить масштаб карты, используя грубое приближение
var zoomlevel=20; // Для начала установить самый крупный масштаб
if (accuracy > 80) // Уменьшить масштаб для низкой точности
zoomlevel -= Math.round(Math.log(accuracy/50)/Math.LN2);
url += "&zoom=" + zoomlevel; // Добавить масштаб в URL
// Отобразить карту в объекте изображения. Спасибо, Google!
image.src = url;
}
}
Прикладной интерфейс Geolocation обладает несколькими особенностями, которые не были продемонстрированы в примере 22.1:
• В дополнение к первому аргументу с функцией обратного вызова методы getCurrentPosition() и watchPosition() принимают вторую необязательную функцию, которая будет вызвана в случае неудачного выполнения запроса.
• Помимо функций обработчиков успешного и неудачного выполнения запроса эти два метода принимают в третьем необязательном аргументе объект с параметрами. Свойства этого объекта определяют: желательна ли высокая точность определения местонахождения, насколько «устаревшей» может быть информация о местонахождении и предельное время ожидания определения местонахождения.
• Объект, который передается обработчику в случае успешного выполнения запроса, также включает время и может (на некоторых устройствах) содержать дополнительную информацию, такую как высота над уровнем моря, скорость и направление перемещения.
Эти дополнительные возможности демонстрируются в примере 22.2.
Пример 22.2. Демонстрация всех возможностей определения местонахождения
// Асинхронно определяет местонахождение и отображает его в указанном элементе,
function whereami(elt) {
// Этот объект передается методу getCurrentPosition() в 3 аргументе
var options = {
// Чтобы получить координаты с высокой точностью (например, с устройства GPS),
// присвойте этому свойству значение true. Отметьте, однако, что это может
// увеличить расход энергии в аккумуляторах.
enableHighAccuracy: false, // Приблизительно: по умолчанию
// Определите свое значение, если допустимо брать координаты из кэша.
// По умолчанию имеет значение 0, что обеспечивает получение самой
// свежей информации.
maximumAge: 300000, // Пригодна информация, полученная в течение последних 5 минут
// Предельное время ожидания выполнения запроса.
// По умолчанию имеет значение Infinity, что соответствует бесконечному
// времени ожидания выполнения запроса вызовом метода getCurrentPosition()
timeout: 15000 // Ждать не более 15 секунд
};
if (navigator.geolocation) // Запросить координаты, если возможно
navigator.geolocation.getCurrentPosition(success, error, options):
else
elt.innerHTML = "Возможность определения местонахождения " +
"не поддерживается этим броузером":
// Эта функция будет вызвана в случае неудачного выполнения запроса
function error(e) {
// Объект ошибки содержит числовой код и текстовое сообщение. Коды:
// 1: пользователь не дал разрешения на определение местонахождения
// 2: броузер не смог определить местонахождение
// 3: истекло предельное время ожидания
elt.innerHTML = "Ошибка определения местонахождения " + e.code + ": + е.message;
}
// Эта функция будет вызвана в случае успешного выполнения запроса
function success(pos) {
// Эти поля возвращаются всегда. Обратите внимание, что поле timestamp
// принадлежит внешнему объекту pos, а не вложенному coords,
var msg = "At " +
new Date(pos.timestamp).toLocaleString() +
" вы находились в " + pos.coords.accuracy + " метрах от точки " +
pos.coords.latitude + " северной широты " +
pos.coords.longitude + " восточной долготы.":
// Если устройство возвращает высоту над уровнем моря, добавить эту информацию,
if (pos.coords.altitude) {
msg += " Вы находитесь на высоте " +
pos.coords.altitude + " ± " + pos.coords.altitudeAccuracy +
" метров над уровнем моря.";
}
// Если устройство возвращает направление и скорость движения,
// добавить и эту информацию.
if (pos.coords.speed) {
msg += " Вы перемещаетесь со скоростью " +
pos.coords.speed + "м/сек в направлении " + pos.coords.heading + ".";
}
elt.innerHTML = msg; // Отобразить информацию о местонахождении
}
}
- 22.1. Геопозиционирование
- 22.2. Управление историей посещений
- 22.3. Взаимодействие документов с разным происхождением
- 22.4. Фоновые потоки выполнения
- 22.5. Типизированные массивы и буферы
- 22.6. Двоичные объекты
- 22.7. Прикладной интерфейс к файловой системе
- 22.8. Базы данных на стороне клиента
- 22.9. Веб-сокеты
- Что не поддерживается
- 22 Прикладные интерфейсы HTML5
- 6.3.2. Процедура сбора качественных данных
- Глава 2 Табличный редактор Microsoft Excel
- «Плиточные» структуры и квазикристаллы
- 16.13 Формат сообщений MIME
- Как уразуметь свою техническую роль и придерживаться ее
- Отправка запроса
- Build a Run-Time Image for an OS Design
- Как отвечать на письма, полученные вашей организацией
- 5.1.1. Создание трехмерной модели радиатора
- Привязка к процессорам