LoginSignup
2

More than 3 years have passed since last update.

Pythonでビーチボール(=地震の発震機構)を書く!

Posted at

はじめに

本当はQGISのプラグインの作り方にしようと思っていたけど、思っていたより不便で残念な出来だったのでガラッと変えました。
発震機構をQGISに落とし込もうとする人はいないのかもしれませんが、別の研究・調査に彩りを添えるのにいかがですか??
GMTでいいじゃん、、、って話ですが、QGISにさえ落とし込めればコマンドをいちいち打ったりしなくて良くなるのがGOODポイント。特にプレート境界とかの広い領域の話のときは拡大・縮小ができて移動もシームレスなのがよい点です。

バージョンなど

・python3 == 3.7.6
・QGIS3 == 3.14.1

ビーチボール作成にはobspy を使います

データのダウンロード

どこからでも良いですが、無難に気象庁からCMT解をzipファイルでダウンロードします
http://www.data.jma.go.jp/svd/eqev/data/bulletin/cmt.html

プログラムの方針

データを整形し、QGISに読み込ませるデータを絞る。データ内にsvgファイル名を入れておく
機構をそれぞれsvgファイルに出力し、QGISではデータ内のファイル名と対応するsvgファイルを描画させるようにする。

プログラム

ファイルフォーマットも書かれているので、必要なデータだけを整形します。
最低限必要なものとしては
発震年月日時刻・lon・lat・深さ・マグニチュード・走向・傾斜・すべり角
でしょうか。
QGISに読み込む際に必要になるので"id"として通し番号を振っておきます。
また、QGISに読み込ませやすい形式で出力しておきます。今回はcsvファイルで保存しています。

svgファイルの出力先はどこか一つのフォルダにまとめておきます。
実際のsvgファイルの作成は以下のように行っています。


from obspy.imaging.beachball import beachball

#seikeiはリスト['id','date','N','E','Depth', 'Magnitude', '走向', '傾斜角', 'すべり角']のリスト

def focal_maker():
    for i in range(len(csvseikei)):
        np = [float(seikei[i][6]),float(seikei[i][7]),float(seikei[i][8])]  #strike,dip,rake
        file_name = str(csvseikei[i][0])+'.svg'
        dp = csvseikei[i][4]  #depth
        if dp == 0:  #depthによって色を変えている
            cl=[192,192,192]
        elif 0<dp<=30:
            cl=[255,0,0]
        elif 30<dp<=100:
            cl=[255,255,0]
        elif 100<dp<=200:
            cl=[0,255,0]
        else:
            cl=[0,0,255]
        cl = list(map(lambda x: x/255, cl))  #RGBを0.0~1.0で指定する必要がある
        beachball(np, facecolor=cl, outfile='./SVG_output/'+file_name)

if __name__ == '__main__':
    focal_maker()

QGISでの読み取り

いつもと同じようにid・発震年月日時刻・lon・lat・深さ・マグニチュード・走向・傾斜・すべり角が入ったcsvファイルを読み込みます。(別記事参照)
読み込んだレイヤのレイヤプロパティを開きます。シンポロジをクリック、右上のシンプルマーカーをクリックするとこのような画面になります。
コメント 2020-08-09 125706.png

「シンボルレイヤタイプ」のドロップダウンリストからSVGマーカーを選択します。
コメント 2020-08-09 130426.png

下の方にテキストボックスがあります(図だと"circle"と入力されている場所)。
右側のデータを格納できそうなボタン("データによって定義された上書き")をクリック>編集をクリック
すると式タブが開きます。
concat('svgファイルが入ったフォルダの絶対パス',"id",'.svg')
を打ち込み
コメント 2020-08-09 131454.png

OKをクリック
すると発震機構がプロットされるはずです。
あとはシンボルの大きさをマグニチュードに合わせて変化させたりすれば完成です。

コメント 2020-08-09 132108.png

QGIS バージョン3.14から時間によってシンボルの描画をコントロールできるようになりました。これまでデータを分けていたケース(例えば東北地方太平洋沖地震前後)でも一つのデータセットをQGISにぶち込めば良くなりそうなので結構便利だと思っています。


他人のプラグインとかを見ながらプラグイン作成はゆっくり進行中です
研究の進捗が芳しくないのでしばらく休憩します。

何かご意見等ございましたら
分からないことも一緒に悩むぐらいはできます。
twitterまでお気軽にご連絡ください@ohcelot
2020/08/09新規作成

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
2