| |
-Ты где? -I’m here |
|---|
В конце сентября состоялся самый большой в мире хакатон, который проходил в Казани. Данное мероприятие по количеству участников вошло в «Книгу рекордов Гиннесса».
На эти 48 часов перед нами была поставлена задача:
Разработать прототип мобильного приложения, позволяющего пассажиру заказать доставку еды из ресторанов, расположенных в городах по маршруту следования поезда.
Лирика
Безусловно, на протяжении всего мероприятия, мы занимались решением разнородных подзадач по нашей теме. Мы не потратили все 48 часов на изучение HERE API и написание приведенных трех запросов.
В данной статье хочется поделиться именно опытом, по использованию HERE API, полученным за эти бессонные 48 часов, точнее, как junior разработчику по Python и распределенных систем в сети реализовать взаимодействие с другими системами в сети. Статья не претендует на роль перевода всей документации HERE API, лишь описывает практическое применение при решении наших задач.
Введение
Курьеру, для оптимизации доставки заказов и их исполнения в срок, на перрон необходимо прибывать в точное время прибытия поезда на станцию. В связи с этим, каждый курьер должен знать, минимальное необходимое время для доставки заказа. Для решения этой задачи, была необходимость вычисления минимального времени пути между двумя точками (от ресторана до ЖД станции). Путь вычислялся в населенном пункте, в связи с этим, было принято решение рассмотреть разные варианты, а именно, использование общественного транспорта, личного автомобиля и своих ног для пешей ходьбы.
Анализ общедоступных API показал, что больше всего для решения задачи подойдут следующие REST-запросы:
Использование API начинается с регистрации в разделе для разработчиков на официальном сайте для генерации и получения ключей APP ID и APP CODE. Free API key позволяет выполнять до 250 тысяч запросов в месяц. Поверьте, это покрывает все потребности для хакатона.
Статистика использования HERE API нашим приложением за 48 часов показала следующие цифры:
Практика
Каждый запрос содержит следующие поля:
deplocation = A # точка отправки arrlocation = B # точка прибытия # ключи, полученные после регистрации на сайте app_id = os.getenv('HERE_APP_ID') app_code = os.getenv('HERE_APP_CODE')
Нахождение времени в пути с использованием общественного транспорта
url = f"https://transit.api.here.com/v3/route.json" query = { 'dep': deplocation, 'arr': arrlocation, 'time': datetime.now().strftime('%Y-%m-%dT%H:%M:%S'), # время, на которое выполняется запрос 'app_id': app_id, 'app_code': app_code, 'routing': 'tt' # маршрутизация по расписанию } response = requests.get(url, params=query) data = response.json() status = data["Res"] if "Message" in status: print(status["Message"]) exit(-1) if "Connections" in status: route_dut_time = iso8601toSec( status["Connections"]["Connection"][0]["duration"] )
Хотелось бы отметить, что в данном запросе время выдается используя ISO 8601. Была реализована функция конвертации полученного продолжительности времени в секунды iso8601toSec.
Нахождение времени в пути с использованием личного транспорта
url = f"https://route.api.here.com/routing/7.2/calculateroute.json" query = { 'waypoint0': deplocation, 'waypoint1': arrlocation, 'mode': 'fastest;car;traffic:enabled', # определение быстрого маршрута с учетом пробок 'app_id': app_id, 'app_code': app_code, 'departure': 'now' # время отправки } response = requests.get(url, params=query) data = response.json() route_dur_time = data['response']['route'][0]['summary']['trafficTime']
В этом запросе со временем проблем нет, он возвращается в секундах.
Нахождение времени в пути с использованием собственных ног (пешая прогулка)
url = f"https://route.api.here.com/routing/7.2/calculateroute.json" query = { 'waypoint0': deplocation, 'waypoint1': arrlocation, 'mode': 'fastest;pedestrian', # пешеходный режим 'app_id': app_id, 'app_code': app_code } response = requests.get(url, params=query) data = response.json() route_dur_time = data['response']['route'][0]['summary']['travelTime']
В этом запросе, как и в предыдущем примере, со временем проблем нет, он возвращается в секундах.
Выводы
На основе этих запросов, получили три времени необходимых для перемещения из точки А до точки Б. Вычислив из них минимальное время и тип перемещения, определяли за какое время необходимо выходить, чтобы успеть подойди до точки Б к указанному времени.
