[WEB制作]位置情報を一番簡単に取得する方法

javascriptのGeolocation APIを使用して緯度経度を取得する方法を紹介します。WEB制作の現場では、登録ユーザーの位置情報を記録したり、アップロードファイルと紐づけたり、ほかのAPIと組み合わせて住所まで割り出したりといった場面で活躍すると思います。

Geolocation APIの概要や使い方まで含む記事となるのでスニペットだけサクッとコピーして編集して使いたいといった場合は一番下の方までスキップしてください。

Geolocation APIで位置情報を取得する。

現在、ほとんどのブラウザでGeolocation APIを使用することが可能です。Geolocation APIでは端末の最良の機能を利用して位置情報の取得が可能です。

Geolocation APIの使用方法はものすごく簡単です。基本的に以下の2つのどちらかで位置情報を受け取ります。

位置情報へのアクセス

navigator.geolocation.getCurrentPosition() //端末の現在の位置情報を受け取る
nabigator.geolocation.watchPosition() //端末の位置が変化するごとに自動的に受け取る

機能の違いとしては位置情報が変化したら新しい位置情報を受け取るか、受け取らないかの違いです。

どちらのメソッドも最大3つの引数を持ち、必須となっているものは成功した時のコールバック関数のみです。その他にはエラー時のコールバック関数、オプションを指定できます。

これまでを踏まえて以下のようなテンプレートを用意しました。

function success(position){ //位置情報が取得できた時の処理

  }
function error(error){ //位置情報が取得できなかった場合の処理

  }
let option = { //その他の設定値

  }

navigator.geolocation.getCurrentPosition(success, error, option);

このテンプレートを少しずつ編集していきます。

ここで気になるのが 成功した場合のコールバック関数の引数の部分で指定されているpositionだと思います。このコールバック関数にはGeolocationPositionオブジェクトが引数として渡されるのでpositionという引数で情報を渡しております。

GeolocationPositionオブジェクトについて

GeolocationPositioオブジェクトは成功時のコールバック関数で情報を渡すことが可能です。上記のひな型からconsole.logで引数で渡されたpositionの中身を確認してみると、GeolocationPositionの中にcoords(位置情報、正確性、スピードなどを取得)とtimestampが含まれています。

緯度、経度の取得

緯度と経度を取得するにはGeolocationPositionオブジェクトのcoordsを使用します。上記のテンプレートの様にpositionでオブジェクトを受け取った場合以下のように取得します。

position.coords.latitude //緯度
position.coords.longitude //経度

その他、受け取れる値は以下のものがあります。

coords.latitude緯度
coords.longitude経度
coords.altitude高度
coords.accuracy緯度経度の精度
coords.alititudeAccuracy高度の精度
coords.heading方向
coords.speed移動速度
timestamp位置情報が取得された時間

エラー処理

次にいくつかのエラー処理の方法を解説します。一点目はブラウザが非対応の場合です。この場合は以下のような条件分岐で判別できます。

if(!navigator.geolocation){//geolocationが使用できないときの処理
}

次に、geolocation APIはブラウザが対応しているが何らかの理由により、エラーとなる場合です。この場合はテンプレートで解説しているエラー時の処理コールバック関数を使用します。このエラーコールバックではGeolocationPositioErrorオブジェクトによりエラーコードを提供してくれます。テンプレートではerrorという引数で渡しております。

エラーコードを取得するには以下を参照してください。

error.code  //エラーコードの取得

エラーコードは以下の3つです。

1ブラウザのアクセス許可がない
2内部的なエラー
3タイムアウト

タイムアウト時間の設定については次に解説します。

オプションの設定

navigator.geolocation.getCurrentPosition、nabigator.geolocation.watchPositionそれぞれ、第3引数にてオプションの設定が可能です。

設定可能な項目は以下の3つです。

enableHightAccuracyBoolean型。より高精度に位置情報を取得。
デフォルトはfalse
取得に時間がかかる場合や電力消費が増える可能性あり
timeoutlong型。タイムアウトまでの時間をミリ秒で指定。
デフォルトはInfinity
maximumAgelong型。キャッシュ済みの位置情報の有効期限。
有効期限内はキャッシュ済みの位置情報から値を返します。
デフォルトは0

一例として以下のような書き方で記述します。

enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0

サンプルコード

これまでざっとGeolocation APIの使い方について解説してきました。次は実際にボタンを設置して位置情報を取得してみましょう。試しにしたのボタンをクリックしてみてください。

アラートで座標、もしくはエラー内容が表示されたはずです。このボタンを実現するサンプルコートは実はたったのこれだけです。

<div class="text-center">
    <button id="find-location">位置情報を取得する。</button>
</div>
<script>
    function findMe() { 
        function success(position){ //位置情報が取得できた時の処理
            const latitude  = position.coords.latitude;
            const longitude = position.coords.longitude;
            alert(`座標の取得が完了しました。\n緯度:${latitude} \n経度:${longitude}`);
        }
        function error(error){ //位置情報が取得できなかった場合の処理
            let e = "";
            if (error.code == 1) { //位置情報取得がブラウザ設定で許可されていない。
                e = "位置情報がブラウザ設定より許可されていません。";
            }
            if (error.code == 2) { //内部エラーにより位置情報が特定できない。
                e = "現在位置を特定できません";
            }
            if (error.code == 3) { //タイムアウト
                e = "タイムアウト";
            }
            alert(e);
        }
        let option = { //その他の設定値
            enableHighAccuracy: true,
            timeout: 5000,
            maximumAge: 0
        }

        if(!navigator.geolocation) {
            status.textContent = 'geolocationがブラウザでサポートされていません。';
        } else {
            navigator.geolocation.getCurrentPosition(success, error);
        }
    }

    document.getElementById('find-location').addEventListener('click', findMe);
