震度分布図を作ろう③ ～地震情報をいじろう～

## はじめ
みなさんこんにちは。こんばんは。
さて、本日もやってまいりました、震度分布図を作ろうのシリーズでございます。
すでにはじめの挨拶はネタ切れでございます。

### 前回したこと
前回②では、Leafletの地図を、OpenStreetMapなどの地図タイル形式から、自分でカスタマイズできるgeoJSON形式の地図に変更しました。
![s-20231208230444.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/f9057365-c310-1b48-b2e3-26a890ac92bb.jpeg)

### 今回は…
今回は一旦地図から離れて、地震情報の方にポイントを向けていこうと思います。
今回するのは、地震情報の取得→解析→情報の表示ですね。

## 開発スタート
### 前回までのコードは
前回②までのコードは

https://qiita.com/kottaro123456/items/2d3f96262ff168bbc769

の一番下に乗っていますので、コピーして使用ください。

### 今回の開発は
今回は特に訳の分からない三択クイズなどはありません。

では今回することを見ていきましょう。
今回は
**①**地震情報の取得
**②**地震情報の解説
**③**地震情報を整理して表示
をしようと思っています。

では①の地震情報の取得からやっていきましょう。

### ①地震情報の取得
まずは、百聞は一見にしかずと言う通り、地震情報がうんたらかんたら言っていても仕方ないので、実際に地震情報を取得してみましょう。

地震情報を取得するのの御三家的な、御一家は「P2P地震情報」です。

https://www.p2pquake.net/

このサービスは、JSONをAPIとして提供してくれている＆配信が早い＆サービスが安定的、といういい事ずくめなサービスです。
たぶん、ほとんどの地震アプリが地震情報をここから取っているのではないでしょうか。

おっと、喋りすぎてしまいましたね。
さっそく取得しましょう。

https://www.p2pquake.net/develop/json_api_v2/#/

を開いてください。
開いたら「/history」を開いてください。
![s-スクリーンショット 2023-12-09 231538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/ef011ab3-2820-ac0d-396f-213c31cd5d81.png)

開いたら、右側の「Try it out」を押してください。
![s-スクリーンショット 2023-12-09 231745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/f523c1b6-1901-620f-1092-d87c42918218.png)

押せたらcodesのところに枠が出てきますので、551(地震情報)を入力
![s-スクリーンショット 2023-12-09 231851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/c261ae8f-d62f-493a-628a-72eef49df9cb.png)

そして下へ行き、Excuteを押すと取得できます。
![s-スクリーンショット 2023-12-09 231922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/d41c96f2-0c57-4b70-4f40-ac1704401462.png)

取得できましたね。
![s-スクリーンショット 2023-12-09 232002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/0da7a789-2487-ef22-cedf-ff7d36faf8af.png)

ではその中黒い中に入っている、地震情報を次の章で見ていきましょう。

### ②地震情報の解説
地震情報は、すでにResponse bodyとして、取得できました。
では次は詳しく見ていきましょう。
```javascript
[
  {
    "code": 551, //情報の種類を表す。今回は指定済み
    "earthquake": {
      "domesticTsunami": "None", //国内の津波情報があるか
      "foreignTsunami": "Unknown", //海外の津波情報があるか
      "hypocenter": { //震源に関する情報
        "depth": 60, //震源の深さ
        "latitude": 34.5, //緯度
        "longitude": 140.3, //経度
        "magnitude": 4.7, //マグニチュード
        "name": "房総半島南方沖" //震源名
      },
      "maxScale": 20, //最大震度。だいたいは÷10するとおｋ
      "time": "2023/12/09 16:03:00" //発生時刻
    },
    "id": "65741238a0651c206c9669e3", //固有のID
    "issue": { //発信元
      "correct": "None",
      "source": "気象庁",
      "time": "2023/12/09 16:07:36",
      "type": "DetailScale"
    },
    "points": //各観測点ごとの震度
      {
        "addr": "館山市長須賀", //観測点名
        "isArea": false, //観測点ではなく地域か
        "pref": "千葉県", //都道府県名
        "scale": 20 //震度
      },
      {
        "addr": "鴨川市内浦",
        "isArea": false,
        "pref": "千葉県",
        "scale": 10
      }
    ],
    "time": "2023/12/09 16:07:36.871", //情報発信の日時
    "timestamp": {
      "convert": "2023/12/09 16:07:36.865",
      "register": "2023/12/09 16:07:36.871"
    },
    "user_agent": "jmaxml-seis-parser-go, relay, register-api",
    "ver": "20231023"
  }
]
```
こんな感じで取得できたと思います。
ただ、詳しくは先程のページの下の、Schemas→JMAQuakeを参照ください。

### ③地震情報を整理して表示
#### コンソールを使ってみる
さて、ここからはJavaScriptを使って情報を取得＆表示させていきましょう。
ではいきなりですが、JavaScriptを使うにあたって必須？の**コンソール**についてみていきましょう。

