Советы пользователям

Documentation
Login

Title: Место компьютера в реальном мире

Author: Виктор Вагнер

Распространяется по лицензии Createve Commons Attribution ShareAlike

geolocation API в браузерах

С развитием интернета все больше интернет-сервисов начинают интересоваться местоположением компьютера в физическом (а может даже и географическом) пространстве. Сайтам с прогнозом погоды надо знать прогноз на какую точку им выдавать, у них-то модель атмосферы внутри непрерывная, онлайн-магазинам — показывать ближайший пункт выдачи заказов или определять куда направлять курьеров, картографическим сервисам — по умолчанию показывать карту вокруг текущего местоположения пользователя.

Для этой цели был разработан geolocation API в браузере. Есть у Javascript-объекта navigator свойство geolocation, которое содержит объект, имеющий метод getCurrentPosition. Этот метод позволяет запросить текущие координаты. Там есть и ещё методы watchPosition и clearWatch, позволяющие установить и отменить отслеживание изменения позиции, но они интересны только для мобильных устройств, которые оборудованы GPS-приёмником. Мы же в данной статье хотим сосредоточиться на обычных компьютерах, стационарных или нотбуках, в большинстве своём GPS-приёмника не имеющих.

Метод getCurrentPosition, несмотря на своё название, координат не возвращает. Он получает в качестве параметра две функции-коллбэка success и error. Первая вызывается, когда удалось получить координаты, вторая, если не удалось. Это всё опять же рассчитано на модель применнения с GPS приёмником, которому бывает нужно заметное время для того, чтобы определить своё местоположение.

Коллбэк success получает объект GeoLocationPosition, который содержит два поля, coords и timestamp. Timestamp - это момент времени, когда были определены координаты. coords - объект GeolocationCoordinates, содержащий пять полей

  1. latitide - широта, в градусах и десятичных долях
  2. longitude - долгота, в тех же единицах
  3. accuracy - точность определения географически координат, в метрах
  4. altitude - высота над уровнем моря, в метрах
  5. altitudeAccuracy - точность определения высоты, в метрах
  6. speed - скорость движения, в метрах в секунду
  7. heading - направление движения (истинный курс), в градусах.

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

Как определяется местоположение

Каким образом компьютер, не оборудованный GPS-приёммником, может определить своё местоположение? Ну это зависит от того, с какой точностью. Если нам надо с точностью до страны, то можно просто посмотреть на IP-адрес и пор базе данных whois выяснить, провайдеру из какой страны этот блок адресов выглядит. Тонкость в том, что подавляющее большинство компьютеров сейчас расположены за NAT и имеют «серые» IP, поэтому надо не на самом компьютере смотреть, а сходить на какой-нибудь внешний сайт, который расскажет с какого адреса к нему пришли.

Этот метод имеет точность примерно до города или до региона. Например, попытка его использовать подключаясь через 4G сеть Мегафона в Тверской области, показывает Санкт-Петербург.

Другой способ, доступный компьютеру, это посмотреть какие SSID Wi-Fi имеются в радиусе слышимости, и обратиться к публичной базе данных Wi-Fi. Откуда берутся данные в этой базе? А некоторые устройства, оборудованные GPS, например, смартфоны, передают информацию о том какие SSID они видят из каких координат в Google или ещё кому-то.

Правда, последнее время Google не склонен раздавать эту информацию даром и требует указания API KEY при доступе к этой базе.

Здесь точность может быть порядка радиуса действия Wi-Fi, то есть десятки метров. Но велика и вероятность ошибки. Ведь существует огромное количество мобильных роутеров. Любой смартфон и даже некоторые кнопочные телефоны такими роутерами являются, а в продаже есть и специальные. Да и обычную точку доступа можно выключить, положить в порфель и увезти в другое место. А там включить с тем же SSID.

Почему-то в базе данных WiFi точек Google не предусмотрен интерфейс, с помощью которого человек может сказать «Я, системный администратор точки доступа такой-то, ответственно заявляю что по старым координатам она больше не находится». Не говоря уж об утверждении «Эта точка доступа мобильная и её координатам доверять не стоит».

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

