Работа с местоположениями. Геолокация и геокодирование.

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

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

Основные требования.

  • возможность определение местоположения по IP
  • вомзожность преобразование координат в адрес с информацией о стране, регионе, а по возможности, городе, улице
  • возможность получения точных координаты по адресу
  • предоставление сущностей, с которыми будет удобно взаимодействовать при работе с местоположениями в коде
  • работа с несколькими сторонними сервисами "под капотом" для возможности увеличения бесплатных лимитов

Опишу подробнее последний пункт. Большинство крупных сервисов таких, как Яндекс Геокодер, Google Geocoding API, Sypex Geo, MaxMind 
GeoIP2 Services, DaData geo api разрешают совершать тысячи запросов каждый месяц бесплатно. Лишь при превышении некоторых лимитов начинает взиматься плата в довольно ощутимом для некоммерческого проекта размере. Исходя из этого, важной задачей стало использование сервисов по очереди для суммирования всех возможных бесплатных лимитов друг с другом.

Анализ имеющихся решений.


При просмотре имеющихся предложений на Packagist удалось обнаружить множество пакетов от разработчиков платных проприетарных решений, например, MaxMind, lite.ip2location, Sypex. Основной их недостаток заключается в жесткой привязке к одному вендору. Популярный же пакет от ThePhpleague вынуждает тянуть в проект множество избыточного редко используемого функционала вроде работы с полигонами и конвертации между различными системами координат 

Поэтому, было решено создать свой инструмент.

Результат.


Два основных пакета:
  • GeoСoder - предоставляет метод получения местоположения по географическим координатам и метод получения местоположения по строке, содержащей адрес. Из коробки уже реализован провайдер работа с сервисом Yandex geocode. Уже в процессе разработки провайдер для аналогичного сервиса от Google. При необходимости Вы можете добавить провайдеры для любых других сервисов.
  • GeoLocation - предоставляет методы для получения местоположения по проивзольному IP-адресу, а так же метод для получения текущего IP-адреса. Из коробки уже реализованы провайдеры для работы с сервисами DaData, MaxMind и SypexGeo. Пакет можно использовать с любым фреймворком или вовсе без оного, однако, для Laravel автоматически создастся контроллер и роут, предоставляющие возможность получения информации об IP с помощью GET запроса по адресу вида http://<our-domain>/api/geo-location/46.174.50.30/en, что удобно при использовании в связке с фронтендом.
и два вспомогательных:

  • GeoCoordinates - предоставляет удобный интерфейс для работы координатами. Позволяет не запутаться в порядке следования широты и долготы, а также избежать дублирования при обработке и валидации координат в коде основных пакетов.
  • GeoLocationAddress - предоставляет унифицированный интерфейс для работы с местоположением.

Функционал описанных пакетов уже испробован и активно используется в текущей бета-версии сервиса взаимопомощи на дорогах https://icarhelper.com.
Рейтинг

Возврат к списку

Раздел PHP
(Codeblog)