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

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 с методами для поиска фотографий по геотегам. Порядок работы с ними ищи на страницах для разработчиков приложений под эти соцсети.



Игры с этим API рассказали мне об одном интересном феномене. Летними утрами, часов до десяти, среди деревьев в двух шагах от моего дома регулярно фотографируются люди. Почти каждый день. Их привлекает световая дорожка, которую создают пробивающиеся сквозь листву лучи утреннего солнца. На ее фоне получаются очень красивые фото :).

 

Места вокруг

А теперь научимся искать объекты заданного типа рядом с пользователем с помощью Foursquare API. Перед выполнением запросов необходимо зарегистрировать приложение, получить CLIENT_ID и CLIENT_SECRET:

https://api.foursquare.com/v2/venues/search?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&v=20130815&ll=40.7,-74&query=пицца
  • v — версия API;
  • ll — широта и долгота;
  • query — описание объекта, который ищем.

В ответ придет инфа о ближайших к заданной точке пиццериях в виде массива объектов, которые в Foursquare называются venues. У каждого объекта venue есть обязательные свойства:

  • id — ID места в базе Foursquare;
  • name — название места;
  • contacts — телефон, email и прочее;
  • location — географические координаты места.

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

Если вместо слова search поставить слово explore перед знаком вопроса, то в ответ вернутся не ближайшие, а самые лучшие (с высокими оценками) пиццерии рядом с заданной точкой.


Страница разработчика Foursquare: developer.foursquare.com.
 

Погода

К сожалению, API, к которому можно сделать запрос с координатами и получить в ответ текущую метеоситуацию в точке, пока не существует. Придется немного поколдовать с Яндекс.Погодой.

  1. Узнаем LocalityName в Яндекс.Геокодер (см. выше).
  2. Ищем строку с названием города в этом XML-файле: https://pogoda.yandex.ru/static/cities.xml и узнаем его ID.
  3. Получаем информацию о погоде для данного населенного пункта (26359 — ID города):
    http://export.yandex.ru/weather-ng/forecasts/26359.xml
  4. Парсим ответ.

Вот расшифровка значений некоторых полей:

  • weather_type — дождь, переменная облачность, снег и так далее;
  • humidity — влажность;
  • wind_speed — скорость ветра;
  • wind_direction — направление ветра;
  • temperature — температура;
  • pressure — атмосферное давление.

К сожалению, Яндекс.Погода предоставляет данные лишь для 11 тысяч населенных пунктов по всему миру, и большая часть из них находится в России.

XML-файл содержит информацию о погоде на девять дней вперед для ночного, дневного, утреннего и вечернего времени суток.
XML-файл содержит информацию о погоде на девять дней вперед для ночного, дневного, утреннего и вечернего времени суток.
 

Восход и закат

Для вычисления времени восхода, заката, утренних и вечерних сумерек есть JS-либа SunCalc. Пример использования:

// Получаем объект с информацией о световом дне для координат
var times = SunCalc.getTimes(new Date(), 56.5, 1);
// Получаем из него время восхода
var sunriseStr = times.sunrise.getHours() + ':' + times.sunrise.getMinutes();
// Узнаем положение солнца над горизонтом во время восхода
var sunrisePos = SunCalc.getPosition(times.sunrise, 56.5, 1);
 

Определение высоты над уровнем моря

А теперь обратимся к Google API. Для работы с ним необходимо зарегистрировать приложение в Google Developer Console и пройти OAuth 2.0 авторизацию перед тем, как выполнять запросы. Ниже представлен текст запроса для получения высоты над уровнем моря:

http://maps.googleapis.com/maps/api/elevation/xml?locations=58.0000,36.4560&sensor=true
  • слово xml/json перед знаком вопроса определяет формат возвращаемых данных;
  • location — координаты точки;
  • sensor — отслеживает ли приложение, которое делает запрос, местоположение пользователя.

В ответе нас интересует поле elevation.

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

Подробности: https://developers.google.com/maps/documentation/elevation/?hl=ru.

Интересные возможности «несвободных» API

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

 

Заключение

Надеюсь, прочитанное разбудило твое воображение и ты уже придумал парочку идей, как применить описанные приемы на практике. Не забывай только перед тем, как использовать любой API, непременно ознакомиться с соглашением об его использовании. Особенно это касается продуктов Google. Они очень строго контролируют соблюдение установленных правил. Еще советую следить за новостями для разработчиков в блогах Яндекса, Google и Foursquare. Геоинформационные API стремительно развиваются и обогащаются новыми функциями. Удачи!

Оставить мнение