К счастью, в мире Free Software это не совсем так. И в Linux существует возможность указать координаты компьютера в обычном текстовом файле, и сделать так чтобы все, кто запрашивает координаты, получали именно эти данные.

Как узнать свои координаты

Самый простой способ — взять устройство, которое GPS-приёмником оборудовано, положить рядом с компьютером и посмотреть что оно покажет. Практически все программы GPS-навигации для смартфона имеют опцию «поделиться местоположением», которая позволяет скопировать координаты в буфер обмена.

Но, допустим, ни одного устройства с GPS под рукой нет. Но вы ведь наверняка знаете обычный адрес того дома, где установлен ваш компьютер. Или адрес того помещения, где вы поставили свой ноутбук.

Существует множество сервисов, которые выполняют операцию geocoding — находят координаты по адресу. Или reverse geocoding — адрес по координатам.

Среди них есть свободный сервис nominatim, который выполняет поиск по созданной самими пользователями карте OpenStreetMap. АPI nominatim прекрасно понимает национальные языки, в частности русский, но требует указания адреса в английской традиции — сначала дом, потом улица, потом город, потом страна.

Возвращает он список объектов, и кроме собственно координат в этот список входит bounding box, то есть два значения широты и два — долготы, между которыми объект гарантировано умещается. Эти значения можно использовать для вычисления точности.

Если же вы не поленитесь и найдёте свой дом на онлайн-карте Google или Bing,Но, допустим, ни одного устройства с GPS под рукой нет. Но вы ведь наверняка знаете обычный адрес того дома, где установлен ваш компьютер. Или адрес того помещения, где вы поставили свой ноутбук.

Существует множество сервисов, которые выполняют операцию geocoding — находят координаты по адресу. Или reverse geocoding — адрес по координатам.

Среди них есть свободный сервис nominatim, который выполняет поиск по созданной самими пользователями карте OpenStreetMap. АPI nominatim прекрасно понимает национальные языки, в частности русский, но требует указания адреса в английской традиции — сначала дом, потом улица, потом город, потом страна.

Возвращает он список объектов, и кроме собственно координат в этот список входит bounding box, то есть два значения широты и два — долготы, между которыми объект гарантировано умещается. Эти значения можно использовать для вычисления точности.

Если же вы не поленитесь, и найдёте свой дом на онлайн-карте Google, Yandex или Bing, а потом переключитесь в режим космических снимков то можно определить свои координаты с точность до нескольких метров. Вы же знаете в какой части дома сидите.

Использование смартфона в качестве GPS

Сейчас у большинства людей есть смартфон со встроенным GPS-приёмником. Но смотреть карты или заказывать товары в онлайн-магазине удобнее на большом экране компьютера. Поэтому может возникнуть желание передать данные о координатах со смартфона на компьютер. На f-droid есть пара приложений, которые позволяют это сделать - GPSd Forwarder и gpsdRelay. На стороне Linux для приема этих данных надо использовать gpsd.

Сервис geoclue

За определеник координат в Linux отвечает бибилотека geoclue и соответсвующий сервис. Он работает от имени специального пользователя и отдаёт координаты через D-Bus API. При этом отдаёт не кому попало, а только тем процессам, которые авторизует специальный сервис-агент.

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

В составе Gnome есть агент который настраивается через систему настроек десктопа. Пользователи более простых графических сред обычно пользуются демо-агентом из сотава самой библиотеки geoclue, который авторизует всех подряд.

У библиотеки geoclue есть конфигурационный файл /etc/geoclue/geoclue.conf

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

Интересной особенностью описания источников является то, что если в соответствующей секции не написано enabled=false по умолчанию источник разрешён. Ман-страница geoclue(5) рекомендует отключить все источники если вы пользуетесь статическим файлом с координатами.

Поддерживаются следующие источники:

При использовании любого источника координат кроме статического файла, возможна довольно длительная задержка. Пока стартует и определится по спутникам GPS, пока система соберёт информацию об окружающих точках доступа WiFi или базовых станциях сотовой сети и получит ответ из сетевого сервиса. А вот статический файл, если правильно сконфигуирован, выдаёт ответ мгновенно.