JavaScript

Geolocation API

スマホやタブレットの普及で、現在地を取得するような位置サービスの需要が多くなるのは用意に想像がつく。
そこで、WebブラウザでJavaScriptを使って現在地の位置情報を取得する方法の備忘録。

HTML5 APIのひとつ、Geolocation API。これを使って現在地の位置情報を取得することができるようになる。

Geolocation APIのサンプル

Geolocation API

本家の仕様(Geolocation API Specification)を自分なりに翻訳していきます。

まず、現在地を取得するには、
「一回のみ取得(getCurrentPosition)」か「ずっと取得し続ける(watchPosition)」か。
の2種類ある。

そして「ずっと取得し続ける場合、それを「解除する(clearWatch)」手段。

一回のみ取得(getCurrentPosition)

navigator.geolocation.getCurrentPosition(successCallback, errorCallback, option);

セットできる引数は3つ。

successCallback
取得成功した際に実行する関数
errorCallback
取得に失敗した際に実行する関数
option
取得方法をカスタマイズする際のオブジェクト

ずっと取得し続ける(watchPosition)

watchId = navigator.geolocation.watchPosition(successCallback, errorCallback, option);

引数の扱いは「一回のみ取得(getCurrentPosition)」と同様。

解除する(clearWatch)

navigator.geolocation.clearWatch(watchId);

取得成功した際に返却される値(position): 第1引数

取得時間 position.timestamp
緯度 position.coords.latitude
緯度 position.coords.longitude
高度 position.coords.altitude
緯度・経度の誤差 position.coords.accuracy
高度の誤差 position.coords.altitudeAccuracy
方角 position.coords.heading
速度 position.coords.speed

取得に失敗した際に返却される値(error.code): 第2引数

1 PERMISSION_DENIED position.timestamp
2 POSITION_UNAVAILABLE position.coords.latitude
3 TIMEOUT position.coords.longitude

error.messageで、エラーメッセージを取得できる(英文)。

取得方法をカスタマイズする際のオブジェクト: 第3引数

enableHighAccuracy 精度重視はtrueをセット。ただしバッテリーの減りはfalseより早い。
timeout 一回の取得時間(ミリ秒で指定)
maximumAge キャッシュ(ミリ秒で指定)
/* デフォルト(指定なしの場合) */
{
enableHighAccuracy: false,
timeout: Infinity,
maximumAge: 0
}
/* キャッシュ:10分間以内に取得した情報があればそれを採用する。なければ新規取得。 */
{
maximumAge: 600000
}
/* 10分間以内に取得した情報があればそれを採用する。なければエラー。 */
{
maximumAge: 600000,
timeout: 0
}
/* 取得した情報があればそれを採用する。なければエラー。 */
{
maximumAge: Infinity,
timeout: 0
}

Geolocation APIのサンプル

基本は理解できたのだが、利用シーンによって、バッテリーの消費を抑えつつ、できるだけ正確な位置情報を取得できる手段はいろいろ検証の余地がありそう。
さらにはエラーのハンドリングをうまくしないと想定外の動きをしてしまう。。
まだ自分なりのベストが見つからず模索中!
奥が深いぜッ!

最近の記事

cronっぽいことをPHPでjsonとして実装する

外部のAPIを利用する際、リクエスト回数が制限されることがある。また、リクエスト回数が制限され、かつ毎日更新をルールとする外部のAPIもある。 そんなと・・・

php

Instagram API を使ってインスタに投稿した画像データを取得する

インスタに投稿した画像を自動でホームページでも更新されるようにしたい。もっとも簡単に実現する方法を紹介する。 公式リファレンスInstagram・・・

API

名刺代わりの超絶ミニマムなブランディングページ

