image alt
-Ты где?
-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)


  1. stranger_shaman
    06.10.2019 23:27
    +1

    48 часов писали три хттп запроса?


    1. 19as Автор
      06.10.2019 23:31

      Нет конечно. Это лишь часть работы.


      1. mikaakim
        07.10.2019 05:38

        тогда где остальная часть? Статья даже до уровня заметки еле дотягивает


        1. 19as Автор
          07.10.2019 22:03

          Остальной части тут не будет, т.к. хотелось поделиться опытом в части использования API


      1. Eatric
        07.10.2019 22:03

        Расписали бы подробнее свой проект, а то из этого ничего не понятно и не интересно, зачем вам нужно было это Api?


        1. 19as Автор
          07.10.2019 22:03

          Добавил постановку задачи


  1. abar
    06.10.2019 23:49

    Как (пусть и бывший) работник HERE могу только одобрить выбор. Было бы интересно узнать, о чем же все-таки проект. На HERE maphaton'е не планируете участвовать?


    1. 19as Автор
      07.10.2019 22:05

      Честно, с HERE знаком совсем недавно. А есть ссылка на данное мероприятие?


  1. den_labs
    07.10.2019 15:37

    Пробовали ли Map mathing API?
    И что значит трнзакция: запрос, группа запросов?


    1. 19as Автор
      07.10.2019 22:09

      Map matching API не пробовал.
      Как я понял, подразумевается запрос.


  1. WhiteBlackGoose
    07.10.2019 15:42

    Если уж делать, то сначала переведенную документацию (выжимку), а потом уже сэмплы. А так получается я тоже могу написать документацию как использовать print:


    1. Можно написать print(3)
    2. Можно написать print(4 / 2)
    3. А еще можно написать print("gf")