等角航路の中間点計算
等角航路(ローム線)は、すべての子午線を同じ方位角で横切る経路です。この計算機は、指定された2組の緯度・経度を結ぶ一定方位の経路上で、距離が半分になる座標を求めます。座標を単純平均せず、球面上の等角航法を用いるため、長距離の経路や日付変更線をまたぐ経路でも意味のある結果になります。十進度の座標と出力精度を入力すると、航法計算、地図処理、経路ラベル、独立検証に使える正規化済みの中間点が返されます。
無料で実行
等角航路の中間点が表すもの
ここで返される点は、球面上の等角航路に沿って半分進んだ位置です。大圏弧の中間点でも、2組の緯度・経度をそれぞれ算術平均した点でもありません。等角航路は複数の子午線を横切る間も一定のコンパス方位を保ちます。この性質は伝統的な海上航法で重視され、固定方位で意図的に定義された経路を扱う現在の用途でも有効です。球面モデルでは緯度は一様に変化しますが、経度はメルカトル幾何で使われる対数変換、すなわち等長緯度を通じて評価する必要があります。同じ経度差でも緯度によって地表距離が異なるため、この区別は重要です。短い局地経路では複数の方法がほぼ同じに見えても、南北に長い区間や高緯度では差が明確になります。一定方位の経路を求める場合にこの結果をお使いください。最短の地表弧が必要な場合は、大圏中間点を計算する別の方法が適切です。
座標の入力方法と結果の読み方
始点の緯度と経度を lat1、lon1 に、終点を lat2、lon2 に入力してください。座標は十進度で指定します。緯度は赤道より南が負、北が正で、経度はグリニッジより西が負、東が正です。経度には通常範囲である −180 から 180 度の両端を指定できます。極点では等長緯度の式が特異になるため、正確な北極・南極の緯度は受け付けませんが、極に近い値は有効です。応答の lat と lon が等角航路の中間点を示します。経度は標準範囲に正規化されます。これは、最短側の一定方位経路が日付変更線を横切る場合に特に重要です。たとえば東経170度から西経170度への経路は、グリニッジを回るのではなく180度付近を通ります。任意の精度欄では小数点以下0桁から12桁まで選べます。この設定は表示と丸めだけを変え、幾何モデルや測量精度を変更するものではありません。
計算方法、前提、実用上の制限
この計算は地球を球として扱い、標準的な等角航路の中間点関係式を適用します。まず両方の緯度をラジアンへ変換して中間緯度を取り、次にメルカトル投影係数の対数を比較して対応する経度を求めます。両端の緯度が実質的に同じ場合、対数式の分母が0に近づくため、展開済み経度の中間値を使用します。日付変更線を横切る場合は、計算前に短い側の経度区間へ展開し、最後に経度を再び正規化します。処理は決定論的であり、ネットワーク、保存された経路データ、乱数、現在時刻を使用しません。球面解は、航法の概算、地図注記、学習、整合性確認に適しています。一方、高精度の物理測位では楕円体のほうが地球を適切に表すため、地籍測量や測地測量の代用にはなりません。また、赤道や子午線などの特別な経路を除き、等角航路は一般に大圏経路より長くなります。APIの1回の料金は $0.002 です。
活用例
一定方位経路へラベルを配置
等角航路区間の実際の中間座標に、経路ラベルや注記を配置できます。
海上航法の計算を確認
海図・航法システムの中間点を、独立した決定論的な球面計算結果と比較できます。
等角航路区間を分割
返された座標を境界として、一定方位の2区間に分けて処理できます。
よくある質問
2つの座標を平均する方法と同じですか?
いいえ。球面等角航法では緯度は中間になりますが、経路上の半分に置くため、経度は等長緯度から求めます。
大圏航路の中間点と同じですか?
通常は異なります。等角航路は一定方位を保ちますが、大圏は球面上の最短弧をたどります。
日付変更線を横切る場合はどうなりますか?
短い側の経度区間へ展開して中間点を求め、結果を −180 から 180 度へ正規化します。
北極または南極を入力できますか?
いいえ。等長緯度が極で特異になるため、正確な −90 度と 90 度は受け付けません。
APIの利用料金はいくらですか?
1回のリクエストは $0.002 です。ブラウザー版も同じ決定論的な中核ロジックを使います。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/rhumb-midpoint \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"lat1":51.5074,"lon1":-0.1278,"lat2":40.7128,"lon2":-74.006}'const res = await fetch("https://api.kit.forhosting.com/geo/rhumb-midpoint", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"lat1": 51.5074,
"lon1": -0.1278,
"lat2": 40.7128,
"lon2": -74.006
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/rhumb-midpoint",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"lat1": 51.5074,
"lon1": -0.1278,
"lat2": 40.7128,
"lon2": -74.006
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/rhumb-midpoint", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"lat1":51.5074,"lon1":-0.1278,"lat2":40.7128,"lon2":-74.006}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"lat1":51.5074,"lon1":-0.1278,"lat2":40.7128,"lon2":-74.006}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/rhumb-midpoint", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"lat1": 51.5074,
"lon1": -0.1278,
"lat2": 40.7128,
"lon2": -74.006
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.rhumb_midpoint",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |