Html5, геолокація
Принцип роботи геолокації
Можливість геолокації викликає чимало запитань у людей, яких зазвичай не можна назвати параноїками. Наприклад, яким чином може якесь програмне забезпечення знати, що я не хворію, як я сказав своєму начальнику, а дивлюся футбол в кафе? У ньому що, є якийсь прихований код, який відстежує всі мої дії? Цікаво, що це за фургон там на вулиці і ті люди, які прикидаються, ніби-то вони змінюють колесо?
На щастя, можливість геолокації не з розряду страшилок про стеження. Це тому, що навіть якщо браузер може обчислити ваше місцезнаходження, він не повідомить його веб-сайту без вашого явного на те дозволу:

Веб-сторінка хоче отримати дані про місцезнаходження користувача. Відвідувач може дозволити надавати ці дані або ж не надавати їх. Така поведінка браузера Chrome не є власною ініціативою його розробників, а офіційним правилом стандарту геолокації, які вимагають, щоб кожен веб-сайт, який намагається отримати дані про місцезнаходження користувача, отримав для цього його дозвіл.
Щоб обчислити місцеположення користувача, браузер заручається допомогою постачальника послуг позиціонування (location provider). наприклад, для Chrome це сервіс Google Location Services. Позиціонування є завданням не з легких, і постачальник застосовує кілька різних підходів для її вирішення.
Проте часто навіть такі неточні результати є корисними. Наприклад, якщо ви використовуєте засіб геолокації, щоб знайти магазин, який продає піцу на винос, ви можете швидко перейти в район, який вас дійсно цікавить - поблизу вашого будинку - навіть якщо ви перебуваєте не зовсім поруч.
Нарешті, багато мобільні пристрої оснащені спеціальними апаратними засобами GPS (Global Positioning Service - глобальна система навігації та визначення положення). що дозволяє визначати місце розташування таких пристроїв з точністю всього лише до кількох метрів. Але цей метод геолокації має свій недолік - він повільніше і споживає більше енергії, що важливо для пристроїв, що працюють на акумуляторах. Крім цього, він не особливо добре працює в містах з великими і високими будинками через відображення сигналу від будівель.
Звичайно ж, можливі й інші способи визначення місця розташування. Ніщо не перешкоджає постачальнику розташування використовувати для цього інші джерела інформації, такі як дані від RFID-пристроїв (Radio Frequency Identification - радіочастотна ідентифікація), дані від пристроїв Bluetooth, файли cookies з інформацією від картографічного сайту на зразок Google Maps і т.п.
У яких сферах застосовувати геолокацію?
Відповівши на велике питання, як працює геолокація, нам потрібно розібратися ще з одним: Яка нам від неї користь?
Тут ключовим аспектом, який потрібно розуміти, є те, що функціональність геолокації дозволяє визначити приблизні географічні координати відвідувача сторінки. І це все. Веб-розробник повинен об'єднати цю просту, але важливу інформацію з більш докладними даними про місцезнаходження користувача. Ці дані можна отримати з веб-сервера (зазвичай з величезною серверної бази даних) або будь-якої географічної веб-служби (скажімо, Google Maps).
Наприклад, для великого підприємства, що має філії в декількох точках, може знадобитися порівняти розташування відвідувача веб-сторінки з місцем розташування своїх різних філій, щоб визначити найближчий до відвідувача.
Хоча картографічні та географічні послуги, що надаються іншими компаніями, досить великі, ми розглянемо одну з них - Google Maps - трохи пізніше.
Визначення координат відвідувача
Можливість геолокації гранично проста. Вона складається з трьох методів об'єкта navigator.geolocation. getCurrentPosition (), watchPosition () і clearWatch ().
Для отримання місця розташування користувача викликається метод getCurrentPosition (). Але слід розуміти, що процес визначення місця розташування займає певний час, протягом якого ніякої поважаючий себе браузер не зупинить всю діяльність на сторінці, поки очікує ці дані. Тому метод getCurrentPosition () виповнюється асинхронно, тобто після його запуску продовжується виконання наступного за ним коду. Коли визначення місця розташування завершиться, для обробки результатів активується інший фрагмент коду.
Нижче наведено приклад виклику цього методу:
При виконанні цей код викликає метод getCurrentPosition () і передає йому функцію. Коли браузер завершить процес визначення місця розташування, він активує цю функцію, яка виводить вікно повідомлення:

