JavaScript GeoLocation

Для многих остается секретом, что с помощью js можно получить информацию о геолокэйшене пользователя.

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

Сегодня я расскажу о библиотеке, которая объединяет в себе разные средства и упрощает работу с определением геопозиции.

Начну без кода. Кому это надо?

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

Но лучше посмотреть на эту функцию не только с точки зрения социальных радостей.

Лучше всего, чтобы определение геопозиции использовалось в сайтах, предлагающих доставку товаров.

Представьте себе замечательный сайт с пиццой. Пусть у пиццы есть замечательная мобильная версия. Как приятно будет обнаружить, что сайт уже в курсе, куда надо доставлять пиццу, согласитесь?

Итак, к делу. Будем использовать — javascript geolocation framework. Это инструмент, который, как я уже сказал, определяет возможность браузера поделиться геолокэйшеном.

Работает предельно просто:

 //Определяет, есть ли возможность получить информацию о геопозиции
 if(geo_position_js.init()){
 geo_position_js.getCurrentPosition(success_callback,error_callback);
 }
 else{
 alert("Информация о геопозиции недоступна");
 }

После того, как пользователь подтведит, что хочет поделиться информацией о своем местоположении, мы сможем воспользовать этой информацией.

Поддерживаемые платформы:

  • iPhone OS 3.x,
  • Browsers with Google Gears support (Android, Windows Mobile)
  • Blackberry Devices (8820, 9000,...)
  • Nokia Web Run-Time (Nokia N97,...)
  • webOS Application Platform (Palm Pre)
  • Torch Mobile Iris Browser
  • Mozilla Geode

 

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

 

  • Firefox - поддерживает геопозицию с версии 3.5
  • Opera - геолокейшен не поддерживается, но ходят слухи, что можно скачать билд оперы с поддержкой этой функции
  • Google Chrome - поддерживает геолокейшен, используя Google Gears
  • Safari - десктопная версия сафари не поддерживает геолокейшен, но на мобильной версии работает превосходно
  • IE - нет

Реализация и проверка работы

Я сделал небольшую страничку, на которой можно все проверить.

HTML и JS

<html>
<head>
    <meta name="viewport" content="width = device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;">
    <script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script src="http://code.google.com/apis/gears/gears_init.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/geo.js" type="text/javascript" charset="utf-8"></script>
    <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAgpm_fKKGJMknBmvrDF4s3BRNsT4fNyt1d9r1Bb9U2Gew07vUkBS5hWzE51wgj_4ognZgLIHGpRqcRg&sensor=false"
        type="text/javascript"></script>
    <script>
        var latlng;var map;
        if (geo_position_js.init()) {
            geo_position_js.getCurrentPosition(success_callback, error_callback, { enableHighAccuracy: true });
        }
        else {
            alert("Functionality not available");
        }

        function success_callback(p) {
        
            initialize_map(p.coords.latitude,p.coords.longitude);
        }

        function error_callback(p) {
            alert('error=' + p.message);
        }

        function initialize_map(latitude, longitude) {
            $('#Coords').text(latitude + ',' + longitude);
            $(window).resize(function() {
                map.setCenter(latlng, 15);
            });
            if (GBrowserIsCompatible()) {
                map = new GMap2(document.getElementById("map_canvas"));
                latlng = new GLatLng(latitude, longitude);
                map.setCenter(latlng, 15);
                map.addOverlay(new GMarker(latlng));
            }
        }
 
    </script>

</head>
<body style="margin: 0; padding: 0;" onload="initialize()" onunload="GUnload()">
    <div id="Coords" style="position: absolute; left: 0; top: 0; background: #fff; padding: 1px 4px; z-index: 3333"></div>
    <div id="map_canvas" style="width: 100%; height: 100%">
    </div>
</body>

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

Вот что мы увидим если зайдем на страничку с демо. На десктопе я смотрел в Хромиуме и Фаерфоксе - результат определения координад одинаков и неточен.

Я думаю, что все все поняли. Поленился менять интерфейс на русский. Соглашаемся.

В верхнем левом углу я показываю определившиеся координаты. То же самое на айПоде:

 В результате видим полноразмерную карту с возможностью масшабирования мультитачем. Красота.

Замечу, что геопозиция определилась по-разному на айподе и в десктопных браузерах, несмотря на то, что они работают через один и тот же роутер. Сафари на айподе показал очень точные координаты. Гораздо точнее чем те, которые определились через GPS на Андройде (HTC Hero).

Если вы хотите запустить пример у себя на локали, то не забудьте поменять ключ Google Maps, иначе карты не заработают.

Функцию геокоординат, я добавил в свой Beloded Twitter Client.

Других подобных твиттер-клиентов, работающих через браузер я не нашел.




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка