На помощь спешит geo.js

geo.js

Сценарий geo.js (http://code.google.com/p/geo-location-javascript/) — это JavaScript – библиотека, распространяемая под лицензией MIT с открытым исходным кодом. Она позволяет сглаживать различия между W3C API геолокации, API приложения Gears и разнообразными API мобильных платформ. Чтобы воспользоваться geo.js, надо поместить в нижнюю часть страницы два сценария (строго говоря, их можно поместить в любую часть страницы, но если внедрить их в контейнер , страница будет загружаться медленнее, так что не делайте этого).

Первый из этих сценариев — gears_init.js (http://code.google.com/apis/gears/gears_init.js), инициализирующий Gears, если это расширение установлено. Второй — geo.js (http://geo-location-javascript.googlecode.com/svn/trunk/js/geo.js). Код страницы должен выглядеть приблизительно так:


< !DOCTYPE html>



Название моей страницы


...





Теперь вы готовы к использованию любого из доступных API геолокации:

if (geo_position_js.init()) {
geo_position_js.getCurrentPosition(geo_success, geo_error);
}

Разберем этот код по порядку. Сначала надо явным образом вызвать функцию init(). Если поддерживается и доступен хотя бы один API геолокации, функция возвратит true:

if (geo_position_js.init()) {

Вызвав функцию init(), мы не устанавливаем местонахождение пользователя, а только удостоверяемся, что это возможно сделать. Чтобы перейти к делу, вызовем функцию getCurrentPosition():

geo_position_js.getCurrentPosition(geo_success, geo_error);

При вызове getCurrentPosition() браузер спросит пользователя, можно ли рассчитать и передать на сайт его координаты. В частности, при геолокации с помощью Gears появится окно с вопросом, разрешает ли пользователь сайту прибегнуть к функциональности Gears. При встроенной поддержке API геолокации в браузере окно будет выглядеть иначе (например, в Firefox 3.5, как вы уже видели, появляется информационная панель в верхней части страницы).

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

geo_position_js.getCurrentPosition(geo_success, geo_error);

Эта функция обратного вызова, обслуживающая ситуацию «успеха», принимает единственный аргумент — объект с информацией о местонахождении:

function geo_success(p) {
alert("Вы нашлись в точке с долготой " + p.coords.latitude +
" и широтой " + p.coords.longitude);
}

Если функция getCurrentPosition() не сумела установить координаты пользователя (из-за того что он отказался посылать их, или из-за какого-либо сбоя в API геолокации), то будет вызвана функция, переданная ей как второй аргумент. В данном примере функция обратного вызова, обслуживающая ситуацию «неудачи», называется geo_error:

geo_position_js.getCurrentPosition(geo_success, geo_error);

Она не принимает никаких аргументов:

function geo_error() {
alert("Вы не нашлись!");
}

Поддержки функции watchPosition() в geo.js пока нет. Чтобы постоянно следить за местонахождением пользователя, надо активным образом «опрашивать» его устройство, вызывая getCurrentPosition().

Рассмотрим пример

Изучим следующий пример использования geo.js для нахождения координат пользователя и вывода на экран карты местности, в которой он находится. При загрузке страницы надо вызвать geo_position_js.init(), чтобы выяснить, доступен ли хотя бы один интерфейс геолокации из тех, которые поддерживает geo.js. Если API доступен, то можно вывести ссылку, щелкнув на которой, пользователь сможет увидеть свое местоположение на карте. Переход по ссылке будет вызывать функцию lookup_location() следующего вида:

function lookup_location() {
geo_position_js.getCurrentPosition(show_map, show_map_error);
}

Если пользователь соглашается на пересылку данных, а геолокационному сервису удается установить его координаты, то geo.js запустит первую функцию обратного вызова — show_map() — с единственным аргументом loc. Свойство coords объекта loc содержит широту, долготу и сведения о точности измерений (в этом примере точность измерений не учитывается). Затем функция show_map() с помощью API Карты Google выводит на страницу карту с маркером:

function show_map(loc) {
$("#geo-wrapper").css({'width':'320px','height':'350px'});
var map = new GMap2(document.getElementById("geo-wrapper"));
var center = new GLatLng(loc.coords.latitude, loc.coords.longitude);

Для дальнейшего изучения

map.setCenter(center, 14);
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.addOverlay(new GMarker(center, {draggable: false, title: "Вы нашлись
приблизительно здесь"}));
}

Если geo.js не может определить местоположение пользователя, будет вызвана вторая функция обратного вызова — show_map_error():

function show_map_error() {
$("#live-geolocation").html('Вы не нашлись!');
}

Этот пост про geo.js написан при финансовой поддержке форекс блога.