JavaScript | Web API:位置情報・センサー - 精度と誤差

JavaScript JavaScript
スポンサーリンク

「精度と誤差」は“どれくらい当たっていて、どれくらいズレているか”の話

位置情報を扱うときに絶対に避けて通れないのが
「精度(accuracy)」と「誤差(error)」 です。

地図アプリを開いたら、
自分の位置が 10m くらいズレていること、ありますよね。
あれは「位置情報が間違っている」のではなく、
「誤差がある前提の情報を見ている」状態です。

JavaScript の Geolocation API も同じで、
返ってくる位置情報は「真の位置」ではなく
「だいたいこの辺(誤差 ±○m)」 という情報です。

この感覚をちゃんと持てるかどうかで、
位置情報アプリの設計レベルがかなり変わります。


Geolocation API が返す「accuracy」とは何か

coords.accuracy は「この半径の円のどこかにいるはず」という意味

getCurrentPositionwatchPosition の成功時に渡される position には、
position.coords.accuracy というプロパティがあります。

navigator.geolocation.getCurrentPosition((position) => {
  const c = position.coords;
  console.log("緯度:", c.latitude);
  console.log("経度:", c.longitude);
  console.log("精度:", c.accuracy, "m");
});
JavaScript

ここでの accuracy は「メートル単位の誤差」です。

ざっくり言うと、

緯度・経度を中心とした半径 accuracy メートルの円のどこかに
ユーザーがいると考えてください

という意味です。

例えば accuracy = 10 なら「半径 10m の円のどこか」、
accuracy = 500 なら「半径 500m の円のどこか」です。

つまり、同じ「緯度・経度」でも、
accuracy が 10 のときと 500 のときでは、
「信頼できる度合い」がまったく違います。

ここをちゃんと見るかどうかが、
「位置情報を分かっている人」と「なんとなく使っている人」の分かれ目です。


精度が変わる理由をざっくり理解する

なぜいつも同じ精度ではないのか

位置情報の精度は、
使われている情報源によって大きく変わります。

スマホの屋外で、空がよく見える場所 → GPS が効きやすく、精度が高い(数メートル)
屋内や地下 → GPS が入りにくく、Wi‑Fi や基地局頼みで精度が落ちる(数十〜数百メートル)
PC(Wi‑Fi のみ) → そもそも GPS がないので、精度はそこそこ(数十〜数百メートル)

ブラウザは、端末が持っている情報をうまく組み合わせて
「今この辺だろう」と推定していますが、
環境によって使える情報が違うので、精度も変わります。

だからこそ、アプリ側は

「位置情報は揺れるし、誤差もある」
「accuracy を見て、どれくらい信用するかを決める」

という前提で設計する必要があります。


enableHighAccuracy と精度・バッテリーのトレードオフ

enableHighAccuracy: 「本気モードで位置を取って」とお願いするフラグ

Geolocation API の options にある enableHighAccuracy は、
精度とコストのバランスを決める重要なスイッチです。

navigator.geolocation.getCurrentPosition(success, error, {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0
});
JavaScript

enableHighAccuracy: true にすると、
ブラウザは可能な限り高精度な位置を取ろうとします。

GPS を積極的に使う
Wi‑Fi 情報を細かく使う

など、「本気モード」で頑張ってくれます。

その代わりに、

取得に時間がかかることがある
バッテリー消費が増える

というデメリットもついてきます。

逆に false(または指定なし)の場合は、
「そこそこの精度でいいから、軽く・速く返そう」とします。

どんなときに true / false を選ぶべきか

ざっくりした判断基準はこうです。

ナビ・ランニングログ・位置ゲームなど
→ 数メートル単位の精度が欲しいので true が向いている

近くの店舗検索・天気情報など
→ 数百メートルの誤差は許容できるので false でも十分

ここで大事なのは、

「とりあえず全部 true」ではなく、
アプリの用途に合わせて精度を選ぶ

という姿勢です。

精度を上げることには必ずコストがあるので、
「どこまでの精度が本当に必要か」を考えるのが設計の一部になります。


精度と誤差を UI にどう反映するか

accuracy をそのまま見せるだけでも価値がある

まず一番簡単なやり方は、
accuracy をそのままユーザーに見せることです。

navigator.geolocation.getCurrentPosition((position) => {
  const c = position.coords;
  info.textContent =
    `緯度: ${c.latitude}\n` +
    `経度: ${c.longitude}\n` +
    `精度: 約 ${c.accuracy} m`;
});
JavaScript

これだけでも、

「今は誤差 10m くらいなんだ」
「今日は誤差 300m もあるから、あまり当てにならないな」

とユーザーが判断できます。

