#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:
Шаги:
- Матрица запроса (POST)
- Опрос статуса (ПОЛУЧИТЬ)
- Загрузите результат, когда будете готовы (ПОЛУЧИТЕ)
# 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 в теле. Однако для получения времени в пути, включая трафик, нельзя использовать определение региона «мир». Согласно определению, время отправления равно «любому», что делает его нечувствительным к трафику. Чтобы отразить новую проблему, я обновлю первоначальный вопрос.