Как использовать асинхронный матричный API маршрутизации v8 ОТСЮДА, чтобы получить ответ на время в пути, включая трафик

#python #post #matrix #here-api #travel-time

#python #Публикация #матрица #здесь -api #время в пути

Вопрос:

Мне нужно время в пути между набором узлов (в обоих направлениях), включая трафик. В старой версии API (7.2) я бы использовал следующий код на Python для запроса этого:

     payload = {
        "apiKey": "API_KEY_HERE",
        "start0": "-33.795602,151.185366",
        "start1": "-33.865103,151.205627",
        "destination0": "-33.795602,151.185366",
        "destination1": "-33.865103,151.205627",
        "mode": "fastest;car;traffic:enabled",
        "departure": "2020-10-27T08:00:00 11",
        "summaryattributes": "all"
    }
    base_url = "https://matrix.route.ls.hereapi.com/routing/7.2/calculatematrix.json?"
    r = requests.get(base_url, params=payload)
    print(r.json())

  

В новой версии меньше примеров, и, честно говоря, я не очень хорошо знаком с сообщениями и асинхронными ответами.

Зачем переходить на новую версию? Ну, кажется, что вы могли бы передать только один набор исходных узлов / местоположений, а затем будет вычислена матрица (в фоновом режиме), и как только она будет готова, ее можно будет извлечь с помощью запроса GET. Нет указания start0, start1, .. etc

Новая попытка с версией 8:

Шаги:

  1. Матрица запроса (POST)
  2. Опрос статуса (ПОЛУЧИТЬ)
  3. Загрузите результат, когда будете готовы (ПОЛУЧИТЕ)
 # 1. Request matrix (POST)
    base_url = "https://matrix.router.hereapi.com/v8/matrix?"
    params = {"apiKey": "MY_API_KEY_HERE",
              "async": "true",
              "departureTime": "2020-10-27T08:00:00 11"}
    payload = {"origins": [{"lat": -33.759688, "lng": 151.156369}, {"lat": -33.865189, "lng": 151.208162},
                           {"lat": -33.677066, "lng": 151.302117}],
               "regionDefinition": {"type": "autoCircle", "margin": 10000},
               "matrixAttributes": ["travelTimes", "distances"]}
    headers = {'Content-Type': 'application/json'}
    r = requests.post(base_url, params=params, json=payload, headers=headers)
    response = r.json()
    
    # pretty print
    print(json.dumps(response, indent=4))

  

Это дает статус «принято»:

     // Example response
    {
        "matrixId": "eba6780c-0379-40f1-abaf-5c62d07dabb4",
        "status": "accepted",
        "statusUrl": "https://aws-eu-west-1.matrix.router.hereapi.com/v8/matrix/eba6780c-0379-40f1-abaf-5c62d07dabb4/status"
    }

  

Затем я использую statusUrl и мой apiKey для опроса статуса. Вот где я застрял. Как я должен аутентифицироваться? Я не уверен, как должна работать аутентификация. Аутентификация на шаге 1 сработала.

 # 2. Poll for status (GET)
    time.sleep(3)
    statusUrl = response['statusUrl']
    params = {'apiKey': 'MY_API_KEY_HERE'}
    headers = {'Content-Type': 'application/json'}
    r = requests.get(statusUrl, params=params, headers=headers)
    response = r.json()
    
    # pretty print
    print(json.dumps(response, indent=4))

  

Где написано ‘MY_API_KEY_HERE’, я ввожу свой apiKey. Ответ:

 {
    "error": "Unauthorized",
    "error_description": "No credentials found"
}
  

Очевидно, произошла ошибка при использовании аутентификации. Как следует использовать аутентификацию? Можно ли показать, как выглядит успешный запрос на проверку статуса отправленного вычисления матрицы и как выглядит запрос на загрузку такой матрицы в Python (следующий шаг после опроса статуса с использованием заголовков gzip)?

Любые указатели будут приветствоваться.

Комментарии:

1. Удалось ли вам аутентифицировать асинхронный запрос??

2. Столкнулся с той же проблемой с асинхронной авторизацией, использование apiKey не работает для второго шага, извлекающего statusUrl. Единственное решение, которое я смог найти (на данный момент), — это полностью переключиться на токены на предъявителя.

3. Можете ли вы поделиться правильным кодом для выполнения запроса с использованием POST? У меня также возникают проблемы с использованием этого API в Python.

Ответ №1:

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

Это позволит рассчитать время в пути, включая время в пути: URL-адрес метода: https://matrix.router.hereapi.com/v8/matrix?apiKey={{API_KEY}}amp;async=false

Метод: POST

Тело:

 {
    "origins": [
        {
            "lat": 47.673993,
            "lng": -122.356108
        },
        {
            "lat": 47.656910,
            "lng": -122.362823
        },
        {
            "lat": 47.648015,
            "lng": -122.335674
        },
        {
            "lat": 47.653022,
            "lng": -122.312461
        },
        {
            "lat":47.675796,
            "lng": -122.311520
        }
    ],
    "destinations": [
        {
            "lat": 47.661438,
            "lng": -122.336427
        }
    ],
    "regionDefinition": {
        "type": "world"
    }
}
  

Комментарии:

1. Отличный ответ, это помогло увидеть, что я не знал, чтобы различать параметры в URL и JSON в теле. Однако для получения времени в пути, включая трафик, нельзя использовать определение региона «мир». Согласно определению, время отправления равно «любому», что делает его нечувствительным к трафику. Чтобы отразить новую проблему, я обновлю первоначальный вопрос.