2D点群の軸平行最小外接長方形計算
この計算ツールは、入力されたすべての2次元点を含む最小の軸平行長方形を求めます。4つの頂点座標に加えて、幅、高さ、面積を返します。グラフ描画、空間インデックス、衝突判定、表示範囲の選択、データ検証などで使える簡潔な空間範囲を得られます。座標には負数、正数、整数、小数を使用でき、点が1つだけの場合や、すべての点が水平線または垂直線上にある場合も正しく計算できます。
無料で実行
軸平行の外接長方形とは
軸平行最小外接長方形とは、辺をx軸とy軸に平行に保ちながら、点群全体を含む最小の長方形です。xの最小値と最大値、yの最小値と最大値という4つの極値によって決まります。それぞれの極値が別々の点から得られる場合でも、その値が長方形の境界になります。そのため、点の順序、ポリゴンの形成、閉じた図形であることを仮定せずに、空間全体の範囲を表せます。頂点は左下、右下、右上、左上として返されます。幅はxの最大値から最小値を引いた値、高さはyの最大値から最小値を引いた値、面積は両者の積です。回転する外接ボックスとは異なり、データの向きに合わせて長方形を回転させません。この性質により、結果が予測しやすく、直交座標グラフ、canvas座標、各種の空間インデックスでそのまま利用できます。
点の準備と結果の読み方
少なくとも1つの点を、有限の数値フィールドxとyを持つオブジェクトとして指定してください。負数や小数も使用でき、重複した点は極値を変えないため受け付けます。すべての座標には同じ座標系と単位を使用してください。メートルとフィート、または投影座標と緯度経度を混在させると、物理的に一貫しない長方形になります。この計算は値を直交座標として扱い、日付変更線での経度の折り返し、地球の投影、地図単位の推定は行いません。点が1つなら4頂点は同一となり、幅、高さ、面積は0です。垂直線上の点群では幅が0、水平線上では高さが0となり、どちらも面積は正しく0になります。下はyの最小値、上はyの最大値を意味します。画面でyが下向きに増える場合は、計算ではなく表示側を変換してください。
空間処理での結果の活用
返される長方形は、多くの幾何処理で最初に使える簡潔な要約です。グラフでは極値座標から表示範囲を決め、必要に応じて余白を追加できます。空間検索では、点、線分、ポリゴンの詳細で高コストな判定を行う前に長方形同士を比較し、範囲が重ならない対象をすばやく除外できます。データ取込処理では幅、高さ、面積を品質指標として記録し、想定外に離れた点や潰れた次元を検出できます。アルゴリズムはリストを1回走査するため、実行時間は点数に対して線形であり、並べ替えや変更は不要です。同じ有限座標には常に同じ結果を返します。ただし、長方形の重なりは概略判定にすぎず、空隙、凹形状、点密度、回転を表しません。実際の形状が判断に必要な場合は、範囲や前処理フィルターとして使った後、精密な幾何演算を適用してください。
活用例
グラフの表示範囲を調整
余白と表示スケールを決める前に、散布図の正確な座標範囲を求めます。
空間検索の事前フィルター
詳細な交差判定や近接計算の前に、低コストな軸平行境界を比較します。
座標データの取込検証
地図や分析処理へ渡す前に、幅、高さ、面積が不自然な点群を検出します。
よくある質問
リクエスト料金はいくらですか?
APIリクエスト1回の料金は$0.002です。外部サービスを使わず、決定的なローカルアルゴリズムで計算します。
回転を許す最小外接長方形ですか?
いいえ。辺は常にx軸とy軸に平行で、面積を小さくするための回転は行いません。
点が1つだけの場合はどうなりますか?
4つの頂点はすべてその点と同じになり、幅、高さ、面積は0になります。
負数や小数の座標を使えますか?
はい。xとyには、負数や小数を含む任意の有限数値を指定できます。
緯度と経度を使用できますか?
単純な数値範囲には使用できますが、直交座標計算のため、日付変更線の折り返しや球面幾何には対応しません。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/min-bounding-rectangle \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"points":[{"x":-2,"y":3},{"x":4,"y":-1},{"x":1,"y":5}]}'const res = await fetch("https://api.kit.forhosting.com/geo/min-bounding-rectangle", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"points": [
{
"x": -2,
"y": 3
},
{
"x": 4,
"y": -1
},
{
"x": 1,
"y": 5
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/min-bounding-rectangle",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"points": [
{
"x": -2,
"y": 3
},
{
"x": 4,
"y": -1
},
{
"x": 1,
"y": 5
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/min-bounding-rectangle", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"points":[{"x":-2,"y":3},{"x":4,"y":-1},{"x":1,"y":5}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"points":[{"x":-2,"y":3},{"x":4,"y":-1},{"x":1,"y":5}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/min-bounding-rectangle", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"points": [
{
"x": -2,
"y": 3
},
{
"x": 4,
"y": -1
},
{
"x": 1,
"y": 5
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.min_bounding_rectangle",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_points | 100000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |