В современном мире огромное количество разнообразных сервисов обрабатывают геоданные.
Задачи прямого и обратного геокодирования встречаются повсеместно – когда ваш пользователь вводит свой адрес, а вы на карте отображаете точку, где он находится. Или наоборот – ваш пользователь указывает точку на карте, а вы преобразуете эту точку в понятный адрес.
В рамках этой статьи я хочу рассмотреть наиболее популярные существующие решения для этой задачи, разобраться в их особенностях и тарифах и также провести тестирование качества геокодирования, чтобы выяснить, какой сервис наиболее предпочтителен для использования.
Что такое прямое и обратное геокодирование?
В начале статьи я уже немного об этом сказал, теперь дам более строгое определение.
Прямое геокодирование – это задача получения координат географической точки по её адресу, написанному на понятном человеческом языке. Например, пользователь указывает адрес «Москва, Красная площадь д. 3», или «Москва, ГУМ» — нам, чтобы отобразить эту точку на карте, необходимо узнать координаты этого адреса.
Топография . Определение географических координат на карте . Контрольно проверочные занятия . КПЗ.
Обратное геокодирование, соответственно, решает обратную задачу – по точке, указанной пользователем, получить её адрес или название расположенного там объекта.
И та, и другая задача очень часто встречаются в различных сервисах, работающих с геоданными пользователей, например, если вы разрабатываете интернет-магазин и хотите показать ближайший к адресу пользователя пункт выдачи заказов – вам не обойтись без определения точных координат местоположения пользователя. Если вы делаете сервис заказа такси или курьерской доставки – пользователю может быть удобно указать точку на карте, а вам для вашего курьера всё равно будет удобнее показать помимо точки на карте еще и адрес пользователя в виде текста.
Какие существуют сервисы для решения этой задачи?
Вообще, сервисы подразделяются на 2 основных категории – это оффлайн- и онлайн-сервисы. Оффлайн-сервис подразумевает, что вы скачиваете на свой локальный компьютер некую базу данных (добавляете её в своё приложение) и получаете информацию из неё. Онлайн-сервис представляет из себя API, к которому вы формируете запрос в соответствии с документацией, и он возвращает вам ответ с интересующей вас информацией.
В большинстве случаев онлайн-сервисы предлагают более высокую точность ответов, поскольку обновляются более часто, а также более удобны в использовании – потому что вам нет необходимости поддерживать отдельную машину под оффлайн-сервис или зашивать базу данных (достаточно объемную) и обслуживающий её код в ваше приложение. Поэтому в рамках этой статьи я буду рассматривать только онлайн-сервисы для решения задач прямого и обратного геокодирования.
Источник: habr.com
Геотаргетинг для программиста. Что интересного могут рассказать бесплатные геоинформационные API
Определение географических координат 5 класс.
Географические координаты — самая ценная инфа, которую веб-разработчик может получить от посетителей сайта. Имея смекалку и зная пару приемчиков, можно многое выяснить о человеке по его местоположению: адрес, какие заведения есть неподалеку, фотографии, сделанные в его районе, на что жалуются соседи и глубину ближайшей реки.
WARNING
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.
INTRO
Если ты до сих пор не собираешь данные о местоположении своих пользователей, то ты просто еще не читал эту статью и не знаешь, как с пользой для себя применить информацию. Разберем несколько юзкейсов, чтобы показать, как могут пригодиться геоданные, а потом перейдем к практике.
Юзкейс 1. «Я тебя вычислю по IP»
Допустим, в твоем блоге завелся тролль, который регулярно оставляет грубые комменты. Если ты собираешь инфу о посетителях Яндекс.Локатором, то без труда выяснишь, что этот кто-то находится на восточном конце улицы Ленина, в котором как раз живет один неприятный тип из твоего универа. И если повезет, то, сделав запрос к Vkontakte API, ты найдешь его последнюю фотку.
Юзкейс 2. Геомаркетинг
Яндекс.Директ уже давно применяет прицельный геотаргетинг для своих объявлений. Объявление «Сеть пиццерий в Москве» сознание игнорирует. А мимо ссылки «Пицца Рочдельская улица дом 14» (через дорогу от тебя) пройти практически невозможно.
Ты можешь использовать геоданные для продвижения товаров и услуг. Если человек в данный момент ощущает на себе действие пониженного атмосферного давления, то есть вероятность, что ему захочется купить таблетки для поднятия жизненного тонуса.
Юзкейс 3. Веселый функционал
Здесь огромный простор для творчества. Ставим на сайт «ночную» тему оформления после того, как у юзера заходит солнце. Показываем ему последние селфи девушек, сделанные в 10 км от него. По климату и глубине водоемов определяем, какая рыба водится в округе. Вариантов масса.
Юзкейс 4. «Научные» исследования аудитории
Результаты анонимного онлайн-опроса могут оказаться существенно полезнее, если в дополнение к ответам отмечать географическое положение респондентов.
Интересно? Тогда вперед.
Получение координат
GPS-данные можно получить с помощью JavaScript и HTML5 Geolocation API. Но учти: узнать точное местоположение пользователя можно только с его согласия. Он должен выразить его, ответив утвердительно на вопрос всплывающего окна, разрешить ли текущему сайту узнать его местоположение.
Пример кода на нативном JS:
// Кладем в переменную адрес для вывода текста 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 + «
Долгота: » + position.coords.longitude; >
Работать с GPS-данными можно не только на JS. У большинства языков имеются инструменты для их получения и обработки:
- C — bit.ly/1FjZRPk;
- Python — bit.ly/1K5Y81c;
- Java — bit.ly/1H31DPY;
- Objective-C — bit.ly/1KIEeGA;
- PHP — bit.ly/1JGWxvp;
- Ruby — bit.ly/1KIqA68.
Яндекс.Локатор
Если пользователь не хочет добровольно делиться 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 — улица.
Другие статьи в выпуске:
Xakep #197. Социальная инженерия
- Содержание выпуска
- Подписка на «Хакер» -60%
Адрес с номером дома Яндекс.Геокодер не раскрывает. Но если немного напрячь мозги и вспомнить школьную программу, то можно вычислить его. В одном градусе широты 111 км 111 м. С долготой все чуть-чуть сложнее. Ведь диаметр Земли варьируется в зависимости от широты. Поэтому долгота рассчитывается по следующей формуле (6371 — это радиус Земли):
6371 * (Math::PI/180) * cos(широта * Math::PI/180)
Как эти знания помогут вычислить точный адрес пользователя? А вот как:
- Узнаем улицу с помощью Яндекс.Геокодера.
- Отправляем запрос на получение точных географических координат какого-нибудь дома на этой улице:
http://geocode-maps.yandex.ru/1.x/?geocode=пермь, улица Яблочкова,2 - Считываем значение из ответа сервера.
- Зная длину градуса широты и долготы, рассчитываем расстояние от искомой точки до этого дома.
- Открываем Яндекс.Карты и линейкой прикидываем, какой дом имеет географические координаты пользователя.
Всех юзеров таких способом не задетектишь, но некоторых особо нужных вполне. Главное — не ошибиться в расчетах.
Google Street View
Координаты можно найти на Google Maps и включить режим просмотра улиц. Забавно посмотреть на дом или офис человека, который нагло критикует в твоем блоге фотки свежего ремонта дачи.
Фотографии вокруг
Теперь поищем фотографии, сделанные рядом с местом Х. Как это делается, разберем на примере ВКонтакте API:
https://api.vk.com/method/photos.search.xml?lat=38.600000count=100
Вот какие поля ответа нас интересуют:
- src, src_big — ссылки на фотографии;
- created — дата создания фотографии в unixtimestamp;
- owner_id — ID владельца фотографии.
Зная ID владельца, можно зайти на его страницу или собрать инфу с помощью того же VK API:
https://api.vk.com/method/getProfiles.xml?uids=111111
У Instagram, Facebook и Flickr тоже есть API с методами для поиска фотографий по геотегам. Порядок работы с ними ищи на страницах для разработчиков приложений под эти соцсети.
Игры с этим API рассказали мне об одном интересном феномене. Летними утрами, часов до десяти, среди деревьев в двух шагах от моего дома регулярно фотографируются люди. Почти каждый день. Их привлекает световая дорожка, которую создают пробивающиеся сквозь листву лучи утреннего солнца. На ее фоне получаются очень красивые фото :).
Места вокруг
А теперь научимся искать объекты заданного типа рядом с пользователем с помощью Foursquare API. Перед выполнением запросов необходимо зарегистрировать приложение, получить CLIENT_ID и CLIENT_SECRET:
https://api.foursquare.com/v2/venues/search?client_id=CLIENT_IDv=20130815query=пицца
- v — версия API;
- ll — широта и долгота;
- query — описание объекта, который ищем.
В ответ придет инфа о ближайших к заданной точке пиццериях в виде массива объектов, которые в Foursquare называются venues. У каждого объекта venue есть обязательные свойства:
- id — ID места в базе Foursquare;
- name — название места;
- contacts — телефон, email и прочее;
- location — географические координаты места.
Есть также огромный список опциальных свойств: часы работы, меню и так далее. Эти данные будут в ответе, если соответствующая информация имеется в базе Foursquare.
Если вместо слова search поставить слово explore перед знаком вопроса, то в ответ вернутся не ближайшие, а самые лучшие (с высокими оценками) пиццерии рядом с заданной точкой.
Страница разработчика Foursquare: developer.foursquare.com.
Погода
К сожалению, API, к которому можно сделать запрос с координатами и получить в ответ текущую метеоситуацию в точке, пока не существует. Придется немного поколдовать с Яндекс.Погодой.
- Узнаем LocalityName в Яндекс.Геокодер (см. выше).
- Ищем строку с названием города в этом XML-файле: https://pogoda.yandex.ru/static/cities.xml и узнаем его ID.
- Получаем информацию о погоде для данного населенного пункта (26359 — ID города):
http://export.yandex.ru/weather-ng/forecasts/26359.xml - Парсим ответ.
Вот расшифровка значений некоторых полей:
- weather_type — дождь, переменная облачность, снег и так далее;
- humidity — влажность;
- wind_speed — скорость ветра;
- wind_direction — направление ветра;
- temperature — температура;
- pressure — атмосферное давление.
К сожалению, Яндекс.Погода предоставляет данные лишь для 11 тысяч населенных пунктов по всему миру, и большая часть из них находится в России.
Восход и закат
Для вычисления времени восхода, заката, утренних и вечерних сумерек есть 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
В ответе нас интересует поле elevation.
Получив высоту для нескольких точек вокруг пользователя, можно определить, находится ли он на берегу моря, реки, в горах или на острове.
Интересные возможности «несвободных» API
- Twitter API — по геотегам можно получить твиты, запощенные в данной локации.
- Яндекс.Расписание API — по координатам можно узнать ближайшую железнодорожную станцию или автобусную остановку, а также время пути до заданных точек на общественном транспорте.
Заключение
Надеюсь, прочитанное разбудило твое воображение и ты уже придумал парочку идей, как применить описанные приемы на практике. Не забывай только перед тем, как использовать любой API, непременно ознакомиться с соглашением об его использовании. Особенно это касается продуктов Google. Они очень строго контролируют соблюдение установленных правил.
Еще советую следить за новостями для разработчиков в блогах Яндекса, Google и Foursquare. Геоинформационные API стремительно развиваются и обогащаются новыми функциями. Удачи!
Источник: xakep.ru
GPS-координаты на карте — поиск места
Узнать GPS-координаты того места, в котором человек в данный момент находится – задача, с которой потенциально может столкнуться каждый. Здесь могут помочь самые разные средства и приборы, специально предназначенные для определения положения на местности. Это может быть походный навигатор или приложение в мобильном телефоне. Данное исследование посвящено вопросу, как определить место по координатам в отсутствии под рукой современной техники или используя средство для навигации.
GPS-координаты на карте
На территории нашей страны общепринятыми считаются два основных стандарта спутниковой (околоземной) связи:
- GPS – совокупность аппаратно-программных средств, запущенных ВВС США, передающих сигналы на Землю для навигации.
- ГЛОНАСС – комплекс для отправки и приема сигнала с поверхности планеты, работающий под контролем ВВС России.
Оба стандарта работают на своих заданных частотах, поэтому приемник сигнала для работы по ДжиПиЭс или ГЛОНАСС должен быть настроен на соответствующий диапазон электромагнитных волн, передаваемых со спутников.
Принцип расчета
Суть работы наземных навигаторов состоит в том, чтобы измерять расстояние от конкретной точки поверхности Земли до нескольких орбитальных спутников, которые, как утверждается, расположены в определенных точках над нашей планетой. То есть, чтобы узнать координаты текущего места, вычислительному средству с ДжиПиЭс для трехмерной навигации потребуется определить расстояние от наземной точки до трех спутников. Определение координат данным методом по известным трем точкам над Землей и одной наземной точке называется трилатерация.
Географические координаты
Этот тип измерения местоположения определяется географическими широтой и долготой.
- Географическая широта – угол между плоскостью экватора и линией, ортогональной к этой плоскости.
- Географическая долгота – это угол между плоскостью нулевого меридиана и меридиана конкретной точки.
То есть, для определения местоположения в географии используются плоскости и отвес. Формат таких данных имеет три различных вида записи:
- ddd.mm.mmm — гр., мин. и доли минут;
- ddd.dddd — градусы с дробной частью;
- ddd.mm.ss.s — гр., мин., сек.
Долгота измеряется в диапазоне от 0 до 180 гр., а широта может соответствовать значениям от 0 до 90 гр. Чтобы вычислить GPS-координаты на карте, устройство (навигатор) и сама карта должны находиться в одинаковой координатной системе. Так, для того чтобы найти место по координатам GPS на мировой географической карте, зная геоданные, можно воспользоваться любым инструментом для вычисления соответствующих значений онлайн. При этом перевод GPS-координат в географическую систему не потребуется. Программа сама сопоставит нужные значения с данными спутника.
Определение GPS-координат
При наличии под рукой мобильного устройства, узнать значения широты/долготы местоположения объекта или человека в определенной точке можно несколькими способами:
- API-инструмент Геокодер Яндекса.
- Яндекс.Карты.
- Приложение GPS Test.
- Мобильные мессенджеры.
Самый простой способ определить координаты по адресу – воспользоваться инструментом Геокодер от Яндекса. Алгоритм работы этой API-функции довольно простой: по заданным значения широты и долготы программа анализирует атлас и выдает нужный адрес. И, наоборот, по конкретному адресу Геокодер покажет нужные GPS-координаты с определенными значениями. Для этого потребуется:
- Открыть геокодер.
- Набрать адрес, например: «Санкт-Петербург, ул. Бумажная, д. 28».
- Получить результат поиска со значениями [широта, долгота] в дробном виде.
- Открыть страницу геокодера.
- Ввести известную широту/долготу.
- Получить адрес местонахождения объекта.
Точка по координатам долготы и широты на карте определяется однозначно и привязывается к ближайшему объекту. Так, каждое строение на карте мира имеет свои уникальные географические значения.
Картографический сервис от той же компании также позволяет определить координаты GPS по введенному пользователем физическому адресу. Для этого достаточно открыть Яндекс.Карты, ввести адрес дома или учреждения и нажать появившуюся метку с обозначенными параметрами навигации.
В программном приложении GPS Test также доступен поиск по координатам GPS со множеством дополнительных опций. Для поиска необходимо:
- Скачать и установить программу.
- Запустить приложение.
- Зайти в меню, выбрать пункт «Поделиться» (Share).
- В открывшемся окне появятся данные для передачи информации о местоположении, где и будут указаны координаты.
Подобным способом можно получить геоинформацию о текущей позиции, используя какой-либо мессенджер в смартфоне или планшете, к примеру, Viber. В самом приложении потребуется нажать значок «+» внизу, выбрать пункт «Местоположение» и дождаться вывода информации на карту местности.
Определить географические данные о местонахождении современному человеку не составит трудностей. Владея одним из приведенных здесь способов вычисления координат, можно получить эту информацию в течение нескольких минут.
Источник: xn—-7sbabalh3bm7aqybrh4ete.xn--p1ai