1
2

P2P地震情報のJSONAPIを適当に使ってみる

Last updated at Posted at 2024-01-15

諸注意

あまりPythonに詳しいわけではないので無駄なことやってるかもしれないです
予防線張っておきます。

2024年1月16日17時21分 : 1部修正しました

やりたいこと

2024年1月1日に発生した能登半島での地震情報を一括で取得する。
そうじゃなくても地震情報を一括で取得したい。

P2P地震情報

一度は目にしたことがあるはずです。開発者向けにjsonapiを提供していたりします。ありがとうございます。

書いていく

とりあえずできたコードです。

main.py
import requests

p2pzishin = "https://api.p2pquake.net/v2/jma/quake?limit=100&order=1&since_date=20240101&until_date=20240102&min_scale=40"

zishin = requests.get(p2pzishin).json()

for i in range(len(zishin[])):
    if zishin[i]['earthquake']['hypocenter']['name'] != '':
        name = str(zishin[i]['earthquake']['hypocenter']['name'])
        maxScale_raw = str(zishin[i]['earthquake']['maxScale'])
        time = str(zishin[i]['earthquake']['time'])
        magnitude = str(zishin[i]['earthquake']['hypocenter']['magnitude'])
        ms = {
            '-1': 'None',
            '10': '1',
            '20': '2',
            '30': '3',
            '40': '4',
            '45': '5-',
            '50': '5+',
            '55': '6-',
            '60': '6+',
            '70': '7',
        }
        maxScale = ms[maxScale_raw]
        if name == "":
            name = "None"
        
        if magnitude == "-1":
            magnitude = "None"
        
        print(f"{i}|{time}|震源地:{name}|最大震度:{maxScale}|マグニチュード:{magnitude}")

最初のところ

まずjsonを取得するためにrequestsをインポートします。
そして取得するためのURLを、今回だと2024年1月1日から2024年1月2日の震度4以上の地震情報を最大100件取得するって感じです。
詳しくは次を参照

そしてzishinに取得したjsonを代入しています。
変数名にローマ字を使っちゃいけない気がしますけどまぁいいでしょう()

表示するとこ

いよいよ表示するところです。
まずforが出てきますがこれは

image.png

取得してきたjsonは各エントリの中にそれぞれ情報が入っております。
forでエントリ数だけ繰り返すようにすればいいじゃんってことでサイレント修正しました。

修正箇所
+ for i in range(len(zishin)):
- for i in range(0,100):

次に出てくるifです。地震情報すべて取得してきちゃうので、震源情報がないやつもあります。それはいらないので空欄の場合は表示させないためです。

そして肝心のところ。nameは震源位置をmaxScale_rawは最大震度で値は10~70です。これは後で辞書で一般的な形にします。timeは発生した時刻、magnitudeはその通りマグニチュードです。
あとは万が一情報がない場合はNoneを返すようにifを書いてprintで表示させるだけです。

結果

