上限に達する前にキーの使用状況を監視する
割り当てヘッダーを随時確認しておけば、リクエストが実際に拒否されるよりずっと前に、上限が近づいていることが分かります。
特定のエリアだけを対象とする配達サービスには、配車時にドライバーが気づいてからではなく、注文が確定する前に、そのエリア外の住所を拒否する仕組みが必要です。
顧客が配送先住所を送信したら、注文を受け付ける前にジオコーディングします。
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()ジオコーディング結果の信頼度スコアが低い場合、それは住所そのものが曖昧だったという意味であり、必ずしも半径外にあるという意味ではありません。信頼度の低い一致は、明確に半径外であることによる拒否とは分けて扱い、注文をすぐに拒否するのではなく、たとえば顧客に住所の確認や修正を求めるようにします。
複数の配達拠点を運営している事業者は、1つだけでなくすべての拠点までの距離を計算し、いずれかの拠点の半径がその住所をカバーしていれば注文を受け付けるべきです。最も近い結果となった拠点に注文を割り当てれば、同じ計算からフルフィルメント側も正しく設定できます。距離で並べ替えた時点で、選ばれた拠点がどこかはすでにわかっているからです。
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本外れた通りに住む顧客にとって、何の文脈もない一律の拒否は恣意的に映ります。単に拒否するのではなく、計算した距離とカバーしている半径を表示すれば、少なくとも理由は伝わります。
直線の半径は単純な近似であり、道路で行くと実際には遠い地点を含めてしまったり、近くに橋のない川の向こう側のように、道路では近いのに直線では遠い地点を除外してしまったりすることがあります。ほとんどの配達エリアのチェックではこの近似で十分であり、これ以上精度を高めるには、ジオコーディングの検索が提供する範囲を超えるルーティングデータが必要になります。
住所のチェックは1件につき1回のジオコーディングリクエストです。ジオコーディングが必要なのは住所だけで、各拠点ではないため、同じ座標を手元で再利用するのではなく、別々の呼び出しで拠点リストと照合する場合にのみ、比較する候補拠点ごとに1リクエストになります。一般的な地域の事業者であれば、送信されたすべての注文をチェックする配達フォームでも、すべてのキーに含まれる2,500件の1日あたりの無料リクエストの範囲に十分収まり、注文量が大幅に増えたときに初めてプリペイドクレジットに移行します。
エリア外の注文を配車時ではなく送信時に拒否すれば、後で双方が無駄なやり取りをせずに済みます。パラメーターの詳細はジオコーディングのドキュメントに、現在の料金体系は料金ページに記載されています。