Следите за использованием ключа, пока не упёрлись в лимит
Наблюдение за заголовками квоты по ходу работы показывает приближение к лимиту задолго до того, как запрос будет отклонён.
Службе доставки, которая обслуживает только определённую территорию, нужен способ отклонять адреса за её пределами до оформления заказа, а не после того, как водитель обнаружит это при отправке.
Когда клиент отправляет адрес доставки, геокодируйте его, прежде чем принять заказ.
GET /v1/forward?q=10 Downing Street, London&limit=1{
"status": "ok",
"results": [
{"formatted": "10 Downing Street, London, UK", "lat": 51.5033, "lon": -0.1276, "type": "address", "precision": "house", "confidence": 0.96, "place_id": "op678", "components": {}}
]
}Имея координаты клиента и фиксированные координаты вашего хаба доставки, вычислите расстояние по прямой между ними с помощью стандартной формулы гаверсинуса в своём коде и сравните его с радиусом доставки.
distance_km = haversine(hub_lat, hub_lon, 51.5033, -0.1276)
if distance_km > max_radius_km:
reject_order()Низкая оценка уверенности в результате геокодирования означает, что неоднозначным был сам адрес, а не обязательно что он находится за пределами вашего радиуса. Обрабатывайте сопоставление с низкой уверенностью отдельно от однозначного отклонения за пределами радиуса, например попросите клиента подтвердить или уточнить адрес, а не отклоняйте заказ сразу.
Компании с несколькими хабами доставки следует вычислять расстояние до каждого хаба, а не до одного, и принимать заказ, если адрес попадает в радиус любого хаба. Назначение заказа ближайшему хабу по тому же расчёту заодно правильно настраивает и сторону исполнения заказа, поскольку после сортировки по расстоянию вы уже знаете, какой хаб оказался ближайшим.
nearest_hub = min(hubs, key=lambda h: haversine(h.lat, h.lon, cust_lat, cust_lon))
if nearest_hub.distance_km > nearest_hub.max_radius_km:
reject_order()Не отклоняйте заказ в тот же миг, когда distance_km превышает max_radius_km на ничтожную величину, например на несколько десятков метров, не давая клиенту никаких объяснений или возможности что-то сделать. Адрес, находящийся практически на границе, это нормальное следствие того, что радиус нарисован на карте, и категорический отказ без пояснений выглядит произвольным для клиента, который живёт в двух улицах от линии, которую он не видит. Если показать рассчитанное расстояние и обслуживаемый радиус вместо голого отказа, это хотя бы объяснит причину.
Радиус по прямой является простым приближением и иногда включает точку, которая по дорогам на самом деле далеко, или исключает точку, которая по дорогам близко, но далеко по прямой, например на другом берегу реки без ближайшего моста. Для большинства проверок зоны доставки такого приближения достаточно, а для дальнейшего уточнения потребовались бы данные маршрутизации, выходящие за рамки того, что даёт запрос геокодирования.
Каждая проверка адреса это один запрос геокодирования, или по одному запросу на каждый сравниваемый хаб, если вы проверяете адрес по списку хабов отдельными вызовами, а не используете повторно те же координаты локально, ведь геокодировать нужно только сам адрес, а не каждый хаб. Форма доставки, проверяющая каждый отправленный заказ, у типичного местного бизнеса с запасом укладывается в 2 500 бесплатных запросов в день, входящих в каждый ключ, и переходит на предоплаченный баланс, только когда объём заказов существенно вырастет.
Отклонение заказа за пределами зоны в момент отправки формы, а не при отправке курьера, избавляет обе стороны от бесполезного разговора в будущем. Полное описание параметров приведено в документации по прямому геокодированию, а актуальные тарифы на странице цен.