|
-Ты где? -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']
В этом запросе, как и в предыдущем примере, со временем проблем нет, он возвращается в секундах.
Выводы
На основе этих запросов, получили три времени необходимых для перемещения из точки А до точки Б. Вычислив из них минимальное время и тип перемещения, определяли за какое время необходимо выходить, чтобы успеть подойди до точки Б к указанному времени.
Комментарии (11)
WhiteBlackGoose
07.10.2019 15:42Если уж делать, то сначала переведенную документацию (выжимку), а потом уже сэмплы. А так получается я тоже могу написать документацию как использовать print:
- Можно написать print(3)
- Можно написать print(4 / 2)
- А еще можно написать print("gf")
stranger_shaman
48 часов писали три хттп запроса?
19as Автор
Нет конечно. Это лишь часть работы.
mikaakim
тогда где остальная часть? Статья даже до уровня заметки еле дотягивает
19as Автор
Остальной части тут не будет, т.к. хотелось поделиться опытом в части использования API
Eatric
Расписали бы подробнее свой проект, а то из этого ничего не понятно и не интересно, зачем вам нужно было это Api?
19as Автор
Добавил постановку задачи