指標の一つとして有益な情報です.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS14.7
スポンサーリンク
ダウンロード
米JTWCの台風情報
台風情報と言えば気象庁ですが, 軍用地などの資産を守る一手段として, 米海軍および陸軍合同で設立した機関があり, そこで提供されているのがこのサイトです.
目的が異なるため, 同じ台風情報でもこちらについては中心気圧についての情報はありませんが速報具合や予測進路についてはこちらに分がある印象です(個人的な感想です).
サイトにアクセスすると, タイあたりを中心とした地図があり, 台風やその「卵」があると危険度などに応じて表示され, 各々の詳細はページ右から確認できます.
台風が発生するとページ右に情報が表示されます.
ここでは全部紹介することはしませんが最低限知っておくとよいものとして
- TC Warning Text
- TC Warning Graphic
があります.
順番が逆になりますが, TC Warming Grapgicでは台風の予想進路をマップ画像で確認できます.
こちらにも情報が略記されていますが全体でgif画像になっているためテキストとして取り出すことはショートカットではできません.
今回使用するのはTC Warning Textの方です.
ここでは台風の基本情報と進路予想時の位置や風速などの情報が書かれています.
ここにあるテキストから欲しい情報を取り込むのが今回の目的です.
テキストをもう少し見てみます.
280600Zというのは時刻を表しており, この場合28日06時00分を意味しています.
ただしこれは標準時であるため, 日本時間にするには9時間足す必要があります, なのでこれは日本時間で28日15時00分ということになります.
その後ろにある39.5N 140.3Eは位置を表しています, 秋田県大仙市あたりですね.
次の行にあるMAX SUSTAINED WINDSは最大風速, GUTSは最大瞬間風速の値です.
各々の風速の単位はノットですから, 我々日本人が慣れ親しんでいる風速単位であるm/sに直さないと分かりづらいので計算する必要があります.
よって, 今回は各時刻における最大風速と最大瞬間風速をm/sで取得することを考えます.
(位置情報は数値で見て分かる人はほぼいませんし, そこまでするならTC Warning Graphicを見たほうが早いので割愛します)
レシピ
では実際にレシピを見ていきます.
JTWCにおけるTC Warning TextのURLは
https://www.metoc.navy.mil/jtwc/products/wpXXXXweb.txt
となっています.
このXXXXの部分に各台風に対応する4桁の数字が入るのですが, それをノンタップで取得する方法が結局思いつきませんでした.
おそらく「台風の番号」+「発生日」のようではあるんですがそれ以上は不明です.
執筆時点である8月4日に宮古島周辺にある台風(の卵)に9721なんて番号が振られているので全然関係なさそうです.
ともかく今回はその「台風コード」を辞書に入れます.
辞書のキーを同一にし, 値の方に台風コードを入れ, 上のURLのXXXXの部分に指定します.
こうすることで複数の台風を切り替えることができます, 切り替える際はチェックしたい台風を辞書アクションの先頭にすればいいです.
そしてこのURLから「Webページの内容を取得」で中身を取得します.
メインの処理に入ります.
TC Warning Textでは更新時点での情報に加え, 台風の状況に応じていくつかの予想情報を含んでいます.
またテキストの先頭部分に, その台風の英名が書かれています.
なのでそれらをうまく分割するような文字列を選んで「テキストを分割」で分割していきます.
今回はそのために"POSITION:"と"AT:"を採用しましたが条件に合うものなら他でも構いません.
これを行えば分割の一つ目に台風の英名が, そして二つ目以降には各時間における風速の情報が一対一で含まれているはずです.
そして分割したテキストを使って「各項目を繰り返す」で処理します.
まずは風速情報から取り込んでいくことにします.
分割したテキストの塊を改行で分割します.
今回は先の段階で"POSITION:"で分割したことにより, 分割の2行目に日付と位置情報の文字列が固定で存在します.
よって「リストから項目を取得」で2行目を取得します.
これで得た文字列は例えば
271800Z -- NEAR 37.8N 142.0E
です, 日付はこのうち271800に相当する場所であり, 更にこれを先頭2桁ずつ区切って(わかりやすい)日本時間に直さなければなりません.
これが日本時間までの変換処理です.
取得したテキストから先頭6桁の数だけ取り出すんですが, 台風の状況によって時刻の後ろが " --- NEAR" だったり " --- " だったりします.
そのためこの2通りで分割します(この順番で分割すればどちらか1回しか分割されません).
分割した先頭が時刻にあたる数字6桁です.
これを正規表現で先頭2桁ずつ取り出します(末2桁は固定で0分なので省略).
これを現在時刻の年と月に繋げて再フォーマットし, 更に9時間加算します.
元データは日付からだけで月がないため, 残りは現在の時刻からカスタムフォーマットで補完します.
確認できていないですが月をまたぐとこの方法じゃダメな気がします…
これで時刻については完成です.
次はつの風速です.
ここでは「ファイルにフィルタを適用」を使って"MAX SUSTAINED WINDS-"を含む行を取得します.
分割した一つにそれを含む行が一つしかないのはわかっているため, 取得制限はオフのままです.
上記の時点で得られたテキストは例えば
MAX SUSTAINED WINDS - 035 KT, GUTS 045 KT
です.
なので先頭にある"MAX SUSTAINED WINDS -"や末端にある"KT"を消し, "KT, GUTS"で分割すれば2つの風速値を得ることができます.
値を得るために改行で分割もしておきます.
先の通り, 我々はノットという単位に馴染みがないのでこれをm/sに変換します.
計算はノットの値を1.944で割ることで得られます.
こうして得た各予測の時刻と2つの風速値を「テキスト」アクションで体裁を整え, 適当な変数に追加します.
これで各予測の繰り返し処理は完成です.
順番が逆になってしまった, 台風の英名を取得します.
これは「各項目を繰り返す」内の初めに行った「繰り返しインデックスが1と等しくない」の「その他の場合」になります.
「一致するテキスト」で"SUBJ/TROPICAL STORM"から始まる1行を正規表現で探します(末尾に.*を付けています).
ここから不要な文字を取り除けばいいんですが, 台風の状況次第でこの行の内容の先頭が"SUBJ/TROPICAL STORM~"だったり"SUBJ/TROPICAL DEPRESSION~"だったりします.
そのため変数を使って上書きすることで双方に対応します.
どちらを先にしてもいいですが, 後者の「変数を設定」は一致する場合のif文内で行わないと, 条件によって空に上書きされてしまうため注意です.
これで英名を含む行が取得できたので, 不要な先頭部分をまず取り除きます.
不要な先頭を取り除いたので, あとは英名の後ろの部分を分割し, その最初の行を取得することで無事英名を取り出すことが可能となります.
「各項目を繰り返す」から抜け, 最後にこれまでに取得した英名と予測情報を繋げ, 表示させればレシピの完成です.
ただし最初の「辞書」で4桁の数字に対応する台風のページがサイトにない, あるいは単純に誤っている場合があるためその例外処理も行います.
(最初にやっておけばよかったんですが後付けになってしまいました)
「Webページの内容を取得」でそのようなページの内容を取得すると, "AccessDenied~"から始まるテキストになっているはずなのでこれをif文の条件とします.
実行
実際に動かすと画像のように時刻ごとの結果が得られます.
エラー処理についても概ね問題ありません.
今回は修正を複数行ったせいで処理を最後にしてしまいましたが, 本来であれば「Webページの内容を取得」の後で行うのがよいです.
さもないとそれ以降の余計な処理をし続けることとなります.
〆
普段であれば, Webページの本文を取得するのに「URLの内容を取得」のアクションを使っているのですが, しょっちゅう403エラーを返してくるので諦め, 代わりに「Webページの内容を取得」に切り替えました.
このアクションはページ自体のリッチテキストを返しますが, テキストとして扱うことでhtmlテキストとして扱えます.
今回は指定ワードで区切る手法を取っていたため, htmlタグの有無を追加で考えることなく修正前とほぼ同じやり方で使い回せたので助かりました.
何より今回のレシピは肝心の台風が来ないことにはレシピが正しく動くかどうかの確認すら取れず, また台風の変化に応じて変わる記述に対応して修正することもできません.
そのため現状でもまだ不備がある可能性があります.
気象庁と共に, 台風を評価する指標としてJTWCはとても便利です.
レシピ抜きにしても参考にしてください.