緯度・経度から球面三角形の面積を計算
この計算ツールは、球面上の3つの緯度・経度頂点に囲まれた表面積を求めます。座標を単位ベクトルへ変換し、最短の大円弧でできる3つの内角を測定して、ジラールの定理を適用します。角度の合計から180度を引いた値が球面過剰です。この値をラジアンにして半径の二乗を掛けると面積が得られます。既定の平均地球半径を利用することも、別の正の半径を指定することもできます。
無料で実行
3つの地理座標で三角形を指定します
境界に沿った順序で、緯度と経度を十進度数で持つ頂点をちょうど3つ入力してください。緯度は-90から90、経度は-180から180の範囲で指定します。結果は符号なし面積なので、時計回りでも反時計回りでも構いません。各辺は端点を結ぶ最短の大円弧として扱われ、平面地図上の直線や一定方位を保つ等角航路とは異なります。三角形が地球の広い範囲を占めるほど、この違いは重要です。既定の半径はIUGGの平均地球半径である6,371,008.8メートルです。そのため、主な結果は平方メートル、補助結果は平方キロメートルで表示されます。別の球体を扱う場合は、有限で正の半径をメートル単位で指定できます。頂点は互いに異なる必要があります。対蹠点の組は最短大円弧が一意に定まらず、同じ大円上で面積を囲まない点も有効な三角形にならないため、いずれもエラーとして扱われます。
球面過剰と出力される角度を確認します
平面三角形の内角の合計は必ず180度ですが、大円で囲まれた球面三角形では180度を超えます。その差を球面過剰と呼びます。この計算では、各緯度・経度の組を3次元の単位ベクトルへ変換します。各頂点において、残り2点への方向を局所接平面へ射影し、安定したatan2計算で間の角度を測ります。ラジアン単位の角度をA、B、Cとすると、球面過剰はE = A + B + C - piです。ジラールの定理により、面積はEに半径の二乗を掛けた値になります。応答には入力順の3つの角度と、度数で表した球面過剰が含まれますが、面積そのものはラジアンで計算されます。代表例として、赤道上で90度離れた2点と北極を結ぶ三角形では、3つの角度がすべて90度となり、球全体の8分の1を占めます。
球面モデルの結果を適切に利用します
結果は、指定した半径で表される球面モデルに対して、浮動小数点の丸めを除けば正確です。地球は完全な球ではないため、特に広い地域や測量精度が必要な用途では、WGS84楕円体上の測地面積と差が生じます。幾何学の学習、簡易的な地理面積の推定、惑星モデル、シミュレーション、座標を球面上で扱うシステムにご利用ください。地籍や法的な土地面積の測定には適しません。精度オプションは表示する小数桁を0から12の間で変更しますが、内部計算には影響しません。非常に細い三角形では通常の浮動小数点演算の限界に近づくため、球面過剰をゼロと区別できない場合は受け付けません。同じ座標、半径、精度からは常に同じ結果が得られ、ネットワーク、乱数、現在時刻には依存しません。ブラウザーでは無料で利用できる場合があり、自動化されたAPIリクエストには表示中の基本料金$0.002が適用されます。後から再現する必要がある場合は、結果と一緒に元の頂点も保存してください。
活用例
3地点で囲まれた地域を概算します
3つの位置を平面へ投影せず、間にある球面上の面積を測定します。
GISや航法の実装を検証します
内角、球面過剰、面積を決定論的な基準計算と比較できます。
別の天体上の三角形をモデル化します
惑星または抽象的な球の半径を指定し、対応する表面積を求めます。
よくある質問
どの公式を使用していますか?
ジラールの定理を使用します。面積は、ラジアン単位の球面過剰に半径の二乗を掛けた値です。
既定ではどの半径を使いますか?
IUGGの平均地球半径である6,371,008.8メートルを使います。別の正の半径をメートル単位で指定できます。
頂点の順序によって面積は変わりますか?
変わりません。時計回りと反時計回りのどちらでも同じ符号なし面積になり、各角度は入力した頂点の位置に対応します。
WGS84楕円体上の面積ですか?
いいえ、球面上の計算です。地球上で測量精度が必要な場合は、楕円体の測地計算法をご利用ください。
対蹠点や縮退した点が拒否されるのはなぜですか?
対蹠点間では最短大円弧が一意に定まらず、重複点や大円上に並ぶ点は正の面積を持つ三角形を囲まないためです。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/triangle-geodesic-area \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"vertices":[{"lat":0,"lon":0},{"lat":0,"lon":90},{"lat":90,"lon":0}]}'const res = await fetch("https://api.kit.forhosting.com/geo/triangle-geodesic-area", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"vertices": [
{
"lat": 0,
"lon": 0
},
{
"lat": 0,
"lon": 90
},
{
"lat": 90,
"lon": 0
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/triangle-geodesic-area",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"vertices": [
{
"lat": 0,
"lon": 0
},
{
"lat": 0,
"lon": 90
},
{
"lat": 90,
"lon": 0
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/triangle-geodesic-area", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"vertices":[{"lat":0,"lon":0},{"lat":0,"lon":90},{"lat":90,"lon":0}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"vertices":[{"lat":0,"lon":0},{"lat":0,"lon":90},{"lat":90,"lon":0}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/triangle-geodesic-area", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"vertices": [
{
"lat": 0,
"lon": 0
},
{
"lat": 0,
"lon": 90
},
{
"lat": 90,
"lon": 0
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.triangle_geodesic_area",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |