円形ジオフェンス判定
この円形ジオフェンス判定ツールは、緯度・経度で示した地点が、中心座標から指定した半径の内側、境界上、または外側のどこにあるかを求めます。Haversine公式で大円距離を計算し、その距離をメートル単位の半径と比較して、残りの余裕を表す符号付きマージンを返します。正のマージンは内側、ゼロは境界、負のマージンは外側までの超過距離を示します。計算は決定論的であり、地図サービス、端末検索、ネットワーク要求を必要としません。
無料で実行
地点、中心、半径を明確に指定します
円形ジオフェンスには、中心緯度、中心経度、メートル単位の負ではない半径という3つの基本要素があります。これとは別の地点緯度と地点経度で、判定対象の場所を指定します。すべての座標は一般的なWGS84の範囲に従う十進度で入力してください。緯度はマイナス九十から九十、経度はマイナス百八十から百八十です。投影座標、度分秒の文字列、換算していないキロメートル単位の半径は入力しないでください。たとえば、5キロメートルの配達区域ではradius_mを5000にします。半径ゼロも有効で、この場合は中心と座標が完全に一致する地点だけが内側です。欠損値、有限でない数、許容範囲外の座標、負の半径は、連携ミスを暗黙に修正せずエラーとして拒否します。日付変更線の両側にある経度もクライアント側の特別処理なしで利用できます。三角関数による距離式が、球面上の短い方の隔たりを自然に選ぶためです。
内外判定、距離、符号付きマージンを読み取ります
応答には4つの簡潔なフィールドがあります。計算距離が半径以下ならinsideは真になるため、境界に正確に位置する地点もジオフェンスに含まれます。distance_mは、半径6,371,000メートルの平均地球球面上で、中心から地点までの大円距離を表します。radius_mは検証済みの半径を再掲し、margin_mは半径から距離を差し引いた値です。この符号付きマージンは真偽値だけより詳しい判断材料になります。240なら約240メートルの余裕を残して内側、ゼロなら境界上、マイナス85なら約85メートル外側です。安定したシリアル化のため出力距離は小数点以下6桁に丸めますが、insideの判定には丸め前の完全な計算値を使用します。そのため、表示上の丸め値が実際の比較を変えることはありません。経路や課金の規則に利用する場合は、呼び出し前に運用上の余裕を決めるか、返されたマージンをご自身の安全しきい値と比較してください。
実際のジオフェンス処理で安全に利用します
円形判定は、到着検知、配達可否、近接機器の通知、おおまかな入場区域に適しています。ただし、法的な土地境界ではなく、道路、壁、高低差、建物の階、GPSの誤差も考慮しません。携帯電話の位置は数メートル以上揺れる場合があるため、本番環境では不可逆な処理を始める前に、複数回の測位、精度上限、またはヒステリシスを設けることが一般的です。たとえば到着処理では、margin_mが20メートルを超えたときだけ入場とし、マイナス20メートルを下回ったときだけ退場とすれば、境界付近の頻繁な状態変化を防げます。球面Haversineモデルは極や日付変更線の近くを含め世界中で一貫して高速ですが、楕円体による測量計算ではなく近似です。同じ入力からは常に同じ結果が得られます。処理系はネットワーク、現在時刻、乱数、外部地図データベースを使用しないためです。対話的な判定はブラウザーで実行でき、自動API要求は1回 $0.002 です。後日の監査で判断根拠が必要な場合は、結果とともに元の座標を保存してください。
活用例
配達対象の判定
顧客座標が店舗の配達半径内かを確認し、マージンを使って限界までの近さを説明できます。
到着・出発ロジック
端末の測位値をジオフェンスと比較し、正負のしきい値によって境界付近の揺れを抑えられます。
資産の近接通知
外部地図事業者に問い合わせず、報告された資産位置が監視区域へ入ったかを判断できます。
よくある質問
正のマージンは何を意味しますか?
地点がジオフェンス内にあり、margin_mは円形境界までに残っている距離を示します。
境界上の地点は内側に含まれますか?
はい。距離が半径以下なら内側とするため、正確な境界ではinsideが真、マージンがゼロになります。
どの単位を使用しますか?
半径、計算距離、マージンはすべてメートルです。緯度と経度は十進度で指定します。
どの距離公式を使いますか?
半径6,371,000メートルの平均地球球面に対してHaversine公式を使用します。
API判定の料金はいくらですか?
成功したAPI要求1回につき $0.002 です。決定論的なブラウザー実行機能でも対話的に判定できます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/geofence-circle-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"point_lat":40.73061,"point_lon":-73.935242,"center_lat":40.7128,"center_lon":-74.006,"radius_m":10000}'const res = await fetch("https://api.kit.forhosting.com/geo/geofence-circle-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"point_lat": 40.73061,
"point_lon": -73.935242,
"center_lat": 40.7128,
"center_lon": -74.006,
"radius_m": 10000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/geofence-circle-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"point_lat": 40.73061,
"point_lon": -73.935242,
"center_lat": 40.7128,
"center_lon": -74.006,
"radius_m": 10000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/geofence-circle-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"point_lat":40.73061,"point_lon":-73.935242,"center_lat":40.7128,"center_lon":-74.006,"radius_m":10000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"point_lat":40.73061,"point_lon":-73.935242,"center_lat":40.7128,"center_lon":-74.006,"radius_m":10000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/geofence-circle-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"point_lat": 40.73061,
"point_lon": -73.935242,
"center_lat": 40.7128,
"center_lon": -74.006,
"radius_m": 10000
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.geofence_circle_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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |