Следите за использованием ключа, пока не упёрлись в лимит
Наблюдение за заголовками квоты по ходу работы показывает приближение к лимиту задолго до того, как запрос будет отклонён.
Компании с несколькими офисами не нужно ничего сложного, чтобы ответить на вопрос «какой офис ближе всего ко мне»: достаточно одного запроса геокодирования и короткого сравнения со списком, который редко меняется.
Вводит ли посетитель адрес или почтовый индекс, выполните геокодирование, чтобы получить координаты.
GET /v1/forward?q=Berlin, Germany&limit=1{
"status": "ok",
"results": [
{"formatted": "Berlin, Germany", "lat": 52.5200, "lon": 13.4050, "type": "locality", "precision": "city", "confidence": 0.85, "place_id": "bl456", "components": {"city": "Berlin", "country": "DE"}}
]
}Храните координаты офисов в виде небольшого фиксированного списка в собственном коде или конфигурации: он редко меняется и не требует отдельного запроса каждый раз.
offices = [
{"name": "Berlin", "lat": 52.5170, "lon": 13.3888},
{"name": "Paris", "lat": 48.8566, "lon": 2.3522},
{"name": "London", "lat": 51.5074, "lon": -0.1278}
]Вычислите расстояние от координат посетителя до каждого офиса по стандартной формуле гаверсинусов, затем отсортируйте по расстоянию и верните ближайший вариант.
Если вместо обычного текстового поля подключить к полю местоположения /v1/autocomplete, посетитель сможет выбирать из предлагаемых мест прямо во время ввода, и вероятность того, что опечатка приведёт к неожиданному результату геокодирования, снизится. После выбора подсказки её place_id или текст обрабатывается тем же процессом прямого геокодирования, а результат сразу попадает в уже описанное сравнение расстояний.
Обратите внимание: в примере выше точность равна «city», а не «house», поскольку посетитель ввёл только название города. Для поиска офиса это нормально: цель в том, чтобы выбрать ближайший офис из нескольких вариантов, а не найти конкретное здание. Более грубая точность здесь не требует особой обработки, в отличие от адреса доставки.
Не забывайте обновлять фиксированный список офисов в своём коде, когда офис открывается, закрывается или переезжает. Поскольку список хранится в вашей собственной конфигурации, а не в API, он легко и незаметно устаревает: посетителей молча направляют к закрытому офису, а новый вообще не участвует в сравнении. Включите этот список в регулярную проверку контента, а не считайте его разовой настройкой.
Короткое название места иногда соответствует нескольким реальным местам, например, когда одно и то же название носят объект в одной стране и никак не связанный с ним регион в другой части мира. Параметр countries, ограничивающий варианты совпадений странами, где у вас действительно есть офисы, не даст такой неоднозначности привести к результату на другом конце света.
Если показывать два или три ближайших офиса, а не только один, посетитель у границы регионов сможет выбрать тот, который действительно ему подходит, например, офис с более удобным языком или часовым поясом, даже если он немного дальше по расстоянию.
Каждый поиск означает один запрос геокодирования. Сравнение со списком офисов затем целиком выполняется в вашем коде и никак не увеличивает число запросов. Такая страница даже при стабильном трафике легко укладывается в 2 500 бесплатных запросов в день, которые входят в каждый ключ.
Поиск ближайшего офиса, построенный таким образом, требует ровно одного запроса на каждый поиск посетителя, а вся логика сравнения находится на вашей стороне. Подробности о формате запроса приведены в документации по прямому геокодированию.