地点間の大圏距離行列を計算
最大200地点のすべての組み合わせの大圏距離を、キロメートルで1つの表にします。3地点なら3×3の表になり、対角は0、各距離は対称の位置にも入ります。行と列は入力順のままです。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
地点間距離行列計算では、順序付きの緯度・経度リストから、すべての組み合わせについて大圏距離をキロメートル単位で求めます。配送経路の準備、地点のクラスタリング、近接性の分析など、実際の経路を選ぶ前の基礎データとして利用できます。出力では入力順を維持し、対角要素をゼロにして、各距離を反対側へ正確に反映します。外部サービスへの問い合わせは行わないため、同じ座標からは常に同じ結果が得られます。
必要な順序で座標を準備します
2個から200個までの地点を指定し、各地点に十進度の数値として<code>lat</code>と<code>lon</code>を含めてください。緯度は-90から90、経度は-180から180の範囲である必要があります。リスト内の位置が結果の行番号と列番号になるため、計算前に一貫した順序を決めておくことが重要です。
たとえば配送拠点を先頭に置き、その後に配達先を並べると、行ゼロには拠点から各配達先までの距離が入り、列ゼロには逆向きの同じ値が入ります。この機能は地点の並べ替え、統合、ジオコーディング、名称付与を行いません。利用者側の識別子は座標リストと一緒に保存し、配列のインデックスで対応付けてください。
同一座標を複数指定することもでき、業務上は別の訪問先であっても距離は正しくゼロになります。表計算データでは緯度列と経度列が入れ替わっている場合があるため、入力元を事前に確認することをおすすめします。
対称行列の計算方法を確認します
各地点の一意な組み合わせを、平均地球半径6,371.0088キロメートルとHaversine公式で評価します。この公式は球体上の2点を結ぶ短い弧、つまり大圏距離を求めます。実装では行列の上三角部分だけを計算し、各値を鏡像位置へコピーして、対角要素を厳密にゼロへ設定します。
そのため、末尾の桁がずれる可能性のある浮動小数点計算を2回行わずに対称性を保証できます。大圏距離は地理上の直線距離であり、自動車、徒歩、鉄道、船舶の実経路ではありません。地形、進入制限、一方通行、橋、国境などは考慮しません。
分析用のコスト行列、初期ヒューリスティック、候補の絞り込みにお使いください。実際の所要時間や走行距離が必要な場合は、選択した組み合わせを道路経路サービスで追加処理してください。
結果を適切に活用します
地理的距離には方向がないため、逆向きの要素も同じ値になります。この形式は、クラスタリング、最近傍の選択、最小全域木、施設候補の比較、巡回セールスマン問題の初期解などへ直接入力できます。行列の容量は地点数の二乗で増え、200地点では40,000個の数値セルになるため、入力には上限があります。
さらに大きな集合は地域ごとに分割するか、必要な組み合わせだけを計算してください。最適化処理ではコスト行列として使えますが、道路が存在するとは判断できません。インデックスを追跡できるよう、元の順序付き座標も結果と一緒に保存してください。
活用例
配送順序の初期解を作る
道路経路を詳しく取得する前に、最近傍法や挿入法が必要とする地点間コスト表を作成します。
施設候補を比較する
倉庫と対象地点の全距離を順序付き行列で測定し、立地分析に利用します。
近い訪問先をまとめる
キロメートル距離を、しきい値、グラフ、近接性に基づくクラスタリングの再現可能な入力にします。
よくある質問
自動車での走行距離ですか?
いいえ。 球体上の大圏距離であり、道路や通行制限は反映されません。
なぜ行列は対称なのですか?
地点Aから地点Bまでの距離と、その逆方向の距離が等しいため、鏡像位置の値も一致します。
何地点まで送信できますか?
1回につき2地点から200地点まで指定できます。この上限により二乗で増える計算量と応答サイズを抑えます。
距離の計算にはどの式と地球半径を使いますか?
ハーバーサイン公式と、平均地球半径6371.0088 kmの球を使います。2地点を結ぶ最短の弧、つまり大圏距離を求めます。
表のどの行がどの地点か、どう分かりますか?
行と列の並びは入力した順番のままです。地点に名前は付かないので、手元の一覧で同じ順番の名前や番号を対応させてください。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/distance-matrix \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"points":[{"lat":40.7128,"lon":-74.006},{"lat":51.5074,"lon":-0.1278},{"lat":35.6762,"lon":139.6503}]}'const res = await fetch("https://api.kit.forhosting.com/geo/distance-matrix", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"points": [
{
"lat": 40.7128,
"lon": -74.006
},
{
"lat": 51.5074,
"lon": -0.1278
},
{
"lat": 35.6762,
"lon": 139.6503
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/distance-matrix",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"points": [
{
"lat": 40.7128,
"lon": -74.006
},
{
"lat": 51.5074,
"lon": -0.1278
},
{
"lat": 35.6762,
"lon": 139.6503
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/distance-matrix", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"points":[{"lat":40.7128,"lon":-74.006},{"lat":51.5074,"lon":-0.1278},{"lat":35.6762,"lon":139.6503}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"points":[{"lat":40.7128,"lon":-74.006},{"lat":51.5074,"lon":-0.1278},{"lat":35.6762,"lon":139.6503}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/distance-matrix", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"points": [
{
"lat": 40.7128,
"lon": -74.006
},
{
"lat": 51.5074,
"lon": -0.1278
},
{
"lat": 35.6762,
"lon": 139.6503
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.distance_matrix",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_items | 200 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
対称行列の計算方法を確認します
安定したJSONを得るため、結果は小数点以下6桁に丸めます。
結果を適切に活用します
応答には<code>point_count</code>、固定単位の<code>km</code>、正方行列の<code>distances_km</code>が含まれます。<code>distances_km[i][j]</code>は、入力地点<code>i</code>から地点<code>j</code>までの距離です。ネットワークを使わない純粋計算なので、同じJSONに対する結果は再現可能です。
技術的な質問
1回の料金はいくらですか?
APIは1回$0.002です。ブラウザー版はAPIを呼び出さず、端末内で無料実行できます。
行列の単位は何ですか?
すべての値はキロメートル単位で、応答にも単位が明記されます。