では、作成中の震度分布図のページを開き、F12を押して開発者ツールを開いてください。
F12で開けなかった場合は、メニュー＞その他のツール＞開発者ツールでも開けます。
![s-スクリーンショット 2023-12-09 233759.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/ca87eed1-4368-c3af-06fe-24260e3a6787.jpeg)
出てきたでしょうか。(別ウィンドウとして出てくることもあります。)
出てきたら、上のタブを「コンソール」または「Console」にします。

すると、入力する欄が出てきたと思います。
ではここに、お試しとして
`console.log("震度分布図の作成中です。")`
をペーストして、Enterで実行してみましょう。
そうすると、震度分布図の作成中です。というのが帰ってきたと思います。
![s-スクリーンショット 2023-12-09 234211.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/250ee002-cc5c-dc01-83a4-f2ed36d066c2.jpeg)

つまり、ここは「JavaScriptを実行できる場所」でもあるし、「`console.log()`の中身はここに表示される」というということも分かります。」
では地震情報を`console.log()`でここに出力させてみましょう。

:::note info
ちなみにコンソールには、エラーも出てきますので何かあったらコンソールを見とけばたいていのことは直ります。
:::

#### $.getJSONで取得する
さて、ではやっと本題の地震情報を取得していきましょう。

JSONなどの情報を取得するJavaScriptのコードは前出てきましたね。
そう、`$.getJSON(url, function (data) {})`です。
今回の場合、urlは https://api.p2pquake.net/v2/history?codes=551 となります。
では書いていきましょう。
地図を描画した後に地震情報を取得します。

<details><summary>ソースコード</summary>

```diff_javascript:index.js
var map = L.map('map').setView([36.575, 137.984], 6);
L.control.scale({ maxWidth: 150, position: 'bottomright', imperial: false }).addTo(map);
map.zoomControl.setPosition('topright');

var PolygonLayer_Style_nerv = {
    "color": "#ffffff",
    "weight": 1.5,
    "opacity": 1,
    "fillColor": "#3a3a3a",
    "fillOpacity": 1
}

$.getJSON("prefectures.geojson", function (data) {
    L.geoJson(data, {
        style: PolygonLayer_Style_nerv
    }).addTo(map);
});

+ $.getJSON("https://api.p2pquake.net/v2/history?codes=551", function (data) {
+     
+ });
```

</details>

こうすることによって、取得先のURLから取得した情報が、`data`の中に格納されます。

#### JSONをいじる
まずはJSONを見てみましょう。
JSONってなんぞやと言いますと、JavaScript Object Notationの略らしいのですが、そんなこと私も知りません。
とりあえず、JSONにしておけば、どの言語でも使えるデータ源の種類という感じですね。
たしかに、JSONにしておけば、JavaScriptやPHPなどでもJSONをいじる専用のコードがあるので、やはりJSONが使いやすいイメージはあります。

