測地線に等間隔の緯度・経度頂点を追加
地理的な線の各セグメントに、緯度・経度の中間頂点を挿入して高密度化します。順序付きの線とメートル単位の最大間隔を指定すると、短い方の大円弧に沿って補間し、生成後の区間が指定値を超えないようにします。元の頂点と順序は保たれます。点数や距離の集計も返されるため、デスクトップGISを使わずに、結果の確認、地図表示、後続の空間処理への受け渡しを行えます。
無料で実行
後続処理に合う間隔を指定します
線の高密度化は、元のジオメトリよりも細かい間隔で標本点が必要な場合に役立ちます。まず、latとlonを含むレコードを順序付きで用意し、許容する最大間隔をメートル単位でspacing_mに指定します。計算では元の各セグメントを個別に評価します。すでに指定間隔より短ければ、不要な点を追加せず、1区間のまま保持します。長ければ、最大値を守れる最小の整数個数に分割し、同じ長さの測地線区間を作ります。つまり、指定値は上限であり、すべての間隔をその値と完全に一致させる指定ではありません。セグメントごとに分割するため、元の終点は保持され、次のセグメントはその元頂点から正確に始まります。概略地図には大きめの値を、標高・電波範囲の照会、アニメーション、短い辺を前提とする計算には小さめの値をお選びください。極端に小さい値は大量の点を生むため、出力上限を超える要求は線を黙って切り捨てず、エラーとして返します。
球面上の測地計算を理解します
連続する2座標は、球面上の1セグメントを定義します。アルゴリズムは両端点を3次元の単位ベクトルへ変換し、中心角を測定して、短い方の大円弧に沿って補間します。距離はその角度にearth_radius_mを掛けた値で、既定値には慣用的な平均地球半径を使用します。この方法は日付変更線付近も適切に扱います。東経179度から西経179度への線は、地球を大回りせず、日付変更線を横切る短い経路になります。また、緯度・経度を平面直交座標として扱わないため、長距離や極付近で目立つ誤差を避けられます。元の座標と追加座標は決定論的で、JSONを安定して比較できる精度に丸めます。同一の連続点は距離がゼロでも構造上の意味を持つ場合があるため保持します。正反対にある端点は、無数の大円経路が存在して短い経路を一意に決められないため拒否します。楕円体に基づく測量精度が必要な場合は、完全なWGS-84楕円体ではなく、半径を変更できる球を使用する点にご注意ください。
結果を読み取り検証します
主な結果はverticesです。順序付き配列として返され、座標として保存したり、ご利用のアプリケーションのジオメトリ形式へ変換したりできます。先頭と末尾は元の端点で、元の各内部頂点もセグメント境界に残ります。さらに、input_vertices、output_vertices、inserted_verticesが返るため、増加量を把握し、保存容量や描画負荷を管理できます。total_distance_mは元セグメントの測地距離の合計です。max_segment_distance_mは分割後で最も長い実区間を示し、わずかな浮動小数点丸めを除けば、指定間隔以下になります。後続処理の標本間隔を保証する目的では、この値をご確認ください。GeoJSONへ変換するときは順序を保ちつつ、座標ペアが通常は経度、緯度の順である点にご注意ください。このAPIでは名前付きのlatとlonを使用します。計算は純粋関数で、ネットワーク通信や送信線の保存は行いません。ブラウザーでは対話的に確認でき、APIによる自動処理は1回$0.002で、同じ決定論的構造を返します。
活用例
経路を一定間隔の標本取得に備えます
標高、気象、電波範囲など、経路に沿って変化する値を照会する前に、必要な数の頂点を追加します。
長い辺の地図描画を改善します
大円上の中間点で長い地理的な辺を表し、投影表示やアニメーションの経路を意図した軌跡に合わせます。
解像度が不均一な線をそろえます
取得間隔が一定でない元頂点を持つ線に、共通の最大間隔ルールを適用します。
よくある質問
spacing_mは全点間の距離を厳密に指定しますか?
いいえ。許容する最大間隔を指定します。元の各セグメントを、その値を超えない同じ長さの測地線区間に分けます。
元の頂点は保持されますか?
はい。すべて元の順序で保持され、新しい頂点は連続する元頂点の間へ挿入されます。
日付変更線をまたぐ線にも対応しますか?
はい。180度付近の正負の経度間を短く横切る場合も、短い方の大円弧に沿って補間します。
正反対の端点を拒否するのはなぜですか?
正反対の2点では大円経路が一意に定まりません。任意の経路を選ばないよう、該当セグメントを拒否します。
WGS-84楕円体に基づく計算ですか?
いいえ。半径を変更できる球面大円モデルを使い、既定値には平均地球半径を採用します。
APIの利用料金はいくらですか?
1回のリクエストは$0.002です。決定論的な計算であり、外部サービスへの通信はありません。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/densify-line \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"line":[{"lat":37.7749,"lon":-122.4194},{"lat":37.8044,"lon":-122.2711},{"lat":37.6879,"lon":-122.4702}],"spacing_m":5000}'const res = await fetch("https://api.kit.forhosting.com/geo/densify-line", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"line": [
{
"lat": 37.7749,
"lon": -122.4194
},
{
"lat": 37.8044,
"lon": -122.2711
},
{
"lat": 37.6879,
"lon": -122.4702
}
],
"spacing_m": 5000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/densify-line",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"line": [
{
"lat": 37.7749,
"lon": -122.4194
},
{
"lat": 37.8044,
"lon": -122.2711
},
{
"lat": 37.6879,
"lon": -122.4702
}
],
"spacing_m": 5000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/densify-line", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"line":[{"lat":37.7749,"lon":-122.4194},{"lat":37.8044,"lon":-122.2711},{"lat":37.6879,"lon":-122.4702}],"spacing_m":5000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"line":[{"lat":37.7749,"lon":-122.4194},{"lat":37.8044,"lon":-122.2711},{"lat":37.6879,"lon":-122.4702}],"spacing_m":5000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/densify-line", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"line": [
{
"lat": 37.7749,
"lon": -122.4194
},
{
"lat": 37.8044,
"lon": -122.2711
},
{
"lat": 37.6879,
"lon": -122.4702
}
],
"spacing_m": 5000
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.densify_line",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_points | 10000 |
max_output_vertices | 100000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |