「精度と誤差」は“どれくらい当たっていて、どれくらいズレているか”の話
位置情報を扱うときに絶対に避けて通れないのが
「精度(accuracy)」と「誤差(error)」 です。
地図アプリを開いたら、
自分の位置が 10m くらいズレていること、ありますよね。
あれは「位置情報が間違っている」のではなく、
「誤差がある前提の情報を見ている」状態です。
JavaScript の Geolocation API も同じで、
返ってくる位置情報は「真の位置」ではなく
「だいたいこの辺(誤差 ±○m)」 という情報です。
この感覚をちゃんと持てるかどうかで、
位置情報アプリの設計レベルがかなり変わります。
Geolocation API が返す「accuracy」とは何か
coords.accuracy は「この半径の円のどこかにいるはず」という意味
getCurrentPosition や watchPosition の成功時に渡される 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
});
JavaScriptenableHighAccuracy: 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 は単なる「便利な関数」ではなく、
「不完全な現実世界の情報を、どう扱うかを考える設計の題材」
として見えてきます。
その視点を持てるエンジニアは、
位置情報に限らず、センサー系・リアルワールド系の開発に強くなっていきます。