位置情報を「絶対正しいもの」として見せるのではなく、
「誤差を含んだ情報」として見せる のが誠実な設計です。

精度が悪いときに注意メッセージを出す

もう一歩踏み込むなら、
精度が一定以上悪いときに注意を出すのも良いです。

navigator.geolocation.getCurrentPosition((position) => {
  const c = position.coords;

  let message =
    `緯度: ${c.latitude}\n` +
    `経度: ${c.longitude}\n` +
    `精度: 約 ${c.accuracy} m`;

  if (c.accuracy > 200) {
    message += "\n※ 位置の誤差が大きい可能性があります(屋内や電波状況の影響)";
  }

  info.textContent = message;
});
JavaScript

こうしておくと、

「なんか地図上の位置がズレてるけど、アプリがバグってるわけじゃないのか」

とユーザーが理解しやすくなります。

「精度が悪いときに黙っている」のではなく、
「今はこういう状態です」と伝える のが UX 的にとても大事です。


watchPosition と精度・誤差の関係

連続取得では「揺れ」をどう扱うかがポイント

watchPosition で位置を追跡していると、
ユーザーが止まっているのに位置が少しずつ動くことがあります。

これは「誤差が時間とともに揺れている」状態です。

例えば、実際には動いていないのに、

緯度・経度が少しずつ変わる
accuracy が 10 → 30 → 15 → 50 と揺れる

といったことが普通に起こります。

このときに、そのまま距離を足し上げると、

止まっているのに距離が増え続ける
ランニングアプリなのに、信号待ちで距離が伸びる

みたいなことが起こります。

「精度が悪いときは距離に加算しない」という工夫

簡単な対策として、
accuracy が悪すぎるときは距離計算から除外する、という方法があります。

let lastCoords = null;
let totalDistance = 0;

navigator.geolocation.watchPosition((position) => {
  const c = position.coords;

  if (c.accuracy > 100) {
    // 誤差が 100m より大きいときは距離計算をスキップ
    return;
  }

  if (lastCoords) {
    const d = distanceInMeters(
      lastCoords.latitude,
      lastCoords.longitude,
      c.latitude,
      c.longitude
    );
    totalDistance += d;
  }

  lastCoords = c;
});
JavaScript

ここでの考え方は、

「誤差が大きすぎる位置情報は、
距離計算には使わないほうがマシ」

という割り切りです。

もちろん、これは簡易的な方法ですが、
「精度を見て処理を変える」という発想自体がとても重要です。


精度と誤差を“前提”にした設計マインド

「位置情報は揺れるし、外れることもある」を最初から受け入れる

位置情報を初めて扱うとき、
多くの人が無意識にこう思ってしまいます。

緯度・経度が返ってくる → それが“正しい位置”だ

でも実際は、

緯度・経度が返ってくる →
「誤差 ±accuracy m の範囲で、だいたいこの辺」

です。

この前提を受け入れると、
設計の考え方が変わります。

「ピンポイントでこの店の前にいるはず」ではなく
「この店の近くにいる可能性が高い」

「ユーザーはこの道を通ったはず」ではなく
「この辺りのルートを通ったと推定される」

というふうに、
「確定」ではなく「推定」として扱う 方向に頭が切り替わります。

精度に応じて“できること”を変える

例えば、こんな設計もありえます。

accuracy が 50m 未満なら
→ 「あなたはこの店舗の近くにいます」と表示してクーポンを出す

accuracy が 200m 以上なら
→ 「近くの店舗を表示するには、もう少し電波の良い場所に移動してください」と案内する

同じ「現在地取得」でも、
精度によってアプリの振る舞いを変えることで、
ユーザー体験はかなり良くなります。


初心者として「精度と誤差」で本当に掴んでほしいこと

位置情報の「精度と誤差」の本質は、
「位置情報は常に揺れていて、accuracy を見て“どこまで信じるか”を決める必要がある」
ということです。

そのうえで、まずこの 4 つをしっかり頭に置いておいてください。

緯度・経度だけでなく、coords.accuracy を必ず見ること。
enableHighAccuracy は「精度アップとバッテリー消費アップのトレードオフ」であること。
精度が悪いときは、UI で注意を出したり、処理をスキップしたりする選択肢があること。
位置情報は「真実」ではなく「誤差を含んだ推定値」だと捉えること。

ここが腑に落ちると、
位置情報 API は単なる「便利な関数」ではなく、
「不完全な現実世界の情報を、どう扱うかを考える設計の題材」
として見えてきます。

その視点を持てるエンジニアは、
位置情報に限らず、センサー系・リアルワールド系の開発に強くなっていきます。

タイトルとURLをコピーしました