【初心者向け】KyoshinMonitorLibチュートリアル

この記事は [地震界隈 Advent Calendar 2020](https://adventar.org/calendars/5903) 9日目のやつです。

僕の作成したライブラリである、KyoshinMonitorLibを使って各観測点の震度を取得してみましょう。
初心者の方でもなんとなく動かせるようになるように画像マシマシ、言語機能は控えめにやります。

## プロジェクトの作成
VisualStudioを起動したらまずは `新しいプロジェクトを作成` しましょう。
(もしかしたらウィンドウの色が違うかもしれませんが、あまり気にしないでください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/0e9b80f8-9817-d6f4-7542-ec902342ae8d.png)

みなさん豪華な画面のアプリを作ってみたいと思うかもしれませんが、まずは基本のロジック部分を触ってみるということでコンソールアプリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/953b586d-5538-883e-6b4e-5b7959d2e4f0.png)

プロジェクトの場所は好きな場所で大丈夫ですが、プロジェクトフォルダをまとめるフォルダを作っておくのがおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/6a6473ec-e91a-94fd-4d78-2853b7685767.png)

これでプロジェクトの作成は完了です。

## ライブラリのインストール
プロジェクトの作成が完了したら `ソリューションエクスプローラー` の今回作成したプロジェクトを右クリックして `NuGet パッケージの管理` を選んでください。
(殆どの方はソリューションエクスプローラーが左側にあるかもしれません。僕が右側が好きなだけなのであまり気にしないでください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/b29ece54-cde2-3c2d-3ce4-31c1d04fafc2.png)

画面が表示されたら、

1. **上部の `参照` をクリックし、** 検索ボックスに `KyoshinMonitorLib` と入力します。
2. 今回は画像から取得するのが目的なので、 `KyoshinMonitorLib.Images` を選択してください。
3. 右側に表示される `インストール` ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/7d34a8f0-8b8f-a142-83c8-0f8cf8b3095a.png)

`変更のプレビュー` が表示されたらそのままOKしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/b2b0a8d7-93ca-c8ae-a5f9-3188b6356b7a.png)

## 事前準備
ここから強震モニタの情報を取得する処理を書いていくわけですが、強震モニタからは観測点情報を取得することができません。
そのため、別途観測点情報が必要になりますが今回は僕が作成した観測点リストをダウンロードしてください。
https://github.com/ingen084/KyoshinEewViewerIngen/raw/936634ae230942126790de1a3d1dc545a2f7de98/src/KyoshinEewViewer/Resources/ShindoObsPoints.mpk.lz4

(自作ソフトに同梱も可能です。その際はクレジットの記載をしていただけると非常に喜びます。またこのデータは時期によっては古くなっている可能性があるため定期的に確認してください。)

ダウンロードが完了したらそのファイルをソリューションエクスプローラーにドラッグドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/9fdd7bde-911c-51fa-1394-61a33daccb05.png)

ドラッグドロップが完了したらそのファイルを右クリックし、プロパティを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/9419c66a-07a6-946b-5378-9f3846029046.png)

`出力ディレクトリにコピー` を `新しい場合はコピーする` に選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/207b8683-84ed-a95f-a9f9-7a289d934cdb.png)

これで観測点データの準備はバッチリです。

## とりあえず取得してみる
`Program.cs` を以下のように書き換えてみてください。

```C#
using KyoshinMonitorLib;
using KyoshinMonitorLib.Images;
using System;
using System.Threading.Tasks;

namespace KyoshinMonitorLibTutorial
{
	internal class Program
	{
		// awaitが使えるようにasync Taskに
		static async Task Main()
		{
			// 出力ディレクトリにコピーした観測点情報を読み込む
			var points = ObservationPoint.LoadFromMpk("ShindoObsPoints.mpk.lz4", true);
			// しっかりメモリを開放するためにusingをつけてAPIのクライアントを作成する
			using var webApi = new WebApi();

			// 現時刻から1分前の時刻を取得する
			var targetTime = DateTime.Now.AddMinutes(-1);

			// もとにする観測点情報と取得したい時間を添えて震度を取得する
			var result = await webApi.ParseIntensityFromParameterAsync(points, targetTime);

			// Dataがnullの場合は取得に失敗している
			if (result.Data == null)
			{
				Console.WriteLine("取得に失敗しました");
				return;
			}

			// とりあえず観測点情報を出力してみる
			foreach (var point in result.Data)
			{
				// AnalysisResultがnullの場合は取得できていない観測点のため表示しない
				if (point.AnalysisResult == null)
					continue;

				// 地域名 観測点名 震度 の形で出力してみる
				Console.WriteLine(point.ObservationPoint.Region + " " + point.ObservationPoint.Name + " " + point.AnalysisResult);

				// point.Color で解析に使用された色
				// point.ObservationPoint.Location で地理座標
				// とかいろいろできるので活用しよう！
			}
		}
	}
}

```

ちなみに `しっかりメモリを～` と書いている部分は半分ウソなので初心者の方は鵜呑みにしないでください。分かる人はわかると思います。
このまま実行するとずらーっと次のように出力されると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100304/0c9fc41c-b649-874e-a5cf-d57acb89723a.png)

バッチリ取得できましたね！
毎秒正確な時間にリクエストするためのタイマーやインターネット時刻の活用などを行う機能もあるので主な使用例はこちらのコードも参考にしてみてください。(丸投げ)
https://github.com/ingen084/KyoshinMonitorLib/blob/master/src/Tests/Program.cs

タイマー周りは多分Kiwi Monitorでも使われてると思います。

## URL生成機能
そんな解析機能いらねえよ！という方向けにURL生成クラスも用意しています。

```C#
// using KyoshinMonitorLib.UrlGenerator;

// 地中PGA画像データへのURLを作成
WebApiUrlGenerator.Generate(WebApiUrlType.RealtimeImg, targetTime, RealtimeDataType.Pga, true);
// 地上1.0Hz応答速度画像データへのURLを作成
WebApiUrlGenerator.Generate(WebApiUrlType.RealtimeImg, targetTime, RealtimeDataType.Response_1Hz);
// P/S波画像データへのURLを作成
WebApiUrlGenerator.Generate(WebApiUrlType.PSWave, targetTime);
// 緊急地震速報情報のURLを作成
WebApiUrlGenerator.Generate(WebApiUrlType.EewJson, targetTime);
```

すでにソフトを作成されている方も是非活用してみてください。