2|2024/01/01 16:06:00|震源地:石川県能登地方|最大震度:5+|マグニチュード:5.7
10|2024/01/01 16:10:00|震源地:石川県能登地方|最大震度:7|マグニチュード:7.4
11|2024/01/01 16:18:00|震源地:石川県能登地方|最大震度:5+|マグニチュード:6.1
12|2024/01/01 16:10:00|震源地:石川県能登地方|最大震度:7|マグニチュード:7.6
13|2024/01/01 16:29:00|震源地:能登半島沖|最大震度:4|マグニチュード:4.6
16|2024/01/01 16:39:00|震源地:新潟県上中越沖|最大震度:4|マグニチュード:5.2
17|2024/01/01 16:42:00|震源地:石川県能登地方|最大震度:4|マグニチュード:5.2
18|2024/01/01 16:48:00|震源地:石川県能登地方|最大震度:4|マグニチュード:5
21|2024/01/01 16:56:00|震源地:石川県能登地方|最大震度:5+|マグニチュード:5.7
22|2024/01/01 17:02:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.9
23|2024/01/01 17:07:00|震源地:能登半島沖|最大震度:4|マグニチュード:5.2
25|2024/01/01 17:17:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.6
27|2024/01/01 17:22:00|震源地:能登半島沖|最大震度:5-|マグニチュード:4.8
28|2024/01/01 17:20:00|震源地:新潟県上中越沖|最大震度:4|マグニチュード:4.2
29|2024/01/01 17:53:00|震源地:能登半島沖|最大震度:4|マグニチュード:3.6
32|2024/01/01 18:03:00|震源地:能登半島沖|最大震度:5-|マグニチュード:5.3
35|2024/01/01 18:08:00|震源地:能登半島沖|最大震度:5-|マグニチュード:5.6
36|2024/01/01 18:23:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.4
38|2024/01/01 18:30:00|震源地:能登半島沖|最大震度:4|マグニチュード:4.9
40|2024/01/01 18:40:00|震源地:能登半島沖|最大震度:5-|マグニチュード:4.7
41|2024/01/01 18:56:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.2
43|2024/01/01 19:28:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.4
45|2024/01/01 19:50:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.5
47|2024/01/01 20:35:00|震源地:石川県能登地方|最大震度:5-|マグニチュード:4.6
49|2024/01/01 21:20:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.5
51|2024/01/01 23:30:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.3
53|2024/01/02 00:08:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.5
55|2024/01/02 03:29:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4
57|2024/01/02 04:42:00|震源地:能登半島沖|最大震度:4|マグニチュード:4.9
59|2024/01/02 07:13:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.7
61|2024/01/02 09:01:00|震源地:能登半島沖|最大震度:4|マグニチュード:3.9
62|2024/01/02 09:14:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.7
65|2024/01/02 10:17:00|震源地:石川県能登地方|最大震度:5-|マグニチュード:5.6
67|2024/01/02 15:57:00|震源地:石川県能登地方|最大震度:4|マグニチュード:4.5
70|2024/01/02 17:13:00|震源地:能登半島沖|最大震度:5+|マグニチュード:4.6

こんな感じです。
あとは深さとか、必要そうな情報を取得して、CSVとかにできれば満足ですね。
以上ゴミ記事でした。

CSV+αしてみた

import requests
import csv
import epicenter as epi #震源位置を地図上に表示するためのpyファイル

p2pzishin = "https://api.p2pquake.net/v2/jma/quake?limit=100&order=1&since_date=20240101&until_date=20240102&min_scale=40"

zishin = requests.get(p2pzishin).json()

count = 0

# CSVファイルを書き込みモードで開く
with open('earthquake_data.csv', 'w', newline='', encoding='utf-8') as csvfile:
    # CSVライターを作成
    csv_writer = csv.writer(csvfile)

    # ヘッダーを書き込む
    csv_writer.writerow(['Count', 'Time', 'Hypocenter', 'Max Scale', 'Magnitude', 'depth(km)'])

    # データをCSVに書き込む
    for i in range(len(zishin)):  # エントリ数だけ繰り返す
        if zishin[i]['earthquake']['hypocenter']['name'] != '':
            count += 1
            depth = str(zishin[i]['earthquake']['hypocenter']['depth']) + "km"
            name = str(zishin[i]['earthquake']['hypocenter']['name'])  # 震源位置
            maxScale_raw = str(zishin[i]['earthquake']['maxScale'])  # 最大震度(変換前)
            time = str(zishin[i]['earthquake']['time'])  # 発生した時刻
            lat = float(zishin[i]['earthquake']['hypocenter']['latitude'])
            lon = float(zishin[i]['earthquake']['hypocenter']['longitude'])
            magnitude = str(zishin[i]['earthquake']['hypocenter']['magnitude'])  # マグニチュード

            ms = {
                '-1': 'None',
                '10': '1',
                '20': '2',
                '30': '3',
                '40': '4',
                '45': '5-',
                '50': '5+',
                '55': '6-',
                '60': '6+',
                '70': '7',
            }
            maxScale = ms[maxScale_raw]  # 最大震度を一般的な形に

            if name == "":
                name = "None"

            if magnitude == "-1":
                magnitude = "None"

            # データをCSVに書き込む
            csv_writer.writerow([count, time, name, maxScale, magnitude, depth])
            #epi.genmap(lat,lon,f'{count}_{name}') #緯度と経度を渡して震源地を地図で

            print(f"{count}|{time}|震源地:{name}|最大震度:{maxScale}|マグニチュード:{magnitude}|緯度:{lat}|経度:{lon}")

print("CSVファイルに書き込みが完了しました。")

5_能登半島沖.png

↑こんなこともできるようにした。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2