tomorinのPC日記

PC好きな人がいろいろ書くブログ。

C# formで地震情報を表示する(C#未経験者向け)

この記事は、防災アプリ開発 Advent Calendar 2023 6日目の記事です。

 

機能の記事はしろねのさぶさんのNode.js で地震情報の取得とかです。

私はNode.js?ナニソレ状態だったのですげぇ、、、と思いながら読んでました。やってみようかな?

(勝手に記事のURL張って申し訳ございません)

 

注意:この記事は、2日間も記事が無いままだとなんか寂しいな、、、と思ったので記事を書きました。ネタもあんまいいものじゃないし、数時間で書いたので、誤字脱字等があるかもしれませんが、中継ぎな記事何だなぁ、、と思いながら熱い目で読んでください(((

 

 

今回の記事の内容

今回の記事では、C#初心者が頑張って理解した地震情報を受信してC# Formに描画する方法をぱぱーっと書いていきたいと思います。

多分もっと効率の良い方法などがあるとも思います。その時はコメントやDM等でそっと教えてください(((

自己紹介については23日の記事で書くので割愛します。ゆるして

まず前提

とりあえず開発環境を整えるところから始めましょう

今回はVisualStudioを使用します。formを使えるのは私の知る限りVisualStudioしか知らないし、無料なので使用します。というか私がVisualStudioしか知らないんですけどね、、、

ということで、Visual Studio Community Editionをダウンロードしましょう。

ダウンロードしたら、exeファイルを開き、ユーザアカウント制御を許可してインストーラーの言われるようにダウンロードしていきましょう

そしたら、ランチャーが起動すると思うので、写真の物をダウンロードしましょう。

↑多分これをダウンロードすればOKです。間違えてるかも

VisualStudioはすでにダウンロードしていてダウンロードの方法がまだやってない人ので少し雑です、、、申し訳ない、、、

再ダウンロードしてもよかったんですけど、時間が無くて((

制作する環境を作る

はい、VisualStudioがダウンロード出来たら、起動しましょう

そしたら、これを押して、

こいつを選択します。

そしたら、プロジェクト名だけ決めます。何でもいいですが、適当な奴にすると後々めんどくさくなると思うので、やめましょう(((

今回はEarthQuakeInfoTestという名前でやっていきたいと思います。

そしたら、環境は完成したと思うので、早速制作していきましょう!

制作開始

はい。とりあえずこのような画面になったと思います。

そしたら、このForm1というウィンドウをカチカチッ!っとダブルクリックして

プログラムを書けそうな画面に行きましょう。

C#の記述について

はい。最初はなんじゃこりゃ??????となると思います。誰でもそうです。

簡単に説明すると、この

private void Form1_Load(object sender, EventArgs e)
{

 

}

という部分では、プログラムを実行したときに{     }に書かれた部分のプログラムが実行されます。

これだけ覚えておけば、なんとなくはできると思います。

他のいろいろは、、、、ググってください!!!!!!!!(投げやり)

とりあえず定期的に地震情報を受信するところを作る

はい。とりあえずさっきのウィンドウがあったデザインの画面に戻りましょう

そしたら、左のほうに、ツールボックス、というものがあると思うので、押しましょう。ない人は、Ctrl+Alt+Xを押したら開きます。

そしたら、この中からすべてのWindowsフォームというところを展開し、Timerをクリックします。

そしたら、そのままウィンドウのところをクリックすると、

こいつが追加されてると思います。そしたらそいつを右クリックして、プロパティを開きます。

そしたら、右下などに、プロパティが出てくると思います。

Intervalの部分は、取得したい周期をミリ秒で指定します。

今回は30秒に1度取得するということで、30000にします。

そのあと、上にあるEnabledをTrueにしておきましょう。名前はそのままでいいと思います。

そしたら、さっきの左下のほうにあるTimer1というやつをダブル左クリックして、さっきのプログラムを書けそうな画面に行きます。すると、

private void timer1_Tick(object sender, EventArgs e)
{

 

}

この下に、以下のように記述してください

private void APIpost()
{

 

}

APIpostという部分はなんでもいいんですけどね、、、

すると全体がこんな感じになります

そしたら、このAPIpostというものは、地震情報を受信するプログラムを後々記述するので、先ほど説明したプログラム実行時の部分と、取得周期で実行するところで、実行されるようにします。

private void Form1_Load(object sender, EventArgs e)
{

        APIpost();

}

private void timer1_Tick(object sender, EventArgs e)

{

        APIpost();

}

 

という感じにします。もっといい方法があると思うのですが、わからないのでこうします。

初心者がこんな記事書くな!!!って話ですよね、、、

地震情報受信部分を制作

はい。地震情報を受信する部分を作っていきましょう。

private void APIpost()
{

        

}

こちらの{     }内に記述していきましょう

まず、地震情報のソースとして、P2P地震情報を使用します。

この{     }の中に

            string url = "https://api.p2pquake.net/v2/history?codes=551";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            Stream stream = response.GetResponseStream();
            StreamReader reader = new StreamReader(stream);
            string jsonString = reader.ReadToEnd();

と記述します。これはP2P地震情報から情報を受信してそのままの電文を受信しているプログラムです。多分もうちょっとましな方法があります。頭の良い方々教えてください(((

何はともあれ、地震情報を受信するところまではできました!!あとは表示するだけと思いきや、このままだと、何も解析されていない情報なので、大切な震源地名などだけを抜き出すシリアライズという作業が必要です。

ということでここをやっていきましょう

シリアライズ

正直、簡単です(!?)

私もプログラムを作るところまでは大変でしたが、1行(正確には結構ある)でできてしまいます。

 

このわんさかあるstring url = ~~~~~~~~ ReadToEnd();という部分の下に、改行してスペースを作ります。

そしたら、そこに

 Class1 deserial1 = JsonConvert.DeserializeObject<Class1>(jsonString);

と入力しましょう

しかし何やら、エラーがたくさん出ていますね、、、一つずつ直していきましょう。

まずJsonConvertという部分から直していきましょう。

JsonConvertを右クリックして、クイックアクションとリファクタリングというところを押します

すると、下の写真のようなものが出てくると思うので、クリックしてインストールします。

すると、、、?

緑色になって直りました!!

 

そしたらClass1という部分を直していきましょう。

これも簡単です。

ここにしたの怪文をコピペしてください。

public class Class1
{
    public int code { get; set; }
    public earthquake earthquake { get; set; }
    public string id { get; set; }
    public Issue issue { get; set; }
    public List<Point> Points { get; set; }
    public string time { get; set; }
    public string user_agent { get; set; }
    public string ver { get; set; }
    public int depth { get; set; }
    public hypocenter hypocenter { get; set; }
}

public class earthquake
{
    public string domesticTsunami { get; set; }
    public string foreignTsunami { get; set; }
    public hypocenter hypocenter { get; set; }
    public int maxScale { get; set; }
    public string time { get; set; }
    public float magnitude { get; internal set; }
}
public class hypocenter
{
    public int depth { get; set; }
    public float latitude { get; set; }
    public float longitude { get; set; }
    public float magnitude { get; set; }
    public string name { get; set; }
}

public class Issue
{
    public string type { get; set; }
    public string time { get; set; }
    public string eventId { get; set; }
    public string serial { get; set; }
}
public class Point
{
    public string addr { get; set; }
    public bool isArea { get; set; }
    public string pref { get; set; }
    public int scale { get; set; }
}

 

すると、、、?

エラーが無くなりました!!!やったね!!!!

そしたら、いよいよ表示の部分に入りましょう!

さっきのウィンドウがあった画面に戻りましょう

デザインを作ろう!!

はい。この部分に関しては皆さんのセンス次第です。先ほど出てきたツールボックスから、labelを出しましょう。

出ましたね!そしたら試しとしてこいつに最新の地震情報の震源地名を表示させましょう!!

何もないところをダブル左クリックして、さっきのC#な画面に戻りましょう。

そしたら改行をして、この部分に表示の処理をしましょう。

まず、このプログラムは、ざっくり日本語に訳すと、

label1(さっきのやつ)のText(さっきのやつに書いてあった文章)を地震情報(震源地名)に置き換えるよ~~~

ということです。やっていこう

プログラムでは

label1.Text = deserial1[0].earthquake.hypocenter.name;

こいつをClass1 deserial1 = JsonConvert.DeserializeObject<Class1>(jsonString);

の下に書きます。

label1.Text = deserial1[0].earthquake.hypocenter.name;

↑右の部分をざっくり説明すると、さっき

Class1 deserial1 = JsonConvert.DeserializeObject<Class1>(jsonString);

この部分で、難しい原文を解析したので、その解析したデータをさっきの右側のやつで出したってわけですね。

deserial1[0]というのは、最新の地震情報という意味です。機械は1番目=0からスタートなので、0です。1にすると一つ前の地震情報になります(多分)

これが記述出来たら、プログラムを始めて起動してみましょう!緊張しますね!!

"開始"を押します。

 

するとさっき作ったウィンドウが出てくると思うので、見てみると、、、最新の地震情報の震源地名が出ているではありませんか!!!やったね!!!!

↑書いてるときの表示(12/5 23:32現在)

天下のYahoo様と同じですね!!成功です!!!

そしたら、こちらの情報たちを使用して、地震情報を表示させましょう!!!!!!

あとは、皆さんに任せますが、deserial1[0].earthquake.hypocenter.name だった部分だけ説明しておきますね。

このhypocenter.の隣のnameという部分を以下の物を参考に変えましょう

depth = 震源の深さ

latitude = 震源の緯度

longitude = 震源の経度

magnitude = 地震の規模(マグニチュード)

name = 震源地名

 

また、hypocenterの部分を消して、earthquake.にすると、

津波の有無などが分かります。

P2P地震情報さんのサイトへ左を押してアクセスして下のほうに行くと

こんなものがあると思うので、JMAQuakeを押してみると、さっきのやつの詳しい解説が書いてあります。

これらを使用して、地震情報を表示するソフトを作ってみてください!!!

maxScaleというものの扱いが難しいのですが、時間がやばいので割愛させてください

福岡のとある地震観測者さんが去年の10日に出してた記事に書いてあった気がするので、それを参考にしてください。勝手に書いて申し訳ございません

 

マジで説明不足だと思うのですが、時間が無いんです(12/5 23:41なう)ゆるして

 

わかんない!って人はこの記事とか私のXにDMしていただければ教えられる限り教えるので、よろしくお願いします

 

 

長くなりましたが、お疲れさまでした。

明日は誰もいません!!誰か;;(追記アリ)

明後日の記事は、maikuradentetuさんの距離減衰式で長周期地震動階級を推定してみた だそうです。面白そうですね!!

勝手に書いて申し訳ございません!

 

追記

明日の記事はけーいちさんの手のひらサイズの地震計開発キットEQIS-1を作った話です!

急遽滑り込みで入られたとのことなので追記です!!

おまけ

これ、23日に出す記事より4000文字くらい多いんだよね、、、本命より多かった、、、