Geolocation APIで現在位置を取得する

## はじめに
Geolocation APIを使って現在位置を取得する方法の簡単なまとめです。
<a href="https://www.fukusagi.com/geolocation-api%e3%81%a7%e7%8f%be%e5%9c%a8%e4%bd%8d%e7%bd%ae%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b/" target="_blank">ブログ</a>にも同様の内容を投稿しています。

## 概要
- Geolocation APIの概要
- 実際に現在位置を取得する

## Geolocation API
Geolocation APIとは、ユーザの位置情報を取得するためのAPIです。
GPS、IPアドレス、無線LAN、WiFiなどから位置情報を取得することができます。
位置情報を取得するためには、ユーザの許可が必要です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/60246662-8756-dbb6-c33f-6d28d2fb3cff.png" width="300" >

## Geolocation APIのオブジェクト
Geolocation APIのGeolocationオブジェクトはデバイスの位置を取得する機能を提供します。
Geolocationオブジェクトを取得するには、Navigatorオブジェクトのgeolocationプロパティを使用します。
Geolocationオブジェクトのメソッドは以下です。

|メソッド|説明|
|:--|:--|
|getCurrentPosition()|デバイスの現在位置を取得する|
|watchPosition()|デバイスの位置情報を監視する|
|clearWatch()|watchPosition()メソッドで取得中のデバイスの監視状況をクリアする|

<br>`getCurrentPosition()`、`watchPosition()`では、引数としてコールバック関数を指定できます。
指定できるコールバック関数は以下です。

|コールバック関数|説明|
|:--|:--|
|PositionCallback|位置情報の取得が成功したときに呼び出されるコールバック関数<br>Positionオブジェクトを引数とする|
|PositionErrorCallback|位置情報の取得が失敗したときに呼び出されるコールバック関数<br>PositionErrorオブジェクトを引数とする|

<br>`PositionCallback`の引数となるPositionオブジェクトは現在位置を表します。
Positionオブジェクトのプロパティは以下です。

|プロパティ|説明|
|:--|:--|
|coords|現在位置情報を持つCoordinatesオブジェクトを取得する|
|timestamp|位置情報が取得された時間を取得する|

<br>Coordinatesオブジェクトから取得できる現在位置情報は以下です。
他にも取得できる情報はありますが、今回は省略します。

|プロパティ|説明|
|:--|:--|
|latitude|緯度を取得する|
|longitude|経度を取得する|
|altitude|高度を取得する|


## 実際に現在位置を取得してみる
Geolocation APIを使って、緯度と経度を取得してみます。
今回は取得した位置情報を画面に表示するだけの簡単な画面を作成しますが、いずれは取得した位置情報を利用して、Mapと連携できるといいなと考えています。
<br>まず、簡単な画面を作成します。

```html:index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Geolocation Sample</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="center">
        <div class="btn-margin">
            <button id="btn" class="btn btn-outline-primary btn-lg">
                現在位置を取得する
            </button>
        </div>
        <div class="txt-margin">
            <p>緯度：<span id="latitude">???</span><span>度</span></p>
            <p>経度：<span id="longitude">???</span><span>度</span></p>
        </div>
    </div>
    <script src="geolocation.js"></script>
</body>
</html>
```

ブラウザで表示してみるとこのようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/44e76196-c531-7e3f-b6ad-44111f1b8411.png" border="1">

次に、ボタンを押した時の処理を書きます。


ボタンがクリックされたときに`getCurrentPosition()`メソッドを使用して位置情報を取得します。

```js
navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
```

取得に成功した場合、`successCallback`コールバック関数が呼び出されます。

```js
function successCallback(position){
};
```
`successCallback`の中で、緯度と経度を取得します。
取得した緯度と経度を画面の`<span>`に表示します。


```js
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;

document.getElementById("latitude").innerHTML = latitude;
document.getElementById("longitude").innerHTML = longitude;
```


取得に失敗した場合、`errorCallback`コールバック関数が呼び出されます。

```js
function errorCallback(error){
};
```

`errorCallback`の中で、画面にアラートを表示します。

```js
alert("位置情報が取得できませんでした");
```
<br>
上記のコードをまとめると、このようになります。

```js:geolocation.js
// ボタンを押した時の処理
document.getElementById("btn").onclick = function(){
    // 位置情報を取得する
    navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
};

// 取得に成功した場合の処理
function successCallback(position){
    // 緯度を取得し画面に表示
    var latitude = position.coords.latitude;
    document.getElementById("latitude").innerHTML = latitude;
    // 経度を取得し画面に表示
    var longitude = position.coords.longitude;
    document.getElementById("longitude").innerHTML = longitude;
};

// 取得に失敗した場合の処理
function errorCallback(error){
    alert("位置情報が取得できませんでした");
};
```
これを実際に動かしてみます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/44e76196-c531-7e3f-b6ad-44111f1b8411.png" border="1">

現在位置を取得するボタンを押下すると、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/9c8d9161-f9e1-4dcf-6953-96dad2a559d8.png">
現在位置の情報が画面に表示されています。
取得に失敗した場合は、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/02fedceb-7209-7f32-5135-c04b98cc5de7.png">


このようにアラートが表示されます。

## おわりに
Geolocation APIをはじめて使ってみましたが、簡単に位置情報を取得できることにびっくりしました。
簡単なまとめですが、誰かの助けになれば幸いです。