Guias

Restrinja o envio de formulários a um raio de entrega

Um serviço de entrega que só atende uma determinada área precisa de uma forma de rejeitar endereços fora dessa área antes de o pedido ser feito, e não depois que um entregador descobre isso durante o despacho.

Geocodificando o endereço enviado

Quando um cliente enviar o endereço de entrega, geocodifique-o antes de aceitar o pedido.

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": {}}
  ]
}

Comparando com a sua central

Com as coordenadas do cliente e as coordenadas fixas da sua central de entregas em mãos, calcule a distância em linha reta entre os dois pontos usando uma fórmula de haversine padrão no seu próprio código e compare-a com o seu raio de entrega.

distance_km = haversine(hub_lat, hub_lon, 51.5033, -0.1276)
if distance_km > max_radius_km:
    reject_order()

Verificando a confiança antes de rejeitar

Uma pontuação de confiança baixa no resultado de geocodificação significa que o próprio endereço era ambíguo, e não necessariamente que ele fica fora do seu raio. Trate uma correspondência de baixa confiança separadamente de uma rejeição clara por estar fora do raio, talvez pedindo ao cliente que confirme ou detalhe melhor o endereço, em vez de rejeitar o pedido de imediato.

Um segundo exemplo: escolher a mais próxima entre várias centrais

Uma empresa com mais de uma central de entregas deve calcular a distância até todas as centrais, e não apenas até uma, e aceitar o pedido se o raio de qualquer uma delas cobrir o endereço. Atribuir o pedido à central que ficou mais próxima também já configura corretamente o lado do atendimento a partir do mesmo cálculo, já que você já sabe qual é a central vencedora depois de ordenar por distância.

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()

Um erro comum a evitar

Não rejeite um pedido no instante em que distance_km ultrapassar max_radius_km por uma margem insignificante, como algumas dezenas de metros, sem dar ao cliente nenhuma explicação ou alternativa. Um endereço praticamente em cima da linha de fronteira é um resultado normal de desenhar um raio em um mapa, e uma rejeição seca, sem contexto, parece arbitrária para um cliente que mora a duas ruas de uma linha que ele não consegue ver. Mostrar a distância calculada e o raio coberto, em vez de uma rejeição pura e simples, pelo menos explica o motivo.

Raio em linha reta versus cobertura real

Um raio em linha reta é uma aproximação simples e, às vezes, vai incluir um ponto que na prática fica longe pela estrada, ou excluir um que fica perto pela estrada mas longe em linha reta, como do outro lado de um rio sem ponte próxima. Para a maioria das verificações de zona de entrega, essa aproximação é boa o bastante, e refiná-la exigiria dados de rotas além do que uma consulta de geocodificação oferece.

Quanto custa

Cada verificação de endereço é uma requisição de geocodificação, ou uma requisição por central candidata comparada se você verificar o endereço em relação a uma lista de centrais por meio de chamadas separadas em vez de reutilizar localmente as mesmas coordenadas, já que só o próprio endereço precisa ser geocodificado, e não cada central. Um formulário de entrega que verifica todos os pedidos enviados fica bem dentro das 2.500 requisições gratuitas por dia incluídas em cada chave para um negócio local típico, passando para o crédito pré-pago apenas quando o volume de pedidos cresce de forma considerável.

Rejeitar um pedido fora da área no momento do envio, e não no despacho, poupa os dois lados de uma conversa inútil depois. Os detalhes completos dos parâmetros estão na documentação de geocodificação direta, e as faixas de preço atuais estão na página de preços.