Не забувайте: використання геолокації допустимо тільки в тому випадку, якщо браузер підтримує цю можливість і відвідувач дозволить її застосування. Також розумно протестувати сторінку, яка застосовує цю можливість, перш ніж розміщувати її на веб-сервері для практичного застосування. В іншому випадку можуть виникнути проблеми (наприклад, не буде функціонувати обробка помилок геолокації), і деякі браузери взагалі не зможуть визначити місце розташування користувача.
Визначення точності наданого місця розташування
При успішному виконанні методу getCurrentPosition () код отримує об'єкт position. який має дві властивості: timestamp (містить час виконання геолокації) і coords (містить географічні координати).
Але властивість coords в свою чергу є подоб'екти об'єкта position і крім властивостей latitude і longitude. що визначають географічні координати користувача, має ще кілька інших властивостей, які надають додаткову інформацію про місцезнаходження. Це такі властивості, як altitude (висота над рівнем моря), heading (напрямок руху) і speed (швидкість). Але на даний момент ці властивості не підтримуються жодним браузером.
Більш цікавим є властивість accuracy. яке вказує точність певного місця розташування в метрах. (Це означає, що в міру зниження точності даних місцеположення значення властивості accuracy зростає, що може дещо збивати з пантелику.) Наприклад, значення властивості accuracy, рівне 2135 метрам, означає, що місце розташування користувача було визначено в межах цієї відстані.
Властивість accuracy корисно для визначення якості результатів геолокації. Наприклад, якщо значення властивості accuracy вимірюється десятками кілометрів, дані геолокації навряд чи мають будь-яку практичну цінність:
У такому випадку, можливо, розумно сповістити користувача про невизначених даних його розташування і / або запропонувати йому ввести правильну інформацію самому.
Обробка помилок
Функціональність геолокації не спрацьовує, якщо відвідувач відмовляється дати дозвіл на її застосування. У такому випадку функція завершення в нашому прикладі не викликається і сторінка не буде знати, чи то браузер все ще намагається визначити місце розташування або ж сталася помилка у виконанні коду.
Для вирішення цієї проблеми при виклику методу getCurrentPosition () йому потрібно передавати не одну функцію, а дві. Перша функція, як ми вже розглянули, викликається в разі успішного завершення процесу геолокації. В іншому ж випадку викликається друга функція. Нижче наведено приклад з використанням цих двох функцій:
При виконанні функції помилки геолокації браузер передає їй об'єкт помилки, який має дві властивості: code (містить числовий код, який вказує один з чотирьох типів помилки) і message (містить короткий повідомлення про проблему). Зазвичай повідомлення призначене для тестування, а код помилки використовується кодом функції для визначення, яким чином вирішувати цю проблему.
Модифікована функція помилки, яка перевіряє всі можливі значення коду помилки, виглядає так:
Установка параметрів геолокації
Отже, ми розглянули, як викликати метод getCurrentPosition () з двома параметрами: функцією для обробки успіху геолокації і функцією для обробки помилки при спробі її виконання. Але цього методу можна передавати ще один параметр, яким є об'єкт, який встановлює певні параметри геолокації.
В даний час можна встановити три параметра, кожен з яких відповідає окремому властивості об'єкта параметрів геолокації. У наступному прикладі встановлюється один параметр enableHighAccuracy:
А в цьому прикладі встановлюються всі три параметри:
Що ж означають ці властивості? Властивість enableHighAccuracy задіє високоточне позиціонування, використовуючи систему GPS (якщо пристрій підтримує цю можливість і відвідувач дозволив її використання). Не встановлюйте цей параметр, якщо тільки вам не потрібно отримати точні координати, тому що її застосування сильно підвищує витрата заряду акумулятора пристрою браузера. За замовчуванням властивості enableHighAccuracy присвоюється значення false.
Властивість timeout визначає період часу, протягом якого сторінка буде очікувати отримання даних геолокації, перш ніж вважати спробу невдалої.
Значення timeout встановлюється в мілісекундах, тобто 10 000 мс означає максимальне очікування 10 с. Відлік починається після того, як користувач погодиться надати дані геолокації. За замовчуванням властивості timeout присвоюється 0, що означає, що сторінка буде очікувати результати геолокації нескінченно, не активізуючи помилку тайм-ауту.
Властивість maximumAge дозволяє кешування даних про місцезнаходження. Наприклад, значення maximumAge, рівне 60 000 мс, дозволяє користуватися даними геолокації, отриманими хвилину назад. Це дозволяє заощадити час і обчислювальні ресурси, а також означає, що результати геолокації будуть менш точними, якщо відвідувач переміщається. За замовчуванням властивості maximumAge присвоюється 0, що означає, що кешированниє результати геолокації ніколи не використовуються. Властивості можна також привласнити спеціальне значення infinity, в цьому випадку будуть використовуватися кешированниє дані геолокації будь-якої давнини.
відображення карти
Визначення географічних координат місця розташування користувача веб-сайту - звичайно ж, цікавий трюк. Але він швидко втрачає свою привабливість, якщо ми не знайдемо цієї інформації будь-яке корисне застосування. За цим діло не стане, тому що в інтернеті є цілі розсипи даних географічного розташування. (Часто проблемою є перетворення цієї інформації в формат, корисний для веб-додатки.)
Крім того, існує кілька картографічних сервісів, незаперечним лідером яких є Google Maps. Надійні оцінки звернень до цієї служби дають підстави вважати, що Google Maps є найбільш використовуваним веб-додатком для будь-яких цілей.
Використовуючи Google Maps, можна створити карту будь-якого розміру будь-якій частині світу. Можна керувати взаємодією відвідувачів з цією картою, генерувати маршрути для проїзду з однієї точки в іншу і, що найбільш корисно, накладати на цю карту свою інформацію.
На малюнку нижче показана модифікована версія сторінки геолокації. Тут отримані географічні координати користувача служать для відображення його розташування на карті:

