2023/12/16

つないでみよう:#6)お天気アイコンの取得

Web 系アプリ開発のど素人が、チャレンジする WebAPI 連携日記の第 6 回です。

前回に続いて気象庁の天気予報でお天気マークを表示する作業をすすめます。今回はお天気マークの画像を取得します。


アイコンファイル

天気予報 を開きアイコン画像の URL を確認します。例えば、晴れのアイコンの場合は次のようになっており、ファイル名がわかります。

https://www.jma.go.jp/bosai/forecast/img/100.svg

このファイル名は、前回 JSON より取得した天気コードマスタ内にありましたね。これら情報を利用して画像ファイルをダウンロードするプログラムを作成しましょう。


ところで、ファイル名には2種類あり、昼と夜のアイコンとなっています。例えば、411 の「雪後晴」の場合は、411.svg と 811.svg となっており、アイコンは次の通りとなっています。


アイコンファイルのダウンロード

ダウンロードしたアイコンファイルは、天気コードマスタ内に添付することとし、次のように添付用のリッチテキストを用意します。


HTTP でファイルをダウンロードするので、以前作成した関数を使用します。ファイルサイズが万一 64 KB を越えても動作するよう、LotusScript の NotesHTTPRequest クラスを使用しない方法を使います。詳しくは以下を参照してください。

HTTP でファイルをダウンロード(いにしえの呪文)


また、ダウンロードしたファイルを一時的に保存するため、Windows のテンポラリフォルダを利用します。フォルダ名の取得には、先日公開した関数を使用します。

Windows のテンポラリフォルダの取得


サンプルプログラム

天気コードマスタのアイコンを取得するためのエージェントを新規作成します。

まずはメインルーチンです。すべて天気コードマスタを取得するためのビュー  vWeather に接続し、1件ずつ順に取得して処理しています。1マスタにつき2つのアイコンを取得するので、サブ関数 xSetIconFile で処理させています。

Option Declare
Use "lsWindows"
Use "lsHttpDownload"

Sub Initialize
   Dim ns As New NotesSession
   Dim nuiw As New NotesUIWorkspace
   Dim nd As NotesDocument
   Dim ndb As NotesDatabase
   Dim nv As NotesView
   Dim i As Integer

   Set ndb = ns.CurrentDatabase
   Set nv = ndb.GetView("vWeather") '天気コードマスタ取得ビュー
   nv.AutoUpdate = False

   Set nd = nv.GetFirstDocument()
   While Not (nd Is Nothing)
      '昼のアイコン
      Call xSetIconFile(nd, "WeatherIcon_SVG", nd.WeatherFileName(0))
      '夜のアイコン
      Call xSetIconFile(nd, "WeatherIcon2_SVG", nd.WeatherFileName2(0))

      Call nd.Save(True, False)
      i = i + 1

      Set nd = nv.GetNextDocument(nd)
   Wend
   MsgBox CStr(i) & " マスタのファイルを取得しました。"

   'ビュー更新
   Call nuiw.ViewRefresh()
End Sub


アイコンファイルをマスタ文書に添付する処理は次の通りです。Use したライブラリ内の関数を使用して、ダウンロードしたファイルをテンポラリフォルダに保存しています。添付が完了したらファイルは削除しています。

Function xSetIconFile(vnd As NotesDocument, ByVal vsFld As String, ByVal vsFN As String)
   Dim sURL As String
   Dim sFP As String
   Dim nrti As NotesRichTextItem

   'アイコンのURL生成
   sURL = "https://www.jma.go.jp/bosai/forecast/img/" & vsFN

   'ファイルダウンロード
   sFP = GetWinTmpPath() & vsFN
   Call HttpDownload(sURL, sFP)

   'フィールドに添付
   Call vnd.RemoveItem(vsFld)
   Set nrti = vnd.CreateRichTextItem(vsFld)
   Call nrti.EmbedObject(EMBED_ATTACHMENT, "", sFP)

   'ダウンロードしたファイルは削除
   Kill sFP
End Function


実行結果

実行すると次のように各マスタ文書にアイコンファイルが添付されます。


アイコンをイメージリソースに登録

天気コードマスタは天気予報の種類を詳細に分類していますが、アイコン複数の天気コードで共通となっています。例えば、昼用にファイル名でカテゴライズしたビューを作成してみると複数の天気コードマスタに同じファイル名が割り当てられていることがわかります。

これで使用されているアイコンの種類がわかりますので、それぞれをイメージリソースに登録します。ノーツは現時点で SVG ファイルに対応していないので、インターネット上の変換サイトなどを利用して、PNG 形式に変換してからリソースに保存します。

本当であればこの処理も自動で行いたかったのですが、うまく変換できなかったので現時点では手作業としています。よい方法が見つかれば別途記事にしたいと思います。


前回 連載:つないでみよう 次回

0 件のコメント:

コメントを投稿