Guías

Limita el envío de formularios a un radio de entrega

Un servicio de reparto que solo cubre una zona determinada necesita una forma de rechazar las direcciones que quedan fuera de esa zona antes de que se haga el pedido, no después de que un repartidor lo descubra durante el despacho.

Geocodificar la dirección enviada

Cuando un cliente envíe su dirección de entrega, geocodifícala antes de aceptar el 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": {}}
  ]
}

Comparación con tu centro de distribución

Con las coordenadas del cliente y las coordenadas fijas de tu centro de distribución, calcula la distancia en línea recta entre ambas con una fórmula del haversine estándar en tu propio código y compárala con tu radio de entrega.

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

Comprobar la confianza antes de rechazar

Una puntuación de confianza baja en el resultado de geocodificación significa que la propia dirección era ambigua, no necesariamente que quede fuera de tu radio. Gestiona una coincidencia de baja confianza por separado de un rechazo claro por estar fuera del radio, por ejemplo pidiendo al cliente que confirme o precise su dirección en lugar de rechazar el pedido directamente.

Un segundo ejemplo: elegir el más cercano de varios centros

Un negocio con más de un centro de distribución debería calcular la distancia a todos los centros, no solo a uno, y aceptar el pedido si el radio de cualquiera de ellos cubre la dirección. Asignar el pedido al centro que resulte más cercano también deja bien preparada la parte de preparación de pedidos con el mismo cálculo, ya que conoces el centro ganador en cuanto ordenas por distancia.

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

Un error habitual que debes evitar

No rechaces un pedido en el instante en que distance_km supere max_radius_km por una cantidad insignificante, como unas pocas decenas de metros, sin dar al cliente ninguna explicación ni alternativa. Una dirección situada prácticamente sobre la línea del límite es un resultado normal de trazar un radio en un mapa, y un rechazo tajante sin contexto le parece arbitrario a un cliente que vive a dos calles de una línea que no puede ver. Mostrar la distancia calculada y el radio cubierto, en lugar de un simple rechazo, al menos explica el motivo.

Radio en línea recta frente a cobertura real

Un radio en línea recta es una aproximación sencilla y en ocasiones incluirá un punto que técnicamente está lejos por carretera, o excluirá uno que está cerca por carretera pero lejos en línea recta, como al otro lado de un río sin ningún puente cercano. Para la mayoría de las comprobaciones de zona de reparto, esta aproximación es suficiente, y refinarla más requeriría datos de rutas que van más allá de lo que ofrece una consulta de geocodificación.

Lo que cuesta

Cada comprobación de dirección es una solicitud de geocodificación, o una solicitud por cada centro candidato comparado si compruebas la dirección contra una lista de centros mediante llamadas separadas en lugar de reutilizar las mismas coordenadas en local, ya que solo hay que geocodificar la propia dirección, no cada centro. Un formulario de reparto que comprueba cada pedido enviado se mantiene holgadamente dentro de las 2.500 solicitudes gratuitas al día incluidas con cada clave en un negocio local típico, y solo pasa a crédito prepago cuando el volumen de pedidos crece considerablemente.

Rechazar un pedido fuera de zona en el momento del envío del formulario, y no en el despacho, ahorra a ambas partes una conversación inútil más adelante. Todos los detalles de los parámetros están en la documentación de geocodificación directa, y los niveles de precios actuales están en la página de precios.