住所が配達拠点のサービス半径内か確認
住所が配達エリア内かを一度で判定できます。拠点から直線で6.283267 km離れた住所は、半径10 kmの範囲内です。拠点と住所の座標、半径を入力してください。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 拠点の緯度
- 40.7128
- 拠点の経度
- -74.006
- 住所の緯度
- 40.73061
- 住所の経度
- -73.935242
- 最大半径 (km)
- 10
- 距離 (km)
- 6.283267
配送可否を決める際には、指定住所が担当拠点から十分近いかという確認が必要です。拠点の緯度と経度、配送先の緯度と経度、最大半径をキロメートルで入力してください。両方の座標を検証し、直線的な大円距離を計算して、範囲内かどうかと実測距離を返します。結果は決定論的で、地図事業者を必要とせず、決済時の確認、配車前の絞り込み、再現可能な運用規則に利用できます。
配送範囲の判定方法
拠点を円形サービス区域の中心、入力された最大半径を境界として扱います。Haversine式と固定の平均地球半径6371.0088キロメートルを用い、拠点から住所までの地表上の最短距離を計算します。これは大円距離であり、一般に直線距離とも呼ばれます。
境界判定には表示値ではなく内部の完全な値を使います。道路、橋、河川、交通、通行制限、手描きの区域ポリゴンは確認しません。商用ルールが実際に半径基準である場合、または高価な経路・区域システムへ送る前の低コストな一次絞り込みとしてご利用ください。
座標の準備と検証エラー
緯度は-90から90、経度は-180から180の十進度で、両端を含みます。半径は0以上である必要があり、0の場合は拠点と同一座標だけが対象です。緯度と経度の入れ替えはよくある連携ミスです。
一部の経度は緯度の範囲にも収まるため、検証を通って別の場所を示す場合があります。ジオコーディング、保存、要求で同じ順序を維持してください。投影座標のメートル値、郵便番号、生の住所ではなく、十進度の地理座標を使用します。
事前に住所を座標化し、用途に適した精度を保持してください。有効な点が意図した建物や入口に一致するかまでは確認できません。
決済と配車での安全な利用
複数拠点がある場合は各拠点を評価し、falseを除外して、距離、在庫、負荷、予定時間で残りを順位付けします。半径内でも走行可能な経路や配送成功は保証されません。海岸、通行規制、有料区間、フェリー、入場制限施設、地域別の営業区域により、近い地点でも配送が難しい場合があります。
その際は経路またはポリゴン判定を追加してください。半径は明示的な事業方針で定めます。ネットワーク、乱数、現在時刻を使用しないため、同じ要求は同じ結果になります。
項目の逆転や不完全なジオコーディングによる検証エラーは、範囲外扱いにせずデータ源で修正してください。
活用例
決済時の配送可否判定
当日配送や地域配送を提示する前に、座標化した住所が拠点から十分近いかを判定します。
最寄りの対象拠点選択
住所を複数拠点と比較し、半径外を除いて、在庫や負荷により残りを順位付けします。
配車データの品質管理
保存済みの拠点と配送先の座標を検証し、再現可能な距離と判定を記録します。
よくある質問
距離は道路に沿って計算されますか?
いいえ。 地表上の大円距離です。道路距離、交通、障害、通行制限には経路検索サービスが必要です。
座標の代わりに住所を送れますか?
いいえ。 先に住所を座標化し、その十進度の緯度と経度を拠点座標とともに送信してください。
半径ちょうどの距離にある住所は範囲内ですか?
はい。距離が半径以下なら範囲内と判定します。比較には丸める前の距離をそのまま使うため、画面に表示される端数処理で判定が変わることはありません。
緯度と経度を逆に入力するとどうなりますか?
多くの経度は緯度の範囲にも収まるため、逆にした組み合わせでも有効に見えることがありますが、別の場所を指してしまいます。ジオコーディングから保存、この確認まで、同じ順番を守ってください。
複数の拠点がある場合はどう確認しますか?
有効な拠点ごとに住所を判定し、範囲外の結果を除いてから、残った拠点を距離、在庫、作業量、約束した配達時間などで並べてください。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/ecom/last-mile-delivery-zone-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"hub_lat":40.7128,"hub_lon":-74.006,"address_lat":40.73061,"address_lon":-73.935242,"max_radius_km":10}'const res = await fetch("https://api.kit.forhosting.com/ecom/last-mile-delivery-zone-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"hub_lat": 40.7128,
"hub_lon": -74.006,
"address_lat": 40.73061,
"address_lon": -73.935242,
"max_radius_km": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/ecom/last-mile-delivery-zone-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"hub_lat": 40.7128,
"hub_lon": -74.006,
"address_lat": 40.73061,
"address_lon": -73.935242,
"max_radius_km": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/ecom/last-mile-delivery-zone-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"hub_lat":40.7128,"hub_lon":-74.006,"address_lat":40.73061,"address_lon":-73.935242,"max_radius_km":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"hub_lat":40.7128,"hub_lon":-74.006,"address_lat":40.73061,"address_lon":-73.935242,"max_radius_km":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/ecom/last-mile-delivery-zone-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"hub_lat": 40.7128,
"hub_lon": -74.006,
"address_lat": 40.73061,
"address_lon": -73.935242,
"max_radius_km": 10
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "ecom.last_mile_delivery_zone_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
配送範囲の判定方法
丸め前の計算値が最大半径以下ならwithin_zoneはtrue、それ以外はfalseです。応答には小数点以下6桁に丸めたdistance_kmと、記録を明確にするmax_radius_kmも含まれます。
座標の準備と検証エラー
有限の数値hub_lat、hub_lon、address_lat、address_lon、max_radius_kmを指定してください。欠損値、数値でない文字列、無限値、範囲外の座標は、誤った判定ではなくinvalid_inputを返します。
決済と配車での安全な利用
決済時には住所を座標化した後で実行し、within_zoneを配送提案の判断材料の一つとしてお使いください。distance_kmを注文監査記録に残すと、表示理由を後から説明できます。成功したAPI項目ごとの料金は$0.002です。
技術的な質問
半径の境界上にある住所も含まれますか?
はい。完全な計算距離がmax_radius_km以下ならwithin_zoneはtrueです。
座標が無効な場合はどうなりますか?
緯度または経度が欠損、非有限、範囲外の場合は、距離や判定ではなくinvalid_inputを返します。
1回の確認料金はいくらですか?
成功したAPI項目ごとの料金は$0.002です。計算は決定論的で、外部の地図事業者を呼び出しません。