「現在地取得」は“ブラウザに今いる場所を一回だけ教えてもらう”こと
「現在地取得」と聞いたら、まずイメージしてほしいのはこれです。
ブラウザに「今どこにいる?」と一度だけ質問して、
緯度・経度などの位置情報を返してもらう処理
JavaScript では、これを Geolocation API の getCurrentPosition で行います。
スマホなら GPS や Wi‑Fi、PC なら Wi‑Fi や IP などを使って、ブラウザが「だいたいこの辺」と計算してくれます。
ここで大事なのは次の 2 つです。
- ユーザーの許可が必須(勝手に位置は取れない)
- 基本的に HTTPS でないと動かない
この前提を頭に置いたうえで、コードを見ていきましょう。
基本の API getCurrentPosition を押さえる
形だけ先に見る
getCurrentPosition のシグネチャはこうです。
navigator.geolocation.getCurrentPosition(
successCallback,
errorCallback,
options
);
JavaScriptsuccessCallback: 位置取得に成功したときに呼ばれる関数errorCallback: 失敗したときに呼ばれる関数options: 精度やタイムアウトなどの設定(省略可)
初心者のうちは、まず「成功コールバック」と「エラーコールバック」の 2 つをしっかり意識できれば十分です。
最小の「現在地を表示する」例から始める
HTML と JavaScript の全体像
HTML:
<button id="getLocationBtn">現在地を取得</button>
<pre id="result">ボタンを押すと現在地を表示します</pre>
JavaScript:
const btn = document.querySelector("#getLocationBtn");
const result = document.querySelector("#result");
btn.addEventListener("click", () => {
if (!("geolocation" in navigator)) {
result.textContent = "このブラウザは位置情報に対応していません";
return;
}
result.textContent = "位置情報を取得中…";
navigator.geolocation.getCurrentPosition(
(position) => {
const coords = position.coords;
result.textContent =
`緯度: ${coords.latitude}\n` +
`経度: ${coords.longitude}\n` +
`精度: 約 ${coords.accuracy} m`;
},
(error) => {
result.textContent = "位置情報の取得に失敗しました: " + error.message;
}
);
});
JavaScriptこのコードで「現在地取得」の流れは一通り体験できます。
ここから、重要な部分を少しずつ深掘りします。
成功時コールバックで何がもらえるかを理解する
position と coords の中身
成功時コールバックには position オブジェクトが渡されます。
(position) => {
const coords = position.coords;
console.log(coords.latitude, coords.longitude, coords.accuracy);
}
JavaScriptcoords の主なプロパティは次の通りです。
latitude: 緯度(−90〜90)longitude: 経度(−180〜180)accuracy: 精度(メートル単位の誤差)
他にも高度や速度などがありますが、まずはこの 3 つを押さえれば十分です。
ここで特に大事なのは accuracy です。
「誤差が 5m なのか 500m なのか」で、アプリの使い方が変わります。
例えば、店舗検索なら誤差 500m でも許容できるかもしれませんが、
ナビアプリなら誤差 500m は致命的です。
「位置情報は完璧じゃない。精度を見て判断する」という感覚を持っておくと、設計が一段レベルアップします。
エラー処理をちゃんと書くのが“現在地取得”のキモ
なぜエラーを真面目に扱う必要があるのか
位置情報は、失敗する可能性が高い機能です。
- ユーザーが「許可しない」を選ぶ
- 電波が悪くて位置が取れない
- 屋内で GPS が入らない
- タイムアウトする
これらは「レアケース」ではなく「普通に起こるケース」です。
だからこそ、エラーをちゃんと分けて扱うのが大事です。
エラーコードごとにメッセージを変える例
navigator.geolocation.getCurrentPosition(
(position) => {
const c = position.coords;
result.textContent =
`緯度: ${c.latitude}\n` +
`経度: ${c.longitude}\n` +
`精度: 約 ${c.accuracy} m`;
},
(error) => {
switch (error.code) {
case error.PERMISSION_DENIED:
result.textContent = "ユーザーが位置情報の取得を拒否しました";
break;
case error.POSITION_UNAVAILABLE:
result.textContent = "位置情報を取得できませんでした(電波状況など)";
break;
case error.TIMEOUT:
result.textContent = "位置情報の取得がタイムアウトしました";
break;
default:
result.textContent = "不明なエラーが発生しました";
}
},
{
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
}
);
JavaScriptここでのポイントは、ユーザー拒否と技術的な失敗を分けていることです。
- 拒否された場合 → 「設定から許可を変更してください」と案内できる
- 取得不能・タイムアウト → 「電波状況を確認してください」などのメッセージにできる
「全部まとめて『失敗しました』」ではなく、
なぜダメだったのかをユーザーに伝える のが、良い UX につながります。
options で「どうやって現在地を取るか」を調整する
enableHighAccuracy: 精度を優先するか、軽さを優先するか
enableHighAccuracy は、「できるだけ正確な位置が欲しいかどうか」を伝えるフラグです。
{
enableHighAccuracy: true, // 高精度を要求
timeout: 5000,
maximumAge: 0
}
JavaScripttrue にすると、GPS などをフル活用して高精度を目指しますが、
- 取得に時間がかかる
- バッテリー消費が増える
というデメリットもあります。
ざっくりした使い分けのイメージはこうです。
- ナビ・ランニングログ →
true(数メートル単位の精度が欲しい) - 近くの店舗検索 →
falseでも十分(数百メートルの誤差は許容)
「とりあえず全部 true」ではなく、
アプリの用途に合わせて選ぶのがプロっぽいです。
timeout: いつまで待つかを決める
timeout は「最大何ミリ秒待つか」です。
指定しないと、ほぼ無限に待ち続けることになります。
{
enableHighAccuracy: true,
timeout: 5000, // 最大 5 秒待つ
maximumAge: 0
}
JavaScript電波が悪い場所では、位置取得にかなり時間がかかることがあります。
「5 秒待ってダメなら諦めてエラーにする」と決めておくと、
ユーザーがいつまでも「取得中…」で待たされることを防げます。
maximumAge: 古い位置情報をどこまで許すか
maximumAge は「どれくらい古い位置情報まで再利用してよいか」です。
0: 毎回必ず最新を取りに行く10000: 10 秒以内のキャッシュがあればそれを使う
現在地取得では、まずは 0 で「常に最新」を使うのが分かりやすいです。
バッテリーや速度を気にするようになってきたら、
用途に応じて値を変える、というステップで十分です。
UX とセキュリティのポイントを先に知っておく
HTTPS でないと現在地取得は基本的に動かない
Geolocation API は「安全なコンテキスト」でしか動きません。
つまり、基本的に https:// で提供されているページでのみ有効です。
開発中は http://localhost だけ特別に許されていますが、
file://で直接開くhttp://example.comのような非 HTTPS
だと、navigator.geolocation が使えなかったり、エラーになったりします。
「現在地取得が動かない」ときは、
まず「HTTPS かどうか」を疑う癖をつけておくと、原因切り分けが早くなります。
ユーザーの許可は“当たり前に拒否される”ものとして扱う
位置情報はプライバシーど真ん中なので、
ユーザーが「許可しない」を選ぶのはごく自然です。
だからこそ、
- 許可ダイアログが出る前に「これから位置情報を使います」と説明する
- 拒否されたときのメッセージをちゃんと用意しておく
- 位置情報がなくても最低限使える UI を考えておく
といった設計が大事になります。
「許可される前提」で作ると、現実のユーザーとは噛み合わなくなります。
拒否されるのが普通 くらいの気持ちで設計すると、だいぶ強くなれます。
練習としてやってみてほしい「現在地取得」2 ステップ
ステップ 1: 一回だけ現在地を取得して表示する
目標は、次のような動きです。
- ボタンを押すと「取得中…」と表示
- 成功したら緯度・経度・精度を表示
- 失敗したら理由に応じたメッセージを表示
ここまでできれば、getCurrentPosition の基本はほぼマスターです。
ステップ 2: 取得オプションを変えて挙動の違いを体感する
同じコードで、options を変えてみてください。
enableHighAccuracy: falseにしてみるtimeoutを 2000 にしてみるmaximumAgeを 10000 にしてみる
実際の端末で試すと、
- 精度が変わる
- 取得にかかる時間が変わる
- すぐ結果が返ってくることがある
など、体感として違いが分かります。
コードを読むだけでなく、
「今、ブラウザが裏で何を頑張っているのか」 を想像しながら触ると、
位置情報 API の理解が一気に深くなります。
「現在地取得」は、
あなたの Web アプリと現実世界をつなぐ、かなり強い一手です。
一度この感覚を掴んでおくと、
- 近くのお店を出す
- 友達と位置を共有する
- ランニングコースを記録する
みたいなアイデアが、全部「自分で作れそうなもの」に変わっていきます。
そこまで連れていくための土台が、今回の getCurrentPosition です。
