Геолокация, несомненно, является одной из самых полезных функций смартфонов, и большое внимание уделяется нативным приложениям, которые используют ее в своих интересах. Менее ценится тот факт, что теперь возможно создавать веб-приложения и сайты с возможностями геолокации. Спецификация W3C Geolocation API предлагает стандарт для доступа к службам определения местоположения в браузере через Javascript. Спецификация является недавней, но уже широко поддерживается современными браузерами. Сейчас самое подходящее время подумать о том, как мобильный сайт, учитывающий местоположение, может принести пользу вашим пользователям.
Текущая поддержка браузера для W3C Geolocation API
- iPhone 3.0 +
- Android 2.0 +
- Firefox 3.5
- Safari 5.0
- Chrome 5.0
- Internet Explorer 9.0+
Как браузер находит вас
В геолокации используется ряд методов. Ваш браузер может просто найти ваш IP-адрес или узнать у Google местоположение ближайшей точки доступа Wi-Fi. Настольный браузер, не имеющий доступа к GPS, прибегнет к одному из этих методов, и они не очень точны. Chrome пропустил мое текущее местоположение примерно на 15 км, но этого достаточно, чтобы сказать, что я в Мельбурне, Австралия.
Ваш телефон имеет доступ к более качественной информации. Он может получить доступ к расположению вышек сотовой связи, с которыми он разговаривает, и сделать разумный удар по вашему фактическому местоположению. И последнее, но не менее важное: телефон активирует свое GPS-оборудование, которое может определить вас с точностью до нескольких метров. Чип GPS потребляет значительную мощность от аккумулятора телефона, поэтому будьте внимательны: если такой уровень точности не требуется, не используйте его.
Как и в случае с собственными приложениями, разрешение для браузера использовать ваше местоположение всегда разрешено. Пользователи получат запрос на доступ к своему местоположению и могут сбросить разрешения в любое время через настройки своего браузера. Задача состоит в том, чтобы пользователи доверяли вам использовать свое местоположение ответственно, и чтобы ваш сайт предлагал ценность с доступом к данным о местоположении или без них.
Код
Если геолокация поддерживается, будет доступен глобальный объект navigator.geolocation
if ( navigator.geolocation )
{
navigator.geolocation.getCurrentPosition(handlePosition);
}
getCurrentPosition
function handlePosition(pos)
{
alert("Your location is: " + pos.coords.latitude + ', ' + pos.coords.longitude);
}
Попытайся:
Объект позиции должен иметь следующие свойства:
- координаты широты в градусах.
- координаты долготы в градусах.
- Координаты. Точность приблизительная, в метрах.
- Координаты в градусах с севера (0… 360).
- скоординированная скорость в метрах в секунду.
- координаты высоты в метрах над уровнем моря ( приблизительно — я бы на это не рассчитывал!).
- Координаты высоты Точность в метрах.
- отметка времени объекта DOMTimeStamp.
Есть большая вероятность, что многие из них будут nullcoords.latitudecoords.longitude
Существует также ряд причин, по которым getCurrentPosition Второй обратный вызов может быть указан для обработки ошибок:
if ( navigator.geolocation )
{
navigator.geolocation.getCurrentPosition(handlePosition, handleError);
}
function handleError(error)
{
switch (error.code)
{
case error.PERMISSION_DENIED:
// User denied access to location. Perhaps redirect to alternate content?
alert('Permission was denied');
break;
case error.POSITION_UNAVAILABLE:
alert('Position is currently unavailable.');
break;
case error.PERMISSION_DENIED_TIMEOUT:
alert('User took to long to grant/deny permission.');
break;
case error.UNKNOWN_ERROR:
alert('An unknown error occurred.')
break;
}
}
Ваше веб-приложение должно корректно обрабатывать все случаи. Если пользователь отказывается поделиться своим местоположением, подумайте о предложении альтернативного контента или функций, которые не зависят от геолокации. Дальнейшее рассмотрение может быть уделено вашим пользователям с параметрами, переданными getCurrentPosition
options = {
enableHighAccuracy: false,
timeout: 30000, // milliseconds (30 seconds)
maximumAge: 600000 // milliseconds (10 minutes)
}
navigator.geolocation.getCurrentPosition(handlePosition, handleError, options);
enableHighAccuracy — это, по сути, подсказка, что вам нужны данные GPS (а не менее точные методы, такие как триангуляция вышек сотовой связи). Как упомянуто выше, GPS разряжает батарею телефона и не всегда требуется — установите это в false
Тайм-аут указывает, как долго вы готовы ждать результатов определения местоположения.
MaximumAge сообщает браузеру, что вы готовы принять результат из, например, последних 10 минут. Если телефон выполнил поиск местоположения в это время (возможно, для другого сайта / приложения), он вернет кэшированный результат. Опять же, это способ быть добрым к времени автономной работы телефона.
Что если вам нужны самые свежие данные о местоположении, которые обновляются при перемещении пользователя? Вы можете использовать watchPosition
if ( navigator.geolocation )
{
navigator.geolocation.watchPosition(handlePosition, handleError, {
enabledHighAccuracy: true,
maximumAge: 60000
});
}
function handlePosition(pos)
{
console.log("Heading: " + pos.coords.heading);
console.log("Speed: " + pos.coords.speed);
}
В большинстве случаев такой уровень точности не требуется. При наличии актуальных проблем конфиденциальности в отношении использования данных о местоположении важно получать доступ только к той информации, которая вам нужна, и использовать ее ответственно. Несколько простых рекомендаций:
- Подумайте о ценности, которую вы предоставляете своим пользователям в обмен на их местоположение — не просто собирайте данные ради этого!
- Будьте добры к батареям телефона — используйте
enableHighAccuracy: false - Если вы храните данные о местоположении, сделайте это на своем веб-сайте (а также в условиях и положениях вашего сайта).
Карты Гугл
Теперь мы рассмотрели основы геолокации и посмотрим, как они вписываются в карты Google. Поддержка карт может быть добавлена в ваше веб-приложение с помощью:
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>
Параметр sensor Для мобильных приложений это должно быть установлено в true. Мы можем дополнительно адаптировать нашу карту с помощью некоторого определения пользовательского агента — этот фрагмент даст пользователям Android и iPhone полноэкранную карту:
function detectBrowser()
{
var userAgent = navigator.userAgent;
var mapDiv = document.getElementById("map");
if (userAgent.indexOf('iPhone') != -1 || userAgent.indexOf('Android') != -1 )
{
mapDiv.style.width = '100%';
mapDiv.style.height = '100%';
}
else
{
mapDiv.style.width = '600px';
mapDiv.style.height = '800px';
}
}
айфоны также обращают внимание на тег. Это отключает масштабирование страницы, так что масштабирование будет применяться только к карте.
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
Теперь для настройки самой карты:
var map = new google.maps.Map(document.getElementById("map"), {
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
Это все, что нужно сделать. См. Руководство по разработке карт Google для полного набора параметров конфигурации карты. Теперь мы можем обновить нашу функцию handlePosition
function handlePosition(pos)
{
// Google maps use a different location object (LatLng) which we can convert to easily:
latlng = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
// Center the map on the current location.
map.setCenter(latlng);
// Drop a marker on the current location
marker = new google.maps.Marker
({
map: map,
draggable: false,
animation: google.maps.Animation.DROP,
position: latlng
});
}
Пример карт
Отображение пользователю его текущего местоположения — не самое полезное приложение, но с Geolocation API и картами Google в вашем распоряжении, у вас есть отличный набор инструментов для создания веб-приложений на основе определения местоположения. Задача состоит в том, чтобы сделать что-то интересное! Счастливого геолокации.
Некоторое дальнейшее чтение:
- W3C Geolocation API Спецификация
- API Google Map Javascript
- Погружение в HTML5 — геолокация
- Modernizr — легкое обнаружение поддержки геолокации.
- Geo.js — структура геолокации.