</script>

エラー処理を加えてもたったこれだけで位置情報が取得することができます。WEBアプリケーション制作時に恐らくこれが一番簡単な位置情報の取得方法です。この緯度経度情報でMAPアプリや様々なものに応用することが可能です。

HTMLの基本を理解し簡単なページを作ってみる①

WEBページを作成するためにはHTMLのスキルは必須です。このページでは基本となるHTML構文の学習から簡単な静的なページを作成できるまで学習できます。

HTMLとは?

HTMLとは、Hypertext Markup Languageの略であり、マークアップ言語に分類されるWEBサイトを作成するために必須となる言語です。とはいえ、Hypertext Markup Languageと正式名称で呼ぶことはほとんどなく、HTMLとだけ覚えておけば問題ありません。

HTMLでは意味のあるタグで表示させたいテキストなどを囲むことによって記述していきます。

例)段落を表示する

<p>ここに表示させたい内容を記述</p>

この例では段落(パタグラフ)を意味するPタグを使用して段落を表示しています。ここで注目すべき点は<p>という開始タグで始まり</p>の閉じタグで終了しているということです。この様に意味のあるタグで囲むことでWEBサイトを表現していきます。

※一部閉じタグが必要ないタグや省略可能な空要素と呼ばれるものもあります。

この開始タグから終了タグまでをひとまとめで要素(Element)と呼びます。これは要素という呼び名もエレメントという英語の呼び名もどちらもよく使うので覚えておきましょう。

WEBページを表示する最低限の骨組み +α

WEBページを表示する為にHTMLでは、最低限必要なタグがいくつか存在します。以下のコードは最低限必要なものを含めたひな型です。

<!DOCTYPE html>
<html lang="ja">
  <head>
        <meta charset="UTF-8">
        <title>ページのタイトル</title>
  </head>
  <body>

  </body>
</html>

順に解説していきます。

DOCTYPE 宣言

ひな型例では

<!DOCTYPE html>

の部分がそれにあたります。

この部分では、この文書がHTMLで書かれている文書だということを宣言しています。正式にはHTML Living Standardであることを宣言しています。こちらの宣言は厳密にいえばなくても表示させることはできますが、互換性の問題が発生するため呪文のように唱えるようにしましょう。

現在は単にDOCTYPEの宣言をhtmlとするだけで、Apple、Mozilla、Operaの開発者たちによって結成されたWHATWGによって策定したHTML Living Standard文書であることをブラウザに宣言しています。 HTML Living Standard ではバージョンの概念がなく、バージョンなどを指定する必要がなくなりました。

以前はW3Cが策定していたHTMLであると宣言するために

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>

といったとても長ったらしい記述をしていました。

現在ではほとんどの場合、HTML Living Standardを宣言します。

HTML Living Standard は日々改定が進められています、もっと詳しく知りたいかたは膨大なドキュメントになりますがHTML Living Standard 日本語訳を参照してさい。

html要素

ひな型の

<html lang="ja">

</html>

の部分の解説です。

HTML living standardではhtml要素は文書のルートを示すと説明されています。ここでいうルート(root)とは、平方根のことではなく、単に根や付け根といった意味の方が近いです。

HTML文書の根っこにあたる部分でDOCTYPE宣言以外の全体を囲む様にして記述します。こちらも呪文のように唱えてください。

また、html要素ではlang属性を指定することが推奨されています。ひな型の例では日本語で書かれているページだということを表しています。これを指定することにより、音声合成ツールによる発生や翻訳ツールを使用する場合の規則の手助けになります。

属性(attribute)とは?

属性とは以下のコードの赤色の部分を指します。

<html lang="ja">

どの様な場面で使用するかというと、要素に特定の情報を付加したい場合などに使用します。英語ではattributeと呼びます。こちらはjavascriptで属性を操作したい場合などに使用するため、英語名のattributeという呼び名も覚えておきましょう。

上記の例では、langが属性と呼ぶのに対し、イコールに続くjaの部分を属性値、もしくは単に値と呼びます。

head要素

head要素はhtml要素の一番最初に使用されます。

このhtml要素の中にはメタデータコンテンツを含めます。代表的な要素に title、link、metaなどがあります。

ひな形の中ではmeta要素とtitle要素を使用しています。

meta要素

<meta charset="UTF-8">

meta要素は他のメタデータコンテンツの要素である、title、base、link、style、scriptを使用して表現できないメタデータを表す為に使用します。

meta要素のcharset属性は、言語の文字コーディングを指定します。基本的に特段の理由がなければマルチバイト文字を扱えるUTF-8を指定しましょう。

メタデータとは?

HTML文書で使用するメタデータとは、文書に関する付帯情報が記載されたデータを意味します。HTMLでは文字コードの指定や、説明文やページの著者名をしていするメタデータが用意されています。

title要素

<title>ページのタイトル</title>

こちらのtitle要素についてはSEOの面でも重要な要素となってきます。この要素で初めて目に見える部分のカスタマイズが出来るようになります。

具体的には以下の画像の2点に表示されます。

Googleなどの検索サービスの結果と、ブラウザのタブの部分に表示されます。

title要素ではその名の通りページタイトルを記述します。

まとめ

今回の「HTMLの基本を理解し簡単なページを作ってみる①」では、コンテンツ部分に入る前にWEBサイト作成に興味をもってもらえるように本当に基本的な部分に絞って解説していきました。

WEBサイト作成って意外に簡単そうだなと思ってもらえたらうれしいです。実際、身構えているほど難しくないと思っています。

次回では、実際にHTMLファイルを作ってコンテンツ部分を作成していきたいと思います。