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

WARNING

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

INTRO

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

Юзкейс 1. «Я тебя вычислю по IP»

Допустим, в твоем блоге завелся тролль, который регулярно оставляет грубые комменты. Если ты собираешь инфу о посетителях Яндекс.Локатором, то без труда выяснишь, что этот кто-то находится на восточном конце улицы Ленина, в котором как раз живет один неприятный тип из твоего универа. И если повезет, то, сделав запрос к Vkontakte API, ты найдешь его последнюю фотку.

Юзкейс 2. Геомаркетинг

Яндекс.Директ уже давно применяет прицельный геотаргетинг для своих объявлений. Объявление «Сеть пиццерий в Москве» сознание игнорирует. А мимо ссылки «Пицца Рочдельская улица дом 14» (через дорогу от тебя) пройти практически невозможно.
Ты можешь использовать геоданные для продвижения товаров и услуг. Если человек в данный момент ощущает на себе действие пониженного атмосферного давления, то есть вероятность, что ему захочется купить таблетки для поднятия жизненного тонуса.

Юзкейс 3. Веселый функционал

Здесь огромный простор для творчества. Ставим на сайт «ночную» тему оформления после того, как у юзера заходит солнце. Показываем ему последние селфи девушек, сделанные в 10 км от него. По климату и глубине водоемов определяем, какая рыба водится в округе. Вариантов масса.

Юзкейс 4. «Научные» исследования аудитории

Результаты анонимного онлайн-опроса могут оказаться существенно полезнее, если в дополнение к ответам отмечать географическое положение респондентов.

Интересно? Тогда вперед.

 

Получение координат

GPS-данные можно получить с помощью JavaScript и HTML5 Geolocation API. Но учти: узнать точное местоположение пользователя можно только с его согласия. Он должен выразить его, ответив утвердительно на вопрос всплывающего окна, разрешить ли текущему сайту узнать его местоположение.

Пример кода на нативном JS:

// Кладем в переменную адрес <div> для вывода текста
var posText = document.getElementById("positionText");
function getLocation() {
  if (navigator.geolocation) {
  // Если пользователь разрешил, определяем его местоположение и обрабатываем полученное значение с помощью функции ShowPosition
    navigator.geolocation.getCurrentPosition(showPosition);
  } else {
    // Если нет, выводим сообщение об ошибке
    posText.innerHTML = "Этот браузер не может определять местоположение";
  }
}
function showPosition(position) {
 // Выводим широту и долготу на страницу
  posText.innerHTML = "Широта: " + position.coords.latitude + 
  "<br>Долгота: " + position.coords.longitude; 
}

Работать с GPS-данными можно не только на JS. У большинства языков имеются инструменты для их получения и обработки:

Яндекс.Локатор

Если пользователь не хочет добровольно делиться GPS-инфой, то еще не все потеряно. Есть крутой инструмент Яндекс.Локатор. Средняя точность определения составляет 300 м. Он вычисляет, где находится человек, по следующей информации:

  • сигналам сети мобильной связи;
  • сигналам сетей доступа Wi-Fi;
  • IP-адресу мобильного устройства.

Внедряется в проект в разы сложнее, чем HTML5 Geolocation API. Перед отправкой запроса к Яндекс.Локатор API сайт или мобильное приложение должно получить access key и выяснить много подробностей о пользователе. Если посетитель сидит в инете через мобильную связь, то надо знать ID сотовой ячейки и силу сигнала, если через Wi-Fi — силу сигнала и MAC-адрес точки доступа.

За точными инструкциями отсылаем тебя к руководству разработчика.

Exif-данные фотографий

Найти GPS-координаты можно и в метаданных снимков, сделанных цифровой камерой. Информацию о фотках можно читать без согласия пользователя. Надо только заставить его их загрузить. Дальше на помощь приходит библиотека exif-js или серверные инструменты для чтения exif-data:

  • в PHP есть встроенная функция read_exif_data();
  • для Ruby есть библиотека exifr;
  • у Python есть Package ExifRead 2.0;
  • для С++ — easyexif.

