Следите за использованием ключа, пока не упёрлись в лимит
Наблюдение за заголовками квоты по ходу работы показывает приближение к лимиту задолго до того, как запрос будет отклонён.
На вопрос «Как далеко от меня ваш ближайший филиал» лендинг может ответить сам, а не отправлять посетителя разбираться на отдельной карте.
Возьмите адрес или почтовый индекс, который посетитель вводит в простое поле формы, и выполните его геокодирование.
GET /v1/forward?q=350 Fifth Avenue, New York&limit=1{
"status": "ok",
"results": [
{"formatted": "350 Fifth Avenue, New York, NY", "lat": 40.7484, "lon": -73.9857, "type": "address", "precision": "house", "confidence": 0.96, "place_id": "es234", "components": {}}
]
}Получив координаты посетителя, рассчитайте расстояние по прямой от этой точки до каждого из ваших магазинов по стандартной формуле гаверсинусов. Координаты магазинов хранятся фиксированным списком в вашем собственном коде.
for store in stores:
store.distance_km = haversine(store.lat, store.lon, 40.7484, -73.9857)Отсортируйте список магазинов по рассчитанному расстоянию и покажите ближайший магазин или несколько ближайших вместе с расстоянием. Поскольку всё выполняется на сервере при отправке формы, никакой клиентский скрипт не нужен: страница просто выводит результат при следующей загрузке.
Если не ограничиваться одним ближайшим магазином, а отсортировать весь список и показать первые три, у посетителя появляется реальный выбор. Это особенно полезно, когда у самого ближайшего магазина другие часы работы или ассортимент, чем у чуть более дальнего, который посетитель на самом деле предпочёл бы. Это ничего не стоит дополнительно, поскольку сортировка выполняется по тем же координатам из того же единственного запроса.
Если введённый посетителем адрес возвращается с низкой оценкой достоверности, покажите ему отформатированный результат для подтверждения до расчёта расстояния, а не сообщайте уверенно расстояние, основанное на догадке о том, что он имел в виду.
Не выполняйте расчёт расстояния для запроса, который был распознан с гораздо более грубой точностью, чем, вероятно, имел в виду посетитель, например когда голое название города или региона совпало с результатом типа «locality», не предупредив об этом посетителя. Расстояние, рассчитанное от центра города, а не от реальной улицы посетителя, может отличаться на несколько километров в любую сторону, а этого достаточно, чтобы изменить, какой магазин окажется ближайшим. Проверка поля точности перед выводом уверенно звучащего расстояния позволяет не выдавать грубую оценку за точную.
Если задать limit больше 1 в запросе геокодирования, при действительно неоднозначном вводе, например названии улицы, которая есть в нескольких городах, вернутся несколько вариантов. Показать этот короткий список и дать посетителю выбрать нужный вариант до расчёта расстояния лучше, чем молча принять тот вариант, который случайно оказался первым.
Каждый расчёт равен одному запросу геокодирования, независимо от того, со сколькими магазинами вы сравниваете полученные координаты, поскольку сам список магазинов не требует дополнительных вызовов API после получения координат посетителя. Даже лендинг с заметным трафиком расходует на эту функцию один запрос на каждый расчёт для посетителя, что намного меньше 2 500 бесплатных запросов в день, входящих в каждый ключ.
Такой калькулятор расстояния отвечает на конкретный и частый вопрос прямо на странице, а не отправляет посетителя искать ответ в другом месте. Все параметры запроса описаны в документации по прямому геокодированию.