Далі нам буде потрібен елемент
Розмір карти можна визначити за допомогою правила таблиці стилів:
Тепер все готово до використання функциональностей, що надаються Google Maps. Насамперед потрібно створити поверхню карти. У цьому прикладі карта створюється при завантаженні сторінки, щоб її можна було використовувати у функціях успіху або помилки геолокації. (Зрештою, помилка геолокації означає всього лише те, що сторінка не може визначити поточне місце розташування користувача. В такому випадку все одно має сенс відображати карту, але тільки центрировать її відносно точки з координатами за замовчуванням.)
Далі наведено код, виконуваний при завантаженні сторінки. Спочатку він створює карту, а потім намагається визначити місце розташування користувача:
Але створена цим кодом карта ще не відображається на сторінці, тому що ще не встановлена географічна позиція. Для цього потрібно створити специфічну глобальну точку, використовуючи об'єкт LatLng. яка потім поміщається на карту за допомогою методу setCenter () карти. Далі наведено код, який виконує всі ці дії для координат відвідувача:
Цього коду буде досить для відображення карти на зразок показаної на малюнку вище. Але до цієї базової карті можна додати різні примочки, наприклад відображення інших місць в урізанні або ж спливаюче інформаційне вікно. Останнє створюється за допомогою об'єкта infoWindow. Далі наведено код для створення і відображення спливаючого інформаційного вікна (як на малюнку вище):
Нарешті, в разі помилки геолокації або відсутності її підтримки в браузері відвідувача можна виконати, по суті, ті ж дії, але використовуючи альтернативні встановлені координати замість координат відвідувача:
Відстеження переміщень відвідувача
У всіх розглянутих нами досі прикладах ми використовували метод getCurrentPosition (), який є ключовою функціональністю геолокації. Але об'єкт geolocation має ще два інших методу, які дозволяють відслідковувати переміщення користувача і сповіщати сторінку про ці переміщеннях.
Першим з цих методів є метод watchPosition () який в значній мірі схожий на метод getCurrentPosition (). Подібно до методу getCurrentPosition (), метод watchPosition () приймає параметри: функцію успіху (єдиний обов'язковий параметр) і функцію помилки:
Різниця між цими двома методами полягає в тому, що метод watchPosition () може активувати функцію успіху неодноразово - з визначення місця розташування в перший раз, а потім кожен раз, коли він виявляє нове місце розташування. Для настільних комп'ютерів, які ніколи не переміщаються, методи getCurrentPosition () і watchPosition () мають абсолютно однаковий ефект.
Але на відміну від методу getCurrentPosition () метод watchPosition () повертає число. Це число можна зберегти і передати методу clearWatch (), щоб припинити відстежувати переміщення:
Цей крок можна не виконувати і продовжувати отримувати повідомлення про переміщення до тих пір, поки відвідувач не покине сторінку.