База GeoIP

Можно попробовать найти IP-адрес пользователя в базе GeoIP, но это чистой воды хиромантия. Дорогая и устаревшая. По моему опыту, эта база полна неточностей и доверять ей нельзя. Да и процент использующих VPN довольно значителен.

Составляем досье

Получив в руки географические координаты, приступим к сбору информации. Для каждого пункта будем делать запрос с параметрами к одному из API и парсить возвращаемый XML/JSON-ответ.

Для начала узнаем адрес пользователя с точностью до улицы.

 

Узнаем адрес пользователя

Это можно сделать Яндекс.Геокодером (с ним можно работать без предварительной OAuth-авторизации).

Синтаксис запроса:

http://geocode-maps.yandex.ru/1.x/?geocode=36.3630,56.0000

Все просто. Запросу передается два параметра: широта (56.0000) и долгота (36.3630).

Сервер выдаст ответ в формате XML (см. скрин). Нас интересуют следующие поля:

  • AdressDetails->Country->AdressLine — текстовая строка с полным адресом пользователя;
  • AdressDetails->Country->СountryName — страна;
  • AdressDetails->AdministrativeArea->AdministrativeAreaName — регион;
  • AdressDetails->SubAdministrativeArea->SubAdministrativeAreaName — район;
  • AdressDetails->Locality->LocalityName — населенный пункт;
  • AdressDetails->ThoroughFare->ThoroughFareName — улица.
Ответ Геокодера
Ответ Геокодера

Адрес с номером дома Яндекс.Геокодер не раскрывает. Но если немного напрячь мозги и вспомнить школьную программу, то можно вычислить его. В одном градусе широты 111 км 111 м. С долготой все чуть-чуть сложнее. Ведь диаметр Земли варьируется в зависимости от широты. Поэтому долгота рассчитывается по следующей формуле (6371 — это радиус Земли):

6371 * (Math::PI/180) * cos(широта * Math::PI/180)

Как эти знания помогут вычислить точный адрес пользователя? А вот как:

  1. Узнаем улицу с помощью Яндекс.Геокодера.
  2. Отправляем запрос на получение точных географических координат какого-нибудь дома на этой улице:
    http://geocode-maps.yandex.ru/1.x/?geocode=пермь, улица Яблочкова,2
  3. Считываем значение из ответа сервера.
  4. Зная длину градуса широты и долготы, рассчитываем расстояние от искомой точки до этого дома.
  5. Открываем Яндекс.Карты и линейкой прикидываем, какой дом имеет географические координаты пользователя.

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

Google Street View

Координаты можно найти на Google Maps и включить режим просмотра улиц. Забавно посмотреть на дом или офис человека, который нагло критикует в твоем блоге фотки свежего ремонта дачи.

 

Фотографии вокруг

Теперь поищем фотографии, сделанные рядом с местом Х. Как это делается, разберем на примере ВКонтакте API:

https://api.vk.com/method/photos.search.xml?lat=38.600000&long=35&count=100&radius=500
  • lat — широта;
  • long — долгота;
  • count — количество возвращаемых запросом фотографий;
  • radius — радиус окружности вокруг заданной точки, в которой должны быть сделаны фотографии.

Вот какие поля ответа нас интересуют:

  • src, src_big — ссылки на фотографии;
  • created — дата создания фотографии в unixtimestamp;
  • owner_id — ID владельца фотографии.

Зная ID владельца, можно зайти на его страницу или собрать инфу с помощью того же VK API:

https://api.vk.com/method/getProfiles.xml?uids=111111&fields=last_name,first_name,sex,age
  • uids — ID владельцев через запятую;
  • fields — поля, которые мы хотим получить в ответе.

Полный список полей доступен в документации.

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

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


Комментарии

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…