船首方位から相対方位を計算する航海用ツール
この相対方位計算ツールは、目標の真方位を船首から見た角度へ変換します。目標までの真方位と船舶の真船首方位を、いずれも真北から時計回りの度数で入力してください。結果は 0–360 度の全周表記に正規化され、目標が前方、後方、左舷側、右舷側のどこにあるかも示します。航海訓練、見張り報告、レーダー情報の確認、船首基準の観測値の検算にご利用いただけます。北をまたぐ引き算も自動で処理するため、負の値を手作業で直す必要はありません。
無料で実行
相対方位が示す内容
真方位と相対方位は、同じ視線方向を異なる基準で表したものです。真方位は真北から時計回りに測り、相対方位は船首から時計回りに測ります。本ツールは、目標の真方位から船舶の船首方位を引いて基準を変換します。結果が 0 度なら目標は正船首、90 度なら右舷正横、180 度なら正船尾、270 度なら左舷正横です。その間の値によって船体周囲の方向を細かく表せます。見張り員は船首を基準に報告する一方、海図や航海センサーは北を基準にすることがあるため、この区別は重要です。target_side も数値の確認に役立ちます。0 より大きく 180 より小さい値は右舷側、180 より大きく 360 より小さい値は左舷側として返します。
北をまたぐ計算方法
基本式は、相対方位 = 真方位 − 船首方位です。目標の真方位が船首方位より数値上小さい場合、単純な引き算では負の値になります。しかし方向が無効なのではなく、0 度の北をまたいだことを意味します。本ツールは 360 度を加えてから modulo 360 を適用し、0 以上 360 未満の一般的な範囲に直します。たとえば船首方位が 350 度、目標の真方位が 45 度なら、相対方位は 55 度となり、目標は右舷前方です。北は 0 と 360 のどちらでも入力でき、結果では 0 に正規化されます。小数の度数にも対応し、安定した結果を得るため出力は小数点以下6桁に丸めます。両方の入力は、公開範囲 0–360 度内の有限数でなければなりません。
結果を正しく利用するために
入力する2つの角度が、どちらも真北を基準としていることをご確認ください。磁気船首方位と真方位を組み合わせると基準が混在し、もっともらしくても誤った結果になります。偏差や自差が関係する場合は、先に磁気値を真方位へ換算してください。また、船首方位は船首が向いている方向であり、風、潮流、リーウェイがある場合の対地針路とは一致しないことがあります。出力は符号付き角度ではなく、時計回りの 0–360 表記です。そのため 315 度は左舷へ 45 度を意味します。target_side がこの曖昧さを補います。計算は即時かつ決定的で、訓練問題、船橋ソフトウェアの確認、ログ処理、1回 $0.002 の API 自動処理に適しています。距離、衝突危険度、最接近点は算出しません。
活用例
海図上の方位を変換
海図やセンサーで得た真方位を、見張り員が船首から時計回りに報告する角度へ変換します。
航海計算問題を検算
引き算が北をまたいで負になる場合も含め、相対方位の計算結果を確認できます。
船橋の観測記録を統一
船首方位と真方位の記録を、ログや分析に使える一貫した 0–360 度の相対方位へ変換します。
よくある質問
どの計算式を使用しますか?
真方位から船首方位を引き、その差を 0 以上 360 度未満の範囲に正規化します。
相対方位 270 度は何を意味しますか?
目標が左舷正横、つまり船首から左舷側へ 90 度の位置にあることを意味します。
磁気方位と真方位を混在させてもよいですか?
できません。両方の角度は同じ北基準でなければならず、本機能は真方位と真船首方位を想定しています。
衝突危険度や距離も計算できますか?
できません。船首に対する方向のみを計算し、距離、速力、針路変更、最接近点のデータは使用しません。
API の利用料金はいくらですか?
API は1回 $0.002 です。Tier A 機能としてブラウザー内でもローカル実行できます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/relative-bearing \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"true_bearing":45,"vessel_heading":350}'const res = await fetch("https://api.kit.forhosting.com/geo/relative-bearing", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"true_bearing": 45,
"vessel_heading": 350
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/relative-bearing",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"true_bearing": 45,
"vessel_heading": 350
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/relative-bearing", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"true_bearing":45,"vessel_heading":350}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"true_bearing":45,"vessel_heading":350}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/relative-bearing", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"true_bearing": 45,
"vessel_heading": 350
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.relative_bearing",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |