ポリライン上の最近点
点40.73, -74.01と3つの頂点を持つ経路では、線上で最も近い場所は2番目の区間にある40.7227030704, -73.9972969296です。経路の起点からの距離と、経路からどれだけ離れているかも分かります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 緯度
- 40.73
- 経度
- -74.01
- 緯度
- 40.7227030704
- 経度
- -73.9972969296
- 照会の緯度
- 40.73
- 照会の経度
- -74.01
自由な緯度経度に対してポリライン上の最近点を求めることは、GISと経路計算の基本操作です。地図アプリはGPS測位を道路中心線へ合わせ、物流ツールは計画回廊から車両までの距離を測り、測量スクリプトは経路に沿ってどれだけ進んだかを示します。本ツールはWGS84の問い合わせ座標と順序付き頂点列を受け取り、局所正距円筒図法のメートル枠へ投影し、有限な各辺上で最も近い位置を返します。スナップ後の緯度経度、ゼロ始まりのセグメント番号、その辺上の分数位置、先頭頂点からの線上距離、ポリライン全長、問い合わせ点からスナップ点までの地上距離が得られます。
地理ルートにおけるポリライン上最近点の意味
ポリラインとは頂点間の直線セグメントを順に連ねた鎖です。地理空間では各頂点はWGS84球面上の緯度と経度であり、各セグメントは局所地図投影後の連続する二頂点間の短い弦です。経路から外れた自由な問い合わせ点があるとき、ポリライン上の最近点とは、いずれかのセグメント上で問い合わせ点までの地上距離を最小にする位置です。
その位置はセグメント内部、二辺が接する頂点、あるいは問い合わせが始点や終点を超える場合の経路端点に現れます。線上距離はポリライン自体を歩いたと仮定したときの先頭頂点からスナップまでの距離であり、問い合わせ点からスナップへの直線距離とは異なります。
点を経路に合わせると役立つ場面
モバイルやフリート製品はノイズの多いGPS標本を計画回廊へスナップし、画面ではふらつく自由測位ではなく経路に沿った進捗を示します。現場運用や公益事業は、完全なネットワーク位相エンジンを立てずに、作業班や資産がパイプライン・トレイル・送電線からどれだけ離れているかを測ります。
ポリライン上最近点で検索される教育・コンテンツサイトは、同じ純モジュール上で有料自動化経路と一致する無料ブラウザツールの恩恵を受けます。曲線では正距円筒近似が強い短い辺になるよう頂点を十分に密にし、大陸規模で数千キロのポリラインではメートル級の絶対精度が端で必要な場合は細分化や分割を検討してください。
活用例
道路・トレイル中心線へのGPSスナップ
自由なGPS測位を順序付き経路ポリラインへ投影し、スナップ後の緯度経度と経路に沿った進行距離を表示します。
回廊オフセットとチェーンージ報告
資産からパイプラインやトレイル線形までの地上距離を測り、保守チケット向けにチェーンージ(線上距離)を報告します。
よくある質問
緯度経度に対するポリライン上の最近点はどう求めますか?
問い合わせのlatとlon、および少なくとも二つの{lat, lon}頂点を持つpolyline配列を送ってください。
ポリラインが一点だけの場合はどうなりますか?
セグメントを定義するには少なくとも二頂点が必要です。範囲外座標も課金なしで失敗します。
経路に沿った距離と経路までの距離は何が違いますか?
経路に沿った距離は、最初の頂点から合わせた点まで線の上を進んだ長さです。経路までの距離は、入力した点から合わせた点までの地表での直線距離です。
最も近い点が頂点や経路の端になることはありますか?
あります。最も近い場所は区間の途中のほか、2つの区間がつながる頂点や、点が起点や終点より外側にあるときは経路の端になります。
非常に長い経路でも正確ですか?
各区間は局所的な平面で測るため、区間が短いほど正確です。曲がった道路には頂点を十分に置き、数千キロメートルの経路でメートル単位の精度が必要なら分割してください。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/nearest-point-on-polyline \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"lat":40.7128,"lon":-74.006,"polyline":[{"lat":40.7,"lon":-74.02},{"lat":40.72,"lon":-74},{"lat":40.74,"lon":-73.98}]}'const res = await fetch("https://api.kit.forhosting.com/geo/nearest-point-on-polyline", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"lat": 40.7128,
"lon": -74.006,
"polyline": [
{
"lat": 40.7,
"lon": -74.02
},
{
"lat": 40.72,
"lon": -74
},
{
"lat": 40.74,
"lon": -73.98
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/nearest-point-on-polyline",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"lat": 40.7128,
"lon": -74.006,
"polyline": [
{
"lat": 40.7,
"lon": -74.02
},
{
"lat": 40.72,
"lon": -74
},
{
"lat": 40.74,
"lon": -73.98
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/nearest-point-on-polyline", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"lat":40.7128,"lon":-74.006,"polyline":[{"lat":40.7,"lon":-74.02},{"lat":40.72,"lon":-74},{"lat":40.74,"lon":-73.98}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"lat":40.7128,"lon":-74.006,"polyline":[{"lat":40.7,"lon":-74.02},{"lat":40.72,"lon":-74},{"lat":40.74,"lon":-73.98}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/nearest-point-on-polyline", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"lat": 40.7128,
"lon": -74.006,
"polyline": [
{
"lat": 40.7,
"lon": -74.02
},
{
"lat": 40.72,
"lon": -74
},
{
"lat": 40.74,
"lon": -73.98
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.nearest_point_on_polyline",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
地理ルートにおけるポリライン上最近点の意味
segment_indexはスナップを保持する辺を示し、先頭頂点からゼロで数えます。これらのフィールドは「経路上のどこが最も近いか」と「その場所は経路に沿ってどれだけ進んだ位置か」の両方に答え、完全な経路グラフや道路網データベースを必要としません。
入力契約・アルゴリズム・応答形とエラー
内部ではポリライン頂点の平均を正距円筒の原点とし、各頂点と問い合わせを局所の東・北メートルへ変換し、有限な各辺について無限直線への射影を行い、パラメータtを閉単位区間にクリップして候補が辺上に留まるようにします。全辺のうち二乗距離が最小のものを選び、完全同点では安定した契約のため先の辺を優先します。実セグメントが存在する限り長さゼロの連続重複はスキップします。問い合わせ点のlatとlon(WGS84の通常範囲であるマイナス90から90、マイナス180から180の有限数)と、それぞれlatとlonを持つ少なくとも二頂点の順序付き配列polylineをJSON本文で送信します。任意のradius_mは平均地球半径のスケールとして六三七一〇〇〇メートルが既定です。latitude、longitude、lng、vertices、points、pathなどの別名も受け付けるため、既存のGISペイロードの書き換えを抑えられます。成功時はスナップのlatとlon、エコーされたquery_latとquery_lon、segment_index、t、distance_along_mとdistance_along_km、distance_to_mとdistance_to_km、両単位のポリライン長、vertex_count、segment_count、on_vertex、radius_m、method equirectangular_polylineを返します。範囲外座標、二頂点未満、非有限数、欠損polylineはinvalid_inputとなり課金されません。
ポリライン上最近点APIが役立つ場面
取込トラックを清めるデータパイプラインは、スナップとdistance_along_mを使い、設計線形に沿ったチェーンージとして点を再パラメータ化します。実装は純parseのティアAのため、成功した各呼び出しは公開の基本料金$0.002で、モデルトークンも外向きネットワークもなく、検証失敗は残高を消費しません。丸めた応答フィールドをテストに固定すれば、自前のGISスタックなしに地図・LMS実験・エッジワーカー向けの再現可能なスナップが得られます。
連携の活用例
トラック清掃と地図デモ
ETLスクリプトや教育用地図ウィジェットで、ノイズの多いトラック点を設計ポリラインに沿った距離として再パラメータ化します。
技術的な質問
segment_indexとは何ですか?
最近点を含むポリライン辺のゼロ始まり番号です。セグメント0は第一頂点から第二へ、1は第二から第三へ、と続きます。
線上距離はどのように測られますか?
distance_along_mはポリラインの各辺に沿った先頭頂点からスナップ点までの地上長であり、問い合わせからスナップへの直線距離ではありません。
ポリライン上最近点ツールの料金は?
ブラウザツールは無料です。APIは成功した呼び出しごとに前払いKIT残高から$0.002で課金され、無効入力は課金されません。