このたび、ハンドメイドアクセサリー作家さんのWebサイト制作させていただきました! Sunny Side Accessory(サニーサイド アクセサリー・・・

お仕事・制作日記

案件、承っております

2021年2月現在、案件承っております。とくに短期、週2、3日での外注をお考えでしたら、ぜひご連絡ください。 当方、2015年2月より「シンプルシンプル・・・

お仕事・制作日記

インタラクションデザイン

5年くらい前に購入した書籍「インタラクションデザイン」。この書籍内ではたくさんの事例が紹介されている。残念ながらその多くは現在閲覧することができなくなっていた・・・

デザイン

Advanced Custom Fields 名前を変更して、データも反映させる

WordPressを自作する上でもはや欠かせないプラグインの一つが、「Advanced Custom Fields」。 名前を変更しようと思って、Wor・・・

WordPress

配列の重複を削除する

配列の場合 /** * 配列の重複を削除する * * @param {array} ary* * @return {array} 処理後のary・・・

JavaScript

MAMP を 5.7 から 6.2 にアップデートした

5年以上前と比べると、アップデートが簡単で驚く。とくに記事にするまでもないと思いつつ、一応備忘録。 インストールすると、既存のディレクトリはそのままに別・・・

MAMP

Briefly unavailable for scheduled maintenance. Check back in a minute. → . maintenance を削除

プラグインを更新中に、誤って、違うページにアクセスしまいました。すると、管理画面だけでなく、公開中のすべての画面が「briefly unavailable f・・・

WordPress

GulpでERRが出てテンパった → gyp: No Xcode or CLT version detected! → PostCSS plugin autoprefixer requires PostCSS 8

Gulp。いつもは正常に動いている環境をそのままコピーして再利用するようにしている。そうすることで、案件ごとに毎回環境作りをする手間を省くことができ、何よりG・・・

制作効率化

人気の記事

WP_Queryを使って絞り込み検索するのにコレは便利!

めっちゃ参考になるページを見つけた。 絞り込みをするたびに色々ググっていたが、これがあればほとんどのことが解決できそうな気がする。 参考: これは便利!Word・・・

WordPress

overflowをautoにした要素のスクロール位置を変更する → scrollTop scrollLeft

まずはサンプル。 これは、overflowをautoにした要素のスクロール位置を変更するサンプルです。 これは、overflowをautoにした要素のスクロ・・・

JavaScript

iframeの高さを自動調整する

iframeで呼び出した際、iframe自体はスクロールさせずに高さを取得してiframe全体を表示させます。 サンプル:iframeの高さを自動調整するデモ・・・

JavaScript

http://localhost:8888/ → http://localhost/

http://localhost:8888/ での参照ではなく、http://localhost/ で参照できるようにします。 MAMPの設定を変更する M・・・

MAMP

アーカイブページでカスタムフィールドやタクソノミーで絞り込みした状態でリスト表示する

<?php $args = array( 'paged' => 1, 'posts_per_page' => 20, 'post・・・

WordPress

カウントアップ、カウントダウンするJavaScript

ポイントを使ったり、増やしたりしたときに、結果のポイント数に差し替えるのではなくて、カウントアップしたり、カウントダウンして動的に動かそうと思って作ってみた。・・・

JavaScript

WordPressのカテゴリー一覧ページでカテゴリー名とスラッグを取得する → get_queried_object()

やりたいこと カテゴリー一覧ページで、そのカテゴリー一覧ページに属する記事一覧を取得するためにループさせるのとは別に、タイトルやカテゴリー別にデザインを変・・・

WordPress

イラストレーターでレイヤーごとにPNGで書き出す

【2020年07月13日】 macOS Catalina(10.15.5) / Adobe iLLustrator 2020(24.2.1) にて動作確認済・・・

Illustorator

管理画面のカスタム投稿一覧で並び順を変更する

WordPressの管理画面。「投稿」や「固定ページ」の一覧は、公開日順に並んでいる。ところが、カスタム投稿を追加した場合、公開順ではなく名前順に並んでいること・・・

WordPress

MAMPの日時(タイムゾーン)を変更する

MAMPを使用していて、日時の情報を制御しようとしたとき、取得している日時が日本時間ではないことに気がついた。 時差を計算してPHPでプログラミングしていたが、・・・

MAMP

WEB制作マークアップJavaScriptGeolocation API | シンプルシンプルデザイン