では地震情報のJSONを見ていきましょう。と言いましたが、[さっき見ましたね。](https://qiita.com/drafts/fbb4c6524a3a2c28aded/edit#%E5%9C%B0%E9%9C%87%E6%83%85%E5%A0%B1%E3%81%AE%E8%A7%A3%E8%AA%AC)

ではここからどうやってJavaScriptでJSONをいじっていくか、体験していきましょう。

まずは、先程のコードに
```diff_javascript:index.js
$.getJSON("https://api.p2pquake.net/v2/history?codes=551", function (data) {
+    console.log(data);
});
```
として、取得できた生データをコンソールに出力してみましょう。
![s-スクリーンショット 2023-12-17 202431.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/f3fb9c43-7b86-067e-c5f7-a94c20c3db17.jpeg)
コンソールの▶ボタンを押して展開していってみると、さきほどと同じデータが得られたかと思います（当たり前体操）。

ではこれをどうやってJavaScriptでいじっていくかというと、▶ボタンの右側、<font color="purple">**`0:`**</font>とか、<font color="purple">**`earthquake:`**</font>とか書いてあるところありますよね。
そこの名前を呼び出していくことで情報を取得します。

その<font color="purple">**`0:`**</font>とかの部分を「**キー**」と言います。
またキーの中身の<font color="purple">`"根室半島南東沖"`</font>などの部分を「**値**」といいます。
イメージとしては、出席確認で「<font color="purple">**`name`**</font>さーん」と呼ぶと、「<font color="purple">`"根室半島南東沖"`</font>」と返ってくる感じです。
その他の「<font color="purple">**`depth`**</font>さーん」や「<font color="purple">**`magnitude`**</font>さーん」も同じです。読んだらその人が持っている値が返ってきます。
これで情報を呼び出します。

ではJavaScriptで名前を読んでみましょう。
まずデータを見ると、<font color="purple">**`0:`**</font> <font color="purple">**`1:`**</font> <font color="purple">**`2:`**</font> <font color="purple">**`3:`**</font>と並んでいるので、<font color="purple">**`0:`**</font>さんを呼んでみます。
このときは、
```diff_javascript:index.js
$.getJSON("https://api.p2pquake.net/v2/history?codes=551", function (data) {
+    console.log(data["0"]);
});
```
とします。`data["0"]`とすることで、`data`の中の`0`を呼んでいます。
これだけです。
あとは、`0`のなかの`earthquake`、`earthquake`のなかの`hypocenter
`、`hypocenter`のなかの`name`というように、続けて書くだけです。
では上の例のように`name`を呼んでみましょう。
```diff_javascript:index.js
$.getJSON("https://api.p2pquake.net/v2/history?codes=551", function (data) {
+    console.log(data["0"]["earthquake"]["hypocenter"]["name"]);
});
```
とかくと、
![スクリーンショット 2023-12-17 204515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/6b39cfb7-97fa-9748-fc1b-d3c69d460898.png)
などと、震源の名前が返ってきたと思います。
あとは、必要な情報をこうやって取り出すだけです。

地震情報をコンソールに表示してみましょう。

<details><summary>ソースコード</summary>

```diff_javascript:index.js
var map = L.map('map').setView([36.575, 137.984], 6);
L.control.scale({ maxWidth: 150, position: 'bottomright', imperial: false }).addTo(map);
map.zoomControl.setPosition('topright');

var PolygonLayer_Style_nerv = {
    "color": "#ffffff",
    "weight": 1.5,
    "opacity": 1,
    "fillColor": "#3a3a3a",
    "fillOpacity": 1
}

$.getJSON("prefectures.geojson", function (data) {
    L.geoJson(data, {
        style: PolygonLayer_Style_nerv
    }).addTo(map);
});

$.getJSON("https://api.p2pquake.net/v2/history?codes=551", function (data) {
-    console.log(data["0"]["earthquake"]["hypocenter"]["name"]);
+    var [time, name, shindo, magnitude, depth] = [
+        data["0"]["earthquake"]["time"],
+        data["0"]["earthquake"]["hypocenter"]["name"],
+        data["0"]["earthquake"]["maxScale"],
+        data["0"]["earthquake"]["hypocenter"]["magnitude"],
+        data["0"]["earthquake"]["hypocenter"]["depth"]
+    ]
+    console.log(time+"ごろ、"+name+"で最大震度"+shindo/10+"の地震が発生しました。マグニチュードは"+magnitude+"、深さ"+depth+"kmと推定されています。");
});
```

</details>

とすると、
![スクリーンショット 2023-12-17 205614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637649/23b28a02-4819-4a59-e34d-fef6f0d992eb.png)
となり、しっかりと地震情報が表示できたことが分かります。

## 終わりに
さて、今回は地震情報を取得し、JavaScriptでいじり、地震情報をコンソールに表示する所まで終わりました。
次回にはさっそく地震情報を元に地図に表示させていきましょう。

今回のデモ
https://nanka.cloudfree.jp/bin/webapps/shindobunpu_qiita/3/

<details><summary>今回までのソースコード</summary>

```diff_html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>震度分布図</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="index.css">
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" />
    <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
</head>
<body>
    <div id="map"></div>
    <script src="index.js"></script>
</body>
</html>
```

```diff_javascript:index.js
var map = L.map('map').setView([36.575, 137.984], 6);
L.control.scale({ maxWidth: 150, position: 'bottomright', imperial: false }).addTo(map);
map.zoomControl.setPosition('topright');

var PolygonLayer_Style_nerv = {
    "color": "#ffffff",
    "weight": 1.5,
    "opacity": 1,
    "fillColor": "#3a3a3a",
    "fillOpacity": 1
}

$.getJSON("prefectures.geojson", function (data) {
    L.geoJson(data, {
        style: PolygonLayer_Style_nerv
    }).addTo(map);
});

$.getJSON("https://api.p2pquake.net/v2/history?codes=551", function (data) {
    var [time, name, shindo, magnitude, depth] = [
        data["0"]["earthquake"]["time"],
        data["0"]["earthquake"]["hypocenter"]["name"],
        data["0"]["earthquake"]["maxScale"],
        data["0"]["earthquake"]["hypocenter"]["magnitude"],
        data["0"]["earthquake"]["hypocenter"]["depth"]
    ]
    console.log(time+"ごろ、"+name+"で最大震度"+shindo/10+"の地震が発生しました。マグニチュードは"+magnitude+"、深さ"+depth+"kmと推定されています。");
});
```

```diff_css:index.css
html, body, #map {
    width: 100%;
    height: 100%;
    margin: 0;
}
#map {
    background: #1d1d1d;
}
```

</details>

## 次回予告
震度分布図を作ろう④ ～震源を表示させよう～

https://qiita.com/kottaro123456/items/d979195a22246e5ba6a2