Руководства

Обратное геокодирование списка координат без цикла

Если у вас есть таблица пар широты и долготы и скрипт, который вызывает API по одному разу на строку, вы расплачиваетесь за сетевые обращения туда и обратно, а не за сами запросы. Эндпоинт обратного геокодирования принимает пакетное тело POST так же, как и эндпоинт прямого геокодирования, и определяет все пары за один вызов.

Отправка пар координат

Вместо одного GET-запроса на каждую точку отправьте массив объектов с координатами на /v1/reverse. Для каждого элемента возвращается собственный адрес в том порядке, в котором элементы были отправлены.

POST /v1/reverse
Content-Type: application/json

[{"lat": 48.8584, "lon": 2.2945}, {"lat": 40.6892, "lon": -74.0445}]
{
  "status": "ok",
  "results": [
    {"formatted": "Champ de Mars, Paris, France", "lat": 48.8584, "lon": 2.2945, "type": "address", "precision": "street", "confidence": 0.9, "place_id": "gh789", "components": {}},
    {"formatted": "Liberty Island, New York, NY", "lat": 40.6892, "lon": -74.0445, "type": "address", "precision": "street", "confidence": 0.88, "place_id": "jk012", "components": {}}
  ]
}

Почему это лучше цикла

Цикл, отправляющий один HTTP-запрос на каждую координату, добавляет накладные расходы на соединение для каждой строки и затрудняет контроль дневной квоты, поскольку вы следите за заголовками, мелькающими в сотнях отдельных ответов, а не в одном. Один пакетный вызов по-прежнему списывает один запрос за каждый элемент, так что общий расход квоты тот же, но вы получаете один набор заголовков квоты для чтения и одно место для перехвата ошибок.

Чтение ответа

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

Второй пример: сочетание с данными о часовых поясах

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

Ошибка, которой стоит избегать

Не считайте, что каждая координата в вашей таблице корректна, до отправки. Широта вне диапазона от -90 до 90 или долгота вне диапазона от -180 до 180, что случается чаще, чем хотелось бы, когда столбцы в таблице меняются местами, всё равно учитывается как запрос, хотя разумного результата вернуть не может. Проверяйте диапазоны в своём коде до отправки пакета, а не платите за запрос, который заведомо не мог быть успешным.

Выбор размера пакетов

Нет необходимости отправлять всю таблицу базы данных одним запросом. Группируйте координаты в пакеты, размер которых соответствует ограничениям памяти и тайм-аута вашего скрипта, и следите за тем, сколько запросов расходует каждый пакет из бесплатной дневной квоты или вашего баланса. Заголовки X-Quota-Used и X-Quota-Free-Remaining в каждом ответе точно показывают, где вы находитесь, прежде чем отправить следующий пакет.

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