Здравствуйте! Интересует следующий вопрос: возможно ли создать компонент для Joomla, который бы вел статистику посещения сайта пользователями, определяя их местоположение и формируя базу данных (дополняя сведения, например JoomlaStats), использую сервисы геопозиционирования: Яндекс.Локатор http://api.yandex.ru/locator/doc/dg/concepts/about.xml Google Location Services http://code.google.com/intl/ru-RU/apis/gears/api_geolocation.html Wi2Geo Javascript API http://b2b.wi2geo.ru/geolocator/docs/#API Существует модуль "Visitors Google Map lite" показывает местоположение по IP посетителя, если я не ошибаюсь, т.е. просто город. Таким же образом работает http://www.ip2location.com. Интересуют более точные данные. На сайте http://samy.pl/mapxss есть ссылка "test the Location Services by clicking here", при нажатии на которую в FireFox появляется сообщение: "samy.pl хочет знать ваше местоположение" с предложением выбрать: "Сообщить местоположение" и "Не сообщать", после чего на ноутбуке (модуль WiFi установлен в ноутбуке, но подключение к интернету через GSM модем, не через WiFi) показывает на карте местоположение, в моем случае с погрешностью метров 50. Также можно посмотреть на сайте: http://grigorkin.ru/2010/03/opredelenie-mestopolozheniya-s-pomoshhyu-brauzera Может ли компонент самостоятельно собирать MAC адреса точек WiFi для дальнейшей обработки через Яндекс.Локатор? Или для этого необходимо устанавливать программы на компьютер (так работают "Агент@mail.ru", "Geosense", "Badoo Desktop")? Заранее благодарю за ответы. Информация: "Сегодня мы запускаем для публичного тестирования новый API-сервис – Яндекс.Локатор. C помощью этого программного интерфейса можно определить координаты мобильного устройства или ноутбука по идентификаторам WiFi и GSM сетей, в зоне действия которых он находится..." http://clubs.ya.ru/company/replies.xml?item_no=34348 "Если вы согласитесь, Firefox соберёт информацию о ближайших точках беспроводного доступа и IP-адресе вашего компьютера. Затем Firefox отправит эту информацию провайдеру сервиса определения местоположения по умолчанию, а именно Google Location Services, чтобы определить ваше приблизительное местоположение. Эта информация о приблизительном местоположении отправляется на веб-сайт, пославший запрос..." http://www.mozilla.org/ru/firefox/geolocation/ "Если устройство является настольным компьютером, без использования беспроводных соединений, то для определения местоположения компьютера используется его IP адрес, но в этом случае данные будут неточные. Для определения местоположения ноутбука или другого устройства беспроводной связи, Opera может дополнительно отправить следующие данные из ближайшей точки доступа: * MAC-address (уникальный идентификатор оборудования) * уровень сигнала (показывает как далеко вы находитесь) База данных известных Wi-fi точек доступа в совместно с уровнем сигнала может дать достаточно точную информацию о вашем местоположении. Точность данного метода в значительной мере зависит от концентрации известных точек доступа. Если устройство подключено к сети мобильного оператора, то данные о местоположении могут включать себя ячейки IDS близлежащей к вам базовой станции и уровень сигнала. Если ваше устройство поддерживает GPS, то местоположение может быть опеределено при помощи GPS..." http://help.opera.com/Mac/11.01/ru/geolocation.html "Safari позволяет вам контролировать, как и кому отправляется информация о вашем местонахождении. При посещении сайта, который может использовать данные о вашем местонахождении, Safari спрашивает вас, хотите ли вы ими поделиться. Вы можете выбрать вариант, при котором настройки для этого веб-сайта сохранятся в Safari на один день, а теперь вы можете также разрешать веб-сайтам получать доступ к информации о вашем местонахождении без предварительного запроса. Кроме того, вы можете запретить право доступа, не получая запроса. На панели «Конфиденциальность» в настройках Safari вы можете выбрать способ доступа веб-сайтов к службам определения местоположения..." http://www.apple.com/ru/safari/features.html "И еще одно нововведение стало доступно в Internet Explorer 9, это определение местоположения пользователя. Уж не знаю, почему разработчики хотели эту возможность (я регулярно получал вопрос о данной фиче во время наших событий), но теперь Internet Explorer 9, используя ваше IP (и, возможно, информацию из сети WiFi), сможет определить Ваше местоположение, используя специальную службу от Microsoft..." http://baydachnyy.com/2011/02/13/internet-explorer-9-geolocation/ "Функция "Мое местоположение" повышает точность результатов поиска по адресам в Google , если такие сведения доступны. В браузере Internet Explorer 8 или более ранних версий функция "Мое местоположение" может отправлять сведения о вашем местоположении сторонним веб-сайтам при помощи API геопозиционирования W3C..." http://www.google.com/support/toolbar/bin/answer.py?hl=ru&answer=166104
Вот что на сегодняшний день мне удалось найти по данному вопросу. 1. Метод геолокации работает при условии наличия и включенном состоянии устройства WiFi, соединение с сетью (кабель, USB модем, WiFi и др.) роли не играет. Точность определения очень высокая. 2. Функцию navigator.geolocation поддерживают следующие браузеры: Firefox, Google Chrome, Opera, Safari, IE 9. Встроенная функция позволяет мониторить MAC адреса WiFi роутеров, окружающих пользователя. У браузеров наблюдается небольшое расхождение в определении координат. 3. При установленной надстройке AlterGeoBHO Class будет работать во всех версиях IE (проверял на IE 6). Что интересно при установке «Mail.ru Агента» данная надстройка устанавливается автоматически, а узел «mail.ru» попадает в список узлов, имеющих права узнавать местонахождение пользователя. При его удалении, через некоторое время он опять оказывается в этом списке. Имя: AlterGeoBHO Class Издатель: Wi2geo Ltd Файл: AlterGeo.BrowserPlugin.dll 4. Описание использования функции navigator.geolocation можно найти на странице http://www.webatron.ru/node/55. Также на этом сайте, внизу страницы, есть пример работы. 5. Здесь приведу 2 примера, которые удалось найти: 5.1. С использованием карты Yandex 5.2. С использованием карты Google 5.1. Карта Yandex (иконки во вложенных файлах: ) Код (html): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Пример использования Geolocation API.</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="http://api-maps.yandex.ru/1.1/index.xml?key=AEMny0oBAAAAeeGxdAIApTBC9_reFDuwOxQpW1QbchZVuHIAAAAAAAAAAAD-0tGSj63Z9DN8IB4s37CTKsmiWQ==" type="text/javascript"></script> <script type="text/javascript"> // Создание обработчика для события window.onLoad YMaps.jQuery(function () { // Создание экземпляра карты и его привязка к созданному контейнеру var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]); // Установка для карты ее центра и масштаба map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 1); var toolBar = new YMaps.ToolBar(); toolBar.add(new GeolocatorButton()); map.addControl(toolBar); }) // Реализует наследование прототипа без исполнения конструктора родителя // Подробнее о наследовании: http://javascript.ru/tutorial/object/inheritance function extend (child, parent) { var c = function () {}; c.prototype = parent.prototype; c.prototype.constructor = parent; return child.prototype = new c(); }; // Кнопка "Геолокатор" function GeolocatorButton (content, options) { // Переданный контент и параметры дополняем значениями по умолчанию this.content = YMaps.jQuery.extend({}, this.defaultContent, content); this.options = YMaps.jQuery.extend({}, this.defaultOptions, options); // Вызов родительского конструктора YMaps.ToolBarButton.call(this, this.content.normal); } var ptp = extend(GeolocatorButton, YMaps.ToolBarButton); // Содержимое кнопки по умолчанию ptp.defaultContent = { normal : { icon : 'wifi_icon.png', width : 20, hint : 'Определение координат с помощью Geolocation API' }, active : { icon : 'loader.gif', width : 20, hint : 'Идет обработка запроса...' } }; // Параметры кнопки по умолчанию ptp.defaultOptions = { notCentering : false, // Не центрировать карту noPlacemark : false, // Не ставить метку enableHighAccuracy : false, // Режим получения наиболее точных данных timeout : 10000, // Максиальное время ожидания ответа (в милисекундах) maximumAge : 1000, // Максимальное время жизни полученных данных style : { // Стиль для метки по умолчанию iconStyle : { href : "man.png", size : new YMaps.Point(27, 26), offset: new YMaps.Point(-10, -24) } } }; // Ошибки ptp.Errors = [ "permission denied", "position unavailable", "timeout" ]; // Вызывается при добавлении кнопки на карту ptp.onAddToToolBar = function (toolBar, parentContainer, group) { YMaps.ToolBarButton.prototype.onAddToToolBar.call(this, toolBar, parentContainer, group); // Указатель на карту this.map = toolBar.getMap(); // Проверка поддерживает ли браузер Geolocation API if (navigator.geolocation) { this.geolocation = navigator.geolocation; this.listener = YMaps.Events.observe(this, this.Events.Click, this.getPosition, this); } else { this.hide(); } }; // Вызывается при удалении кнопки с карты ptp.onRemoveFromToolBar = function () { YMaps.ToolBarButton.prototype.onRemoveFromToolBar.call(this); this.listener.cleanup(); if (this.placemark) { this.map.removeOverlay(this.placemark()); this.placemark = null; } this.listener = this.geolocation = this.content = this.options = this.map = null; }; // Получает местоположение пользователя ptp.getPosition = function () { var _this = this; // Смена внешнего вида кнопки this.setContent(this.content.active); // Запрашиваем текущие координаты местоположения this.geolocation.getCurrentPosition( // Успешное завершение определения координат function (position) { var coords = position.coords, point = new YMaps.GeoPoint(coords.longitude, coords.latitude); _this.setContent(_this.content.normal); // Смена центра карты if (!_this.options.notCentering) { _this.map.setCenter(point, 15); } // Установка метки if (!_this.options.noPlacemark) { if (!_this.placemark) { _this.placemark = new YMaps.Placemark(point, {style : _this.options.style} ); _this.map.addOverlay(_this.placemark); } else { _this.placemark.setGeoPoint(point); } _this.placemark.setBalloonContent(point.toString()); } // Событие успешнего завершения YMaps.Events.notify(_this, "GeolocationLoad", point); }, // Вызывается, если во время определения координат произошли ошибки function (error) { _this.setContent(_this.content.normal); alert("Во время выполнения произошла ошибка: " + _this.Errors[error.code - 1]); }, this.options ); }; </script> </head> <body> <div id="YMapsID" style="width:600px;height:400px"></div> </body> </html> 5.2. Карта Google Код (html): <html><head><title>Геолокация</title> <script src="http://www.google.com/jsapi?key=ABQIAAAAE832vXBnYzPJQygTlSp3lRT1HRZhlcqU_c8GpWgFFmzOYQpfPBQpN_lj_MffQ2zwIrSjyHYTFGq1NQ" type="text/javascript"></script> <script type="text/javascript"> google.load("jquery", "1.3.2"); google.load("maps", "2.x"); </script> <script type="text/javascript"> // <![CDATA[ var map = null; var overlay = null; var geo = null; function st() { var g = { initialize: function() { map = new GMap2(document.getElementById("map")); map.setCenter(new GLatLng(34.1072998047,-118.371902466), 10); map.addControl(new GSmallMapControl()); map.addControl(new GMapTypeControl()); }, getCircleOverlay: function(lat, lon, err) { with (Math) { var points = Array(); var d = err/6378800;// accuracy / meters of Earth radius = radians var lat1 = (PI/180)* lat; // radians var lng1 = (PI/180)* lon; // radians for (var a = 0 ; a < 361 ; a+=10 ) { var tc = (PI/180)*a; var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc)); var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y)); var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI))); points.push(point); } } return new GPolygon(points,'#0000ff',1,1,'#0000ff',0.2) }, zoomLevel: function(a, step) { step++; map.setCenter(new GLatLng(a.coords.latitude, a.coords.longitude), step); if (step > 14) return; window.setTimeout(function() { geo.zoomLevel(a, step) }, 250); }, setMap: function(a) { var zoomLevel = 14; if (a.coords.accuracy > 500) zoomLevel = 10; map.setCenter(new GLatLng(a.coords.latitude, a.coords.longitude), zoomLevel); // if (overlay) map.removerOverlay(overlay); overlay = geo.getCircleOverlay(a.coords.latitude, a.coords.longitude, a.coords.accuracy); map.addOverlay(overlay); $('#js-return').innerHTML = ''; $('#js-return').html('<h2>'+map.getCenter()+'</h2>'); }, setMap2: function(lat, lon, acc) { var zoomLevel = 15; if (acc> 500) zoomLevel = 10; map.setCenter(new GLatLng(lat, lon), zoomLevel); //if (overlay) map.removerOverlay(overlay); overlay = geo.getCircleOverlay(lat, lon, acc); map.addOverlay(overlay); $('#js-return').innerHTML = ''; $('#js-return').html('<h2>'+map.getCenter()+'</h2>'); }, handleError: function(a) { }, locateMeOnMap: function() { navigator.geolocation.getCurrentPosition(this.setMap, this.handleError); } } return g; } geo = st(); $(document).ready(function() { geo.initialize(); geo.setMap2(0, 0, 0); }); // ]]> </script> </head> <body> <a href="#" onclick="geo=st();geo.locateMeOnMap();return false;">Определить местоположение</a>. <div id="js-return"></div> <div id="js"> <div id="geo"> <div id="map" style="position:absolute;width:500px;height:400px;"></div> </div> </div> <script type="text/javascript"> var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); </script> <script type="text/javascript"> try { var pageTracker = _gat._getTracker("UA-6127617-2"); pageTracker._trackPageview(); } catch(err) {}</script> </body> </html>
При доработке, следующий пример, возможно, пригодится для автоматического заполнения формы адреса доставки для интернет магазинов. http://davidwalsh.name/dw